SurfaceView如何处理屏幕元素?

时间:2013-01-08 11:16:58

标签: android android-canvas surfaceview

我问自己SurfaceView如何处理可见区域外的绘图。我做了一些在线研究,但找不到任何问或任何回答问题的人。所以我做了一些测试,我的测试设置如下:

我在SurfaceView上绘制了5000个圆圈,x轴偏移为-100,每1000个圆圈附加-100偏移。偏移量作为平移存储在Matrix中,并在使用Canvas.concat()进行绘制之前应用于画布。结果是SurfaceView上绘制了5000个圆圈,但最初它们都在可见区域之外,并且您在屏幕上看不到它们。我运行了我的测试应用程序,将翻译应用到Canvas,以便圆形堆栈一个接一个地出现,并测量每秒的帧数。所有更新和绘图都是使用一个尽可能多地循环的简单线程完成的。

测量结果如下:

  • 0个可见的圆圈 - > ~40 FPS
  • 1000个可见圆圈 - > ~30 FPS
  • 2000个可见的圆圈 - > ~20 FPS
  • 3000个可见的圆圈 - > ~15 FPS
  • 4000个可见圆圈 - > ~12 FPS
  • 5000个可见的圆圈 - > ~10 FPS

我需要提一下,这都是使用我自己的2D引擎完成的。没有任何元素,它以60 FPS运行。我认为第一个“缺失的”20 FPS可能是由我的渲染管道产生的,它遍历5000个元素。

是否有人对SurfaceViewCanvas有更多了解并可以解释这种行为?

提前致谢!

测试设置:Nexus 10,Android 4.2.1,min SDK:14,目标SDK:17

1 个答案:

答案 0 :(得分:1)

根据WarrenFaith发布的有关图形硬件的说明,我测量了绘制所有圆圈和绘图前检查之间的区别。事实证明绝对没有区别!为了确保我甚至将圈数增加到50000,两个测试都以大约4到5 FPS的速度运行,没有可见的圆圈。