安卓游戏: Canvas or OpenGL?

标签 android opengl-es canvas frame-rate

我要为 Android 编写游戏,我必须在 Canvas 或 OpenGL 之间进行选择进行绘图。我读过 Canvas 没有很好的帧速率,但有什么好的呢?想象一下你要写一个愤怒的小鸟类型的游戏,Canvas 帧率够吗?

最佳答案

我最初使用 Canvas 编写游戏,但由于以下原因需要切换到 OpenGL:

  • 使用 Canvas,您的 sprite 存储在堆中(除非您专门将它们缓存到磁盘上),这限制了您的 sprite Assets 的总大小,具体取决于手机 - 不好!我发现这在我的手机上大约是 42mb - 注意这是未压缩的位图大小。如果您有多种类型的实体,每种都有不同的动画,那么您可以很快达到这个大小。

  • OpenGL 将您的 Sprite 资源单独存储到堆中,从而显着增加可用内存。

  • Canvas 不能很好地缩放。您进行的 .draw(...) 调用越多,运行速度就越慢。这种关系是相当线性的。

  • 使用 OpenGL,您可以将绘图调用批量处理以提高性能。

从 OpenGL 开始可能会令人生畏,这使得 Canvas 看起来很有吸引力。但是根据经验,我希望我刚刚开始使用 OpenGL。如果您正在制作游戏,我的建议是“咬紧牙关”并使用 OpenGL。

为了让事情更容易上手,我编写了一些有用的实用程序类,它们可以为您完成所有细节的 OpenGL。它们允许您进行类似于使用 Canvas 时的简单 .draw(..) 调用。以下视频教程应该可以帮助您入门:

http://www.youtube.com/watch?v=xc93rN2CGNw

编辑:03/04/13

随着更新的 Android 设备和操作系统的推出,Google 似乎提高了 Canvas 的性能。我上面描述的实用程序类的用户在进行了一些基准测试后给我回复了以下电子邮件:

Drawing 500 sprites at random positions across canvas each frame.

Here are the results: Huawei Honor (Gingerbread, single core 1.4 Ghz): SpriteBatcher: 19-20 FPS, Canvas: 23-24 FPS

Nexus 7 (JellyBean, 4 cores 1.3 Ghz): SpriteBatcher: 29-30 FPS, Canvas: 57-58 FPS

现在,在给该用户的回复中,我解释说这可能与我编写实用程序类 SpriteBatcher 的方式效率低下有关。然而,根据我自己在运行 Froyo 2.2 的 HTC Desire 上使用 Canvas 的经验,我可以说它绝对是 Sprite 的速度较慢!

在后来的操作系统和设备上,它可能已经超越了效率,但我最初回复中的一些观点仍然有效。例如,在遇到 OutOfMemoryException 时无需求助于将纹理缓存到磁盘等。

如果我了解更多,我会继续更新这个答案。

关于安卓游戏: Canvas or OpenGL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8788675/

相关文章:

java - rxjava2 observable.just(a Boolean) 不是

Android Azure SDK - 当我尝试从 Blob 存储加载内容时出现 NullPointerException

android - Android WebView 中的触摸事件

iphone - 如何在多纹理对象之后绘制具有漫反射纹理的对象

opengl-es - 无法在 OpenGL 中的 2D(正交)之上绘制 3D(视锥体)

javascript - 如何在 Web 应用程序中添加函数的文本调用?

java - 在 Android 中将图像添加到 2d 游戏?

android - 在AOSP源代码中添加系统应用程序(通过App源代码/工作AS项目)

android - 无法在 Android OpenGL ES 2.0 中绘制点

javascript - 使用 Planetary.js 将图像放置在某个位置