前段时间做过一个界面刷新的优化,遇到的坑比较多,在这里做一点点总结吧。
优化的方案是滚动滚动条的时候用截屏的方式代替界面全部刷新,优化完成后,界面在滚动时效率能提升大概一倍,背景介绍完毕。
用到最主要的是QT的截屏功能
window原生api会提供截屏滚动的功能。可以用这个ScrollWindowEx这个api。它会根据相应的参数在屏幕中进行滚动相应的区域。是不是很容易?但是结果却是不理想,因为用的是Qt,控件重写过PaintEvent的方法。调用api实时能看到效果,但是触发一次PaintEvent之后,界面又恢复原样了。看了Qt源码里后发现Qt内部画的时候是相当于画在后台一个对象里,然后在刷新的时候调用bitblt统一画,调用window的api并不会影响到后面的那个对象,后台刷新的代码在:qwindowsbackingstore.cpp中的flush方法(Qt5.1.1是这个名,但在Qt5.5.1里叫flushDP)。