一身转战三千里,一剑曾百万师。这篇文章主要讲述Android游戏:Canvas还是OpenGL?相关的知识,希望能为你提供帮助。
我要为android编写游戏,我必须在Canvas或OpenGL之间进行选择以进行绘制。我已经读过Canvas没有很好的帧速率,但有什么好处?想象一下,你打算写一个愤怒的小鸟类游戏,Canvas帧速率是否足够?
答案我最初使用Canvas编写游戏但由于以下原因需要切换到OpenGL:
- 使用Canvas,你的精灵存储在堆上(除非你专门将它们缓存到磁盘上),这限制了精灵资产的总大小,具体取决于手机 - 不好!我在手机上发现这个大约是42mb- 请注意这是未压缩的位图大小。如果您有多种类型的实体,每种实体都有不同的动画,那么您可以非常快速地达到此大小。
- OpenGL将您的精灵资源分别存储到堆中,这大大增加了可用内存。
- 画布不能很好地扩展。您调用的.draw(...)调用越多,运行速度就越慢。这种关系是相当线性的。
- 使用OpenGL,您可以将绘制调用一起批处理以提高性能。
为了让事情变得更容易,我已经编写了一些有用的实用程序类,可以为您完成所有实用的OpenGL。它们允许您进行类似于使用Canvas时的简单.draw(..)调用。以下视频教程应该可以帮助您入门:
http://www.youtube.com/watch?v=xc93rN2CGNw
编辑:03/04/13
似乎随着更新的Android设备和操作系统问世,Google已经提升了Canvas的性能。我在上面描述的实用程序类的用户在做了一些基准测试后回复了我的以下电子邮件:
【Android游戏(Canvas还是OpenGL())】每帧在画布上的随机位置绘制500个精灵。现在,在我对这个用户的回复中,我解释说这可能与我编写实用程序类SpriteBatcher的方式效率低下有关。然而,根据我自己使用Canvas回来运行Froyo 2.2的HTC Desire的经验,我可以说它对于精灵来说绝对是更慢的精灵!
以下是结果:华为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
在以后的操作系统和设备上,它可能已经超过效率,但我原始响应中的一些点仍然有效。例如,绕过命中OutOfMemoryException而不必诉诸于将光盘缓存到光盘上等。
如果我了解更多,我会继续更新此答案。
另一答案这一切都取决于您需要实施的游戏类型。
考虑到你要求画布实现,我猜你指的是纯粹的2D精灵游戏。
如果精灵数量不多并且数量非常少,事实是你可能想要注意到一个很大的不同(考虑到许多基本2D图形的游戏使用画布)。
如果性能很重要或者您拥有非常多的精灵,那么实现基于OpenGL的系统是值得的。
考虑到使用OpenGL,您将受益于GPU专用硬件,这样您的CPU就可以减轻图形渲染的负担。
此外,与使用混合,光照,后期处理效果的画布实现相比,您将获得更多灵活性。你能做什么真的没有限制。
一个简单的例子是使用诸如OpenGL之类的3D引擎的旋转和缩放非常便宜并且提供了优异的结果。
必须真正采用Canvas进行简单的实现。
附:如果您选择OpenGL ES 2.0和可编程管道,那么您实现的目标(发光,模糊和数千种不同选项)实际上没有限制。在这种情况下,极限真的是我们的幻想。
:)
另一答案如果你打算做这么大的比赛,你一定要考虑使用AndEngine:http://www.andengine.org/
如果使用得当,这是一个很好的帮助。可悲的是,代码中没有文档。但该网站上的论坛非常好。即便如此,关于AndEngine的问题也越来越多。幸运的是,有很多很好的例子可以帮助你入门。
AndEngine使用OpenGL- 所以你不必在画布上画画时可能会出现低帧率。
查看示例App:https://market.android.com/details?id=org.anddev.andengine.examples
推荐阅读
- 如何在Android应用程序中启用TLS 1.2支持(在Android 4.1 JB上运行)
- “画布(Android Studio中试图绘制太大的位图”问题)
- 使用Google Apps脚本搜索无结果
- 试图将Google Pay集成到我的Android应用中
- 身份验证Apollo Graphql for android
- [android 8.0中的android套接字连接
- java.lang.IllegalStateException(找不到方法-初学者的Android编程书ERROR [duplicate])
- Android-如何在ActionBar中实现“赞”按钮
- 如何在Unity中使用由android studio制作的SQLite数据库()