我正在编写Android游戏,我似乎在绘制到Canvas时遇到了性能问题。我的游戏有多个级别,每个级别(显然)都有不同数量的对象。
奇怪的是,在一个包含45个图像的关卡中,运行完美(几乎60 fps)。然而,另一个包含81个图像的级别几乎没有运行(11 fps);它几乎无法播放。这对我以外的人来说有点奇怪吗?
我使用的所有图像都是.png,上述级别之间的唯一区别是图像数量。
这里发生了什么? Canvas不能在每个游戏循环中画出这么多图像吗?你们怎么建议我改善这种表现?
提前致谢。
答案 0 :(得分:3)
我也觉得很奇怪。我也开发了一个游戏,很多关卡,我可以在屏幕上轻松拥有100个游戏对象,没有看到类似的问题。
使用得当,drawbitmap应该非常快;它只不过是一个复制命令。我甚至不会在本地画圆圈;我有预渲染圆圈的位图。
然而,Android中Bitmaps的性能对您的操作方式非常敏感。创建位图可能非常昂贵,因为Android可以默认自动缩放CPU密集型的png。所有这些东西都需要在渲染循环之外完成一次。
我怀疑你在找错了地方。如果您以相同的方式创建和使用相同类型的图像,那么将屏幕图像数量加倍不应该将性能降低4倍以上。最多应该是线性的(因子为2)。
我的第一个怀疑是你的大部分CPU时间用于碰撞检测。与绘制位图不同,这通常作为交互对象数量的平方而上升,因为必须测试每个对象是否与其他所有对象进行碰撞。您将游戏对象的数量增加了一倍,但是您的性能下降到四分之一,即根据对象数量的平方。如果是这样的话,不要绝望;有一些做碰撞检测的方法,它们不会像对象数量的平方一样增长。
与此同时,我会做基本的测试。如果你实际上没有画出一半的物体,会发生什么?游戏运行得更快吗?如果没有,它与绘图无关。
答案 1 :(得分:1)
我认为this lecture会对您有所帮助。转到45分钟。有一个比较Canvas方法和OpenGl方法的图表。我认为这就是答案。
答案 2 :(得分:0)
我遇到了类似的性能问题 - 即1级跑得很好而2级没有
转而不是渲染是错误的(至少不是具体的)。这是导致瓶颈的级别逻辑特有的其他东西。
点是...... Traceview是你最好的朋友。
方法分析显示了CPU花费时间的原因以及为什么帧速率中出现故障。 (顺便提一下,渲染成本在第2级也更高,但不是瓶颈)