我要为Android编写一个游戏,需要选择Canvas或OpenGL进行绘制。我了解到Canvas的帧率不够好,但是什么样的帧率算好呢?如果你要编写像愤怒的小鸟这样的游戏,Canvas的帧率是否足够?
我要为Android编写一个游戏,需要选择Canvas或OpenGL进行绘制。我了解到Canvas的帧率不够好,但是什么样的帧率算好呢?如果你要编写像愤怒的小鸟这样的游戏,Canvas的帧率是否足够?
我最初使用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而无需将纹理缓存到磁盘中等。
如果我获得更多信息,我将继续更新此答案。
如果你要做一个如此大的游戏,你应该考虑使用AndEngine:http://www.andengine.org/
如果使用得当,它是一个很好的帮助。可惜代码中没有文档。但是网站上的论坛还不错。甚至在SO上也出现了越来越多关于AndEngine的问题。幸运的是,有一堆好的例子可以让你开始。
AndEngine使用OpenGL——所以你不必在画布上绘制时瞎搞可能会导致低帧率。
查看示例应用程序:https://market.android.com/details?id=org.anddev.andengine.examples