Android SurfaceHolder.lockCanvas()对我的游戏应用程序来说花费的时间太长

Android SurfaceHolder.lockCanvas()对我的游戏应用程序来说花费的时间太长,android,canvas,surfaceholder,Android,Canvas,Surfaceholder,我正在开发一款android游戏,我正在使用SurfaceView。我有一个每16ms调用一次的方法(我想要60fps) 当我运行我的应用程序时,LogCat的输出为: total time:30 total time:23 total time:6 total time:39 total time:17 为什么画布的锁定/解锁需要太多时间?有没有更好的办法来解决我的问题?(即,拥有一个每秒60帧的应用程序) 谢谢 我在三星Intercept上也遇到了类似的FPS问题,FPS较低。我当时只有1

我正在开发一款android游戏,我正在使用SurfaceView。我有一个每16ms调用一次的方法(我想要60fps)

当我运行我的应用程序时,LogCat的输出为:

total time:30
total time:23
total time:6
total time:39
total time:17
为什么画布的锁定/解锁需要太多时间?有没有更好的办法来解决我的问题?(即,拥有一个每秒60帧的应用程序)


谢谢

我在三星Intercept上也遇到了类似的FPS问题,FPS较低。我当时只有12帧,只有一个空白屏幕。我发现这个问题与Android在画布上进行自动缩放和绘图功能有关。 在
AndroidManifest.xml
中,如果添加行

这样Android就不会自动缩放画布和绘图功能。默认值为“
false
”,它将启用自动缩放。 使用android:anyDensity=“true”我可以获得40多帧的帧速! 所有这些的缺点是,你现在必须自己做所有的计算,以匹配不同的屏幕大小。但这并不难。
希望这能帮助任何有类似问题的人。我花了5个多小时才找出这个小毛病。

据我所知,lockCanvas()可能非常昂贵,这取决于底层硬件实现

目标是为您提供一个可以直接访问的缓冲区。该缓冲区可以直接存在于图形硬件中,也可以是OpenGL纹理或其他东西

现在,如果调用lockCanvas(),系统必须为该数据提供缓冲区,这可能涉及从GPU到内存的数据传输以及图像格式转换(例如yuv到rgb)

一旦完成数据缓冲区的编辑,操作必须以另一种方式进行,返回到原始的硬件相关格式

所有这些都可能非常昂贵,尤其是在移动设备上:(

避免这种情况的一个好方法是使用API函数(drawRect()而不是copyRect())修改数据,但这并不总是可能的

total time:30
total time:23
total time:6
total time:39
total time:17