安卓游戏:Canvas还是OpenGL?

22

我要为Android编写一个游戏,需要选择Canvas或OpenGL进行绘制。我了解到Canvas的帧率不够好,但是什么样的帧率算好呢?如果你要编写像愤怒的小鸟这样的游戏,Canvas的帧率是否足够?


2
你有没有在开发者网站上阅读过关于图形的文档?http://developer.android.com/guide/topics/graphics/index.html 我会选择OpenGL,但在Android 3.0及以上版本中,Canvas可以进行硬件加速,这将提高性能。 - RyanSullivan
5
如果你从这里http://code.google.com/p/apps-for-android/下载并构建安装精灵方法测试应用程序,它将使用不同的渲染方法进行基准测试。它有许多扩展功能可供调整开启和关闭,并观察效果。 - RyanSullivan
3个回答

49

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

  • 使用Canvas,你的精灵存储在堆上(除非你将它们明确地缓存到磁盘上),这会根据手机限制你的精灵资源总大小 - 不好!我发现在我的手机上大约是42mb - 注意这是位图的未压缩大小。如果你有几种不同动画的实体,则可以很快达到此大小。

  • OpenGL将您的精灵资产单独存储到堆之外,从而大大增加了可用内存。

  • Canvas的缩放效果不佳。您进行的越多 .draw(...) 调用,速度越慢。这种关系是相当线性的。

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

开始使用OpenGL可能会让人感到惊恐,从而使Canvas显得有吸引力。但是通过经验,如果您正在制作游戏,我希望我刚开始就使用OpenGL。我的建议是,如果您正在制作游戏,请“下定决心”并选择OpenGL。

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

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

编辑:03/04/13

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

每帧在画布上绘制500个随机位置的精灵。

以下是结果:Huawei Honor(姜饼,单核1.4 Ghz): SpriteBatcher: 19-20 FPS,Canvas: 23-24 FPS

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

现在,在我的回复中,我解释了这可能与我编写的实用程序类SpriteBatcher的低效有关。但是,从我自己在运行Froyo 2.2的HTC Desire上使用Canvas时的经验来看,可以肯定地说它每个精灵的速度都更慢!

在后来的操作系统和设备上,它可能已经超越了效率,但我原始响应中的一些要点仍然有效。例如,避免触发OutOfMemoryException而无需将纹理缓存到磁盘中等。

如果我获得更多信息,我将继续更新此答案。


我想强调第一点,即使用Canvas方法存储的位图会存储在堆上。这可能非常有限。除非你的游戏非常简单(像乒乓球或打砖块),只有少量精灵和没有动画精灵,否则你肯定需要更多的内存来存储它们。 - Attila Tanyi

4
这完全取决于您需要实现的游戏类型。 考虑到您正在请求一个画布实现,我猜您是在指一个纯2D精灵游戏。 如果精灵不多而且数量非常少,那么事实上您可能不会注意到很大的差异(考虑到许多基本2D图形的游戏都使用画布)。 如果性能很重要或者精灵数量非常高,则值得实施基于OpenGL的系统。 请考虑使用OpenGL,您将受益于GPU专用硬件,因此CPU将摆脱图形渲染的负担。 此外,您将从比使用混合,照明,后处理效果的画布实现更加灵活的优势中受益。你可以做的确实没有限制。 一个简单的例子是旋转和缩放,使用3D引擎(如OpenGL)非常便宜,并且提供出色的结果。 画布必须真正用于简单的实现。 附:如果您选择OpenGL ES 2.0和可编程管道,则可以实现真正的无限可能(发光,模糊和成千上万的不同选项)。在这种情况下,限制实际上是我们的想象。 :)

我以前有使用OpenGL工作过,你说得对,它没什么限制。谢谢你的回答。 - seipey

1

如果你要做一个如此大的游戏,你应该考虑使用AndEngine:http://www.andengine.org/

如果使用得当,它是一个很好的帮助。可惜代码中没有文档。但是网站上的论坛还不错。甚至在SO上也出现了越来越多关于AndEngine的问题。幸运的是,有一堆好的例子可以让你开始。

AndEngine使用OpenGL——所以你不必在画布上绘制时瞎搞可能会导致低帧率。

查看示例应用程序:https://market.android.com/details?id=org.anddev.andengine.examples


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