请教下canvas的2d绘图性能优化的思路

时间:2022-04-18 22:18:03
我想用一个surfaceview,通过实时的绘制,来实现一个滚动平移显示图形的效果。就像浏览器通过滚动条下拉来显示一整张网页一样。

我是想实时绘图,每次响应OnTouch事件,计算偏移坐标,重新刷屏。

由于考虑绘图逻辑有点小复杂,所以绘图代码是一次性绘制整个图形的,用浏览器来形容就是我一次性绘制了整个网页。但是绘制整个内容就会相当慢。
我绘图时,先锁定Canvas后,会使用Canvas.ClipRect(),把当前屏幕大小的矩形设定为剪切区域,但是没有达到我预想的效果。

我以前做桌面程序时,C#用gdi+绘图时,设定了Clip剪切区域后,那么系统会自动分析绘图代码,把剪切区域外的绘图操作拦截下来,不会发送到图形卡去。这样的话,实际上绘图压力并没有那么大,实际上只执行了剪切区域内的绘图工作。

但是android上这么设定绘图区域,我测试发现虽然设定了剪切区域,然后再调用canvas去绘制整个区域的绘图,系统并没有能够把剪切区域外的工作省略掉,而是做完了所有的绘图工作,仅仅让剪切区域外的图形不显示出去而已。这样的话,我这么做,性能就不仅仅是一个差字了。

但是如果要是从绘图逻辑上来考虑仅仅绘制剪切区域内的图形的话,绘图逻辑就会变得很复杂。

请问
1.可有什么办法能够让系统不执行剪切区域之外的绘图工作?有什么办法来优化这个绘图操作?
2.像浏览器展示网页,ListView通过滚动展示很多列表项,这些的实现原理是什么?

3 个解决方案

#1


我后来又仔细测试了下

剪切区域倒是起作用的,处理速度可能确实比绘制全部内容要快一点吧,只是处理依然慢,没能达到预期。

#2


http://tech.uc.cn/?p=2414

#3


引用 2 楼 nj_dobetter 的回复:
http://tech.uc.cn/?p=2414


这篇文章是讲浏览器渲染的,html5中canvas渲染的吧。

我是考虑android本地应用中的2d绘图的性能问题呢

#1


我后来又仔细测试了下

剪切区域倒是起作用的,处理速度可能确实比绘制全部内容要快一点吧,只是处理依然慢,没能达到预期。

#2


http://tech.uc.cn/?p=2414

#3


引用 2 楼 nj_dobetter 的回复:
http://tech.uc.cn/?p=2414


这篇文章是讲浏览器渲染的,html5中canvas渲染的吧。

我是考虑android本地应用中的2d绘图的性能问题呢