2012-01-09 86 views
18

我要为android编写游戏,我必须在canvas或opengl之间进行绘图选择。我已经读过,画布没有很好的帧率,但什么好?想象一下,你会写一个愤怒的小鸟游戏,画布帧率会不够?安卓游戏,画布或opengl?

+2

您是否阅读过开发人员网站上的图形文档? http://developer.android.com/guide/topics/graphics/index.html我会去与opengl,但在Android 3.0及以上画布可以硬件加速,这将提高性能 – RyanSullivan 2012-01-09 12:55:39

+5

如果您下载的精灵方法测试应用程序从这里http://code.google.com/p/apps-for-android/构建和安装,它使用不同的渲染方法执行基准测试。有负载的扩展,你可以调整和关闭,并看到效果 – RyanSullivan 2012-01-09 12:58:38

回答

1

如果您打算做这么大的游戏,你一定要考虑使用AndEngine:http://www.andengine.org/

如果使用正确,这是一个很大的帮助。遗憾的是代码中没有文档。但网站上的论坛相当好。甚至在这里关于AndEngine的问题也越来越多。幸运的是,有很多很好的例子可以帮助你入门。

AndEngine使用OpenGL--因此您不必在画布上绘制可能的低帧速率。

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

+0

谢谢。我会看看 – seipey 2012-01-09 14:10:46

3

这一切都取决于游戏中你需要实现的类型。

考虑到你要求的是一个画布实现,我想你是指的是一个纯2D的精灵游戏。

如果精灵数量并不多且数量很低,事实是,您可能希望注意到很大的差异(考虑到许多基本的2D图形使用画布)。

如果性能很重要,或者你有很多精灵,那么实现基于OpenGL的系统是值得的。

考虑到使用OpenGL,您将受益于GPU专用硬件,这样您的CPU将会免除图形渲染的负担。

此外,与使用混合,照明和后期处理效果的画布实现相比,您将获得更多的灵活性。你可以做什么真的没有限制。

一个简单的例子是使用OpenGL等3D引擎的旋转和缩放非常便宜,并且提供了极好的结果。

画布必须真正采用简单的实现。

P.S.如果你使用OpenGL ES 2.0和可编程流水线,你实际上没有限制(发光,模糊和数千种不同的选项)。在这种情况下,限制实际上是我们的幻想。

:)

+0

我以前和opengl一起工作过,你是对的,它没有任何限制。感谢您的回答。 – seipey 2012-01-09 14:15:54

45

我最初使用Canvas但随后需要切换到OpenGL,原因如下写道:我的游戏:

  • 使用画布,你的精灵是,除非你专门存储在堆(将它们缓存到磁盘中),这会根据手机对精灵资产的总大小进行限制 - 不太好!我发现这是我的手机大约42mb - 注意这是未压缩的位图大小。如果您有多种类型的实体,每种都有不同的动画,那么您可以非常快地达到这个尺寸。

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

  • 画布不很好。您拨打的电话越多,调用的速度就越慢。这种关系是相当线性的。

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

从OpenGL开始,这让Canvas看起来很吸引人,但是,从经验,我希望我刚刚开始使用OpenGL。如果您正在制作游戏,我的建议是“咬紧牙关”,并使用OpenGL。

为了让事情变得更容易上手,我写了一些有用的工具类,为您完成所有基本的OpenGL。它们允许您进行简单的.draw(..)调用,与使用Canvas时类似。下面的视频教程应该让你开始:

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

编辑:13年3月4日

看来,作为较新的Android设备和操作系统的问世谷歌增加了Canvas的性能。上面描述的实用工具类的用户在做了一些基准测试后找到了以下电子邮件:

在每个画布的每个画布上随机抽取500个小精灵。

下面是结果:华为Honor(姜饼,单核1.4千兆赫): SpriteBatcher:19-20 FPS,画布:23-24 FPS

的Nexus 7(杰利贝恩,4个核1.3千兆赫):SpriteBatcher :29-30 FPS, 帆布:57-58 FPS现在

,我刚才在回答这个用户我解释说,这可能是在我写的实用工具类SpriteBatcher方式效率低下的事情。然而,根据我自己的经验,使用运行Froyo 2.2的HTC Desire,Canvas可以说它对于精灵来说绝对是较慢的精灵!

在后来的操作系统和设备上,它可能已经超越了效率,但我原始响应中的某些点仍然有效。例如,绕过击中OutOfMemoryException而不必诉诸缓存纹理到光盘等。

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

+0

我想强调第一点,Bitmaps使用Canvas方法存储在堆上。这可能是非常有限的。除非你的游戏非常简单(如Pong或Breakout),只有少量精灵和没有动画精灵,你一定会想要为他们留下更多的记忆。 – 2017-12-23 14:00:06