Android 表面视图绘制性能

Android 表面视图绘制性能,android,surfaceview,2d-games,Android,Surfaceview,2d Games,我正在使用Android SurfaceView编写一个测试应用程序。我想看看它是否是2D游戏开发的可行方法。目前表现不太好 似乎每15秒左右就会有轻微的抖动和减速。我在屏幕上只画了大约30个矩形。我希望它能够轻松做到这一点 我决定介绍一下我的表现。我记录平均每10帧的绘制时间。我所注意到的是,它经历了一个抽签时间很好的时期,然后它跳了起来。我确信我的代码没有在游戏循环中分配内存,所以我认为这个问题不是GC 我注意到性能下降了大约100帧,写在一个相当模糊的日志语句之后。有人知道android正

我正在使用Android SurfaceView编写一个测试应用程序。我想看看它是否是2D游戏开发的可行方法。目前表现不太好

似乎每15秒左右就会有轻微的抖动和减速。我在屏幕上只画了大约30个矩形。我希望它能够轻松做到这一点

我决定介绍一下我的表现。我记录平均每10帧的绘制时间。我所注意到的是,它经历了一个抽签时间很好的时期,然后它跳了起来。我确信我的代码没有在游戏循环中分配内存,所以我认为这个问题不是GC

我注意到性能下降了大约100帧,写在一个相当模糊的日志语句之后。有人知道android正在打印的东西会发生什么吗

每次我启动应用程序时,在关于删除文件的日志语句之后,绘图时间会下降

01-18 16:53:20.221 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=14 01-18 16:53:20.589 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 18 01-18 16:53:20.919 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=13 01-18 16:53:21.250 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 13 01-18 16:53:21.581 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=13 01-18 16:53:21.911 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 13 01-18 16:53:22.241 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=13 01-18 16:53:22.572 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 13 01-18 16:53:22.906 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=18 01-18 16:53:23.277 552-650/? D/TaskPersister﹕ removeObsoleteFile:删除文件=5725_task.xml 01-18 16:53:23.278 552-650/? D/TaskPersister﹕ 删除过时文件: 删除文件=5725_任务_缩略图.png 01-18 16:53:23.330 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 32 01-18 16:53:23.680 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=18 01-18 16:53:24.032 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 20 01-18 16:53:24.399 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=31 01-18 16:53:24.777 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 26 01-18 16:53:25.148 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=23 01-18 16:53:25.473 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 12 01-18 16:53:25.804 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘图时间=14 01-18 16:53:26.142 19296-19370/com.example.scott.I/game_屏幕﹕ 抽签时间= 14 01-18 16:53:26.467 19296-19370/com.example.scott.com I/game\u屏幕﹕ 绘制时间=14


SurfaceView包含两部分,曲面和视图。视图集成到所有其他UI元素中,并且可以使用标准组件分层。您可以创建一个画布并使用画布在其上绘制。在所有最新的设备上,这将利用硬件加速的优势,尽管已经实现

曲面是一个完全独立的层,在具有渲染视图元素的层的上方或下方合成。您可以使用软件、画布或使用OpenGL ES的GPU在其上绘制。GLSURFACHEVIEW是一个围绕SURFACHEVIEW的包装器,负责EGL设置和一些线程问题,但它没有什么特别之处。有关将GLE与普通SurfaceView和TextureView结合使用的示例,请参见,其中有一个方便的库,其中包含所有EGL内容

在曲面上的画布渲染不是硬件加速的。随着屏幕变大(像素级),渲染成本越来越高。Nexus4的CPU+总线速度与像素计数的比率相当好。在Nexus4上平滑的动画在Nexus10上会有点窒息。(尝试Grafika“多表面测试”,选择“反弹”,观察日志中的帧速率。)


为了获得良好的性能,并节省大量的工作,研究开源图形或游戏引擎可能是值得的。或者从一个现有的小项目开始,比如。

您如何使用SurfaceView?您是使用画布还是使用OpenGL ES进行渲染?您使用的是设备还是模拟器?(深层背景:)我正在Nexus4上运行程序。我认为SurfaceView不会公开OpenGL。这就是GLSURFACHEVIEW,它是一种完全不同的动物,如果可以的话,我想避免它。我注意到,当我将复杂性降低到非常低的水平时,仍然会有口吃。我的抽签时间平均约为1毫秒。但它仍然每隔几秒钟就有一点打嗝。是否有可能画布上的绘图调用正在进行分配并导致垃圾收集器被调用?如果不与屏幕交互,某些设备会减慢速度,从而放大CPU开销;见例。有了正确的游戏循环结构,它们通常不会引人注目。请记住,您的游戏远不是设备上唯一运行的东西。您可以使用
systrace
查看运行时的确切内容(例如)。GC事件在日志文件中被调用(至少在Dalvik中是这样;不确定Art)。画布渲染不应导致许多alloc。