蜂窝之前的硬件加速

问题描述:

我正在玩Android API,以期开发2D游戏的长期前景。通常,我只能使用Canvas来绘制精灵作为我的游戏图形。我希望能够为视觉效果执行大量绘图,但似乎Honeycomb(3.0,API级别11)don't support hardware acceleration之前的Android版本。蜂窝之前的硬件加速

我不确定那是什么意思。我无法让自己相信绘图是由CPU完成的,逐像素!!!如果我最终会产生像发光,镜头效果等效果......我会在每个像素上画几次。我是否有理由相信典型的智能手机CPU将无法以30 FPS的速度应对?

我并不奢求Android版本> = 3.0,因为它们的constitute 8%已经不是这么大的Android市场。我应该花时间去参加OpenGL吗(我是OpenGL的初学者)?如果我这样做了,你认为我可以通过使用Canvas来覆盖自定义android视图顶部的效果来重绘GLSurfaceView来获取任何内容,否则就可以进行绘制。或者是因为任何原因混合这两者的坏主意?

+0

根据*的说法,3.0版本(Honeycomb)到4.4(KitKat)的版本更像是已安装版本的75%。 http://en.wikipedia.org/wiki/File:Android_historical_version_distribution_-_vector.svg – mlepage 2014-02-03 16:40:51

哦,上帝是的。特别是如果你的目标是Android 3以前的设备,从SurfaceView(使用Canvas.drawXxx()调用)到OpenGlSurface的效果很好。您不仅每秒钟有更快的帧(更新),而且内存消耗更好。

下面是一些我已经注意到了几点:

  • 如果你想要做的(多)精灵动画,以加载OpenGL纹理并显示在一个OpenGL四路图像做他们给你很多更多的内存空间。这是因为虽然普通的Bitmap对象被Android进程内存限制(这类似于16-48 Mb,取决于设备和Android版本)限制,但在这些图像之外创建OpenGL纹理(并在之后清除内存)没有这个限制。你只受限于设备上的总内存,这是很多的16-48兆。

其次,但仍然与此有关,使用Android 2和以下版本跟踪Bitmap实例需要多少内存是非常复杂的,因为这些实例不会针对Java堆内存进行报告。它们被分配在其他一些内存空间中。总之,如果你使用OpenGL,另一个麻烦就少了。

  • 简单的动画如旋转图像变得轻而易举与OpenGL。您只需制作一个四边形,然后以任何您想要的方式进行旋转。与Sprite动画等效是为了顺序显示图像的不同(旋转版本)。这对内存消耗和速度更好。

  • 如果你在做类似2D的游戏,使用OpenGL的正交投影不仅可以简化许多常规OpenGL透视投影的麻烦(无用,在这种情况下),但它实际上可以减轻在需要缩放所有图形元素时,您会使用普通SurfaceView获得的许多问题,以便在不同的屏幕分辨率/比例下看起来相同。使用OpenGL的正投影可以有效地创建所需的宽度和高度的固定区域,然后让OpenGL自动将其投影到设备屏幕区域。

  • 不言而喻,制作诸如脉动光线等影响某些图形元素的简单效果,与使用OpenGL(在这种情况下,您只是使灯光发出脉冲,并且所有内容都相应点亮)相比,更容易做到用SurfaceView模拟这个并在精灵中烘焙。

我已经用SurfaceView和Canvas开始了一个小型的asteriod防御类游戏,然后为了上述原因而快速切换到OpenGL。长话短说,游戏现在看起来更好,虽然它最初运行在三星TEOS上的16个UPS和Optimus LG 2x上的30个UPS上,现在运行在Teos上的33个UPS和LG 2x上的约80个UPS上。

+0

您是否建议将GLSurfaceView与其他非GL表面混合使用,比如按钮等常用元素。如果唯一的开销是这样,我可以忍受CPU在屏幕上逐个像素复制20x20按钮图像。这是否还有其他重大的开销? – enobayram 2012-03-06 16:16:09

+0

不是不是真的可以通过GLSurfaceView添加标准Android窗口小部件。我试图避免在我的比赛中,但这是可能的,没有速度显着的速度惩罚。无论如何,我建议你做的第一件事情就是让你获得GLSurface的运行,就是在角落里展示UPS,这样当你刚刚做了一件让事情放缓的事情时,你就会快速知道。 – 2012-03-06 18:28:37