Android Canvas.drawBitmap性能差 - 转换到OpenGL?

8
我正在将一款2D动作游戏(在XNA 4.0中开发)从Windows Phone 7移植到Android。我正在使用大量的Canvas.drawBitmap()调用,每个帧更新大约有200-300次,每次调用都会使用不同的Paint处理绘制时的透明度和着色。这用于管理粒子系统和各种叠加层以及游戏内效果,包括平铺背景和游戏内精灵。我不进行任何按需调整大小或旋转操作,只是简单的src->dest大小相同的矩形。

在WP7上,这可以运行30+fps,但我在我的测试设备(三星Galaxy S)上只能达到12fps。这导致游戏无法玩耍。通过对代码进行分析,我确认所有的时间都浪费在了Canvas.drawBitmap()上。

我似乎遵循了所有通常的性能建议 - 使用SurfaceView,注意GC,因此不会创建大量的可抛弃对象,并避免使用Drawables。

我是否正确地理解了Canvas.drawBitmap()是CPU绑定的,如果我想提高性能,我必须切换到使用GPU的OpenGL?我找不到任何官方说明,但根据一些评论的含义,我认为那可能是下一步...


1
你是如何绘制位图的?使用什么颜色格式?使用什么尺寸?在图形编程中,有许多需要遵守的事项,以便实现更快的速度。请发表一些代码。 - user703016
1
很好的问题。我在使用Canvas.drawBitmap()时也遇到了同样的问题,最终转移到了openGl中,但也许我错过了某个超级秘密的Canvas选项? - Gautier Hayoun
这个游戏有100多个类,成千上万行代码。我不确定我能够发布一个合理的摘录,它会特别有信息量。Rects的大小从16x6到128x128不等,全部都是ARGB_8888格式。 - Paul Harman
2个回答

7

这是正常的。当使用透明度(如 ARGB_8888)时,canvas 的速度惊人地慢。

有两个选择:

  • 切换到 OpenGL ES
  • 尽可能减少位图中的透明度(即尽量多使用 RGB_565)。

谢谢。在我去学习全新的图形堆栈之前,我只是想确认一下这个问题,以防我只是做了些傻事... - Paul Harman

1
也许在 Android 3+ 上运行会更好,因为它使用硬件加速来进行画布操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接