Android drawBitmap 对大量位图的性能?

标签 android performance bitmap drawing

我正在编写一款 Android 游戏,我似乎遇到了在 Canvas 上绘图的性能问题。我的游戏有多个关卡,每个关卡中(显然)有不同数量的对象。

奇怪的是,在一个包含 45 张图像的关卡中,运行完美(几乎 60 fps)。然而,另一个包含 81 张图像的关卡几乎没有运行(11 fps);它几乎无法播放。除了我之外,其他人觉得这很奇怪吗?

我使用的所有图像都是 .png 格式,上述级别之间的唯一区别是图像的数量。

这是怎么回事? Canvas 可以不在每个游戏循环中绘制这么多图像吗?你们会如何建议我改进此性能?

提前致谢。

最佳答案

我也觉得奇怪。我也在开发一个游戏,很多关卡,我可以很容易地在屏幕上显示 100 个游戏对象,还没有看到类似的问题。

如果使用得当,drawbitmap确实应该很快;它只不过是一个复制命令。我什至不会画圆圈;我有预渲染圆圈的位图。

但是,Android 中位图的性能对您的操作方式非常敏感。创建位图可能非常昂贵,因为默认情况下 Android 可以自动缩放 png,这是 CPU 密集型的。所有这些都需要在渲染循环之外只完成一次。

我怀疑你找错地方了。如果您以相同的方式创建和使用相同类型的图像,那么将屏幕图像的数量加倍不应将性能降低 4 倍以上。最多应该是线性的(2 倍)。

我的第一个怀疑是您的大部分 CPU 时间都花在了碰撞检测上。与绘制位图不同,这通常随着交互对象数量的平方而增加,因为每个对象都必须测试是否与其他对象发生碰撞。您将游戏对象的数量增加了一倍,但您的性能下降到四分之一,即根据对象数量的平方。如果是这种情况,请不要绝望;有一些碰撞检测方法不会随着对象数量的平方增长。

与此同时,我会进行基本测试。如果您实际上不绘制一半的对象会怎样?游戏运行速度更快吗?如果不是,则与绘图无关。

关于Android drawBitmap 对大量位图的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981707/

相关文章:

android - 如何确保 AsyncTask 在我的 Activity 被终止之前完成?

android - 您可以从 HTTP url 方案打开 iOS 应用程序吗?

mysql - 如何使索引良好的 MySQL 表有效地连接

c++ - 读取大小不是 8 的倍数的位图会导致像素移位(和换行)

java - 列表上的空对象引用

android - 在 TextView 中使用制表符/制表符

c# - 如何用位图C#创建圆

scala - 如何用 Scala 绘制位图?

java - 正确使用 BitSet 来替换基于 int 的标志。是否可以?

asp.net - Windows Azure 中的 DNS 查找时间