请教下canvas的2d绘图性能优化的思路与clip剪切区域的问题
我想用一个surfaceview,通过实时的绘制,来实现一个滚动平移显示图形的效果。就像浏览器通过滚动条下拉来显示一整张网页一样。
我是想实时绘图,每次响应OnTouch事件,计算偏移坐标,重新刷屏。
由于考虑绘图逻辑有点小复杂,所以绘图代码是一次性绘制整个图形的,用浏览器来形容就是我一次性绘制了整个网页。但是绘制整个内容就会相当慢。
我绘图时,先锁定Canvas后,会使用Canvas.ClipRect(),把当前屏幕大小的矩形设定为剪切区域,但是没有达到我预想的效果。
我以前做桌面程序时,C#用gdi+绘图时,设定了Clip剪切区域后,那么系统会自动分析绘图代码,把剪切区域外的绘图操作拦截下来,不会发送到图形卡去。这样的话,实际上绘图压力并没有那么大,实际上只执行了剪切区域内的绘图工作。
但是android上这么设定绘图区域,我测试发现虽然设定了剪切区域,然后再调用canvas去绘制整个区域的绘图,系统并没有能够把剪切区域外的工作省略掉,而是做完了所有的绘图工作,仅仅让剪切区域外的图形不显示出去而已。这样的话,我这么做,性能就不仅仅是一个差字了。
但是如果要是从绘图逻辑上来考虑仅仅绘制剪切区域内的图形的话,绘图逻辑就会变得很复杂。
请问
1.可有什么办法能够让系统不执行剪切区域之外的绘图工作?有什么办法来优化这个绘图操作?
2.像浏览器展示网页,ListView通过滚动展示很多列表项,这些的实现原理是什么?
森之猎人与弓
9 years, 5 months ago