2012-01-25 52 views
3

我给出了大约30个PNG 32位格式的纹理。所有纹理大小相同(比iPad屏幕宽)。大小不是正方形,宽度和高度都不是2的幂。相同的纹理用于iPhone版本的游戏。优化OpenGL ES/Cocos2d纹理的食谱

在游戏中,假定这些纹理用于动画(每个纹理都是动画的一个框架)。当然,每个使用4MB的30个纹理对于动画制作来说并不是非常快,内存消耗远不能接近可接受的水平。

因此,作为OpenGL ES和Cocos2d的新手,我正在寻找食谱如何优化这些特定纹理和纹理,一般来说

有关我应该处理的纹理的其他信息:所有纹理具有相同的渐变背景(海洋表面)和不同的区域(波浪)。每个波都有点独特,波几乎占据了所有的纹理。纹理从Flash导出(最初是矢量图)。

回答

6

第一条建议:改变设计。如果不是你的,必要时使用钝力。这很难很好地工作。

您将不得不经常加载和卸载纹理,同时动画检查内存消耗。这将限制动画的可实现的帧率。我猜想在iPad和第四代设备上它最多只能达到30-40fps,可能会在第一代到第三代设备上放缓。

您可以做的最佳优化是不使用Flash导出的全屏纹理。基本上Flash所做的是为你制作一切动画,然后为每个动画帧输出一个全屏图像。 这是为移动设备设置动画效果最差的解决方案。

取而代之的是,使用单独的图像和cocos2d动作重新创建cocos2d中的所有动画以组成相同的动画或足够接近的动画。这是更多的编码工作,但它会表现得更好。可能有像LevelHelper这样的工具可以帮助您,但我不确定他们是否可以向您展示动画的实时预览。还有一个tool that can import Flash timeline animations,但我不能说它有多好,或者它是否工作。

使用Texture Packer可以从各个图像创建纹理图集,以节省内存并加速渲染速度,尤其是与CCSpriteBatchNode结合使用。 Plus Texture Packer允许您使用各种纹理格式进行试验,如果您想支持非Retina设备,它将导出SD分辨率图像。

因为另一个好的优化是尽可能地减少颜色位深度。如果你从32位到16位(RGBA4444或RGBA5551或RGB565,取决于你需要什么样的透明度),你已经将内存消耗减少了一半,渲染速度也提高了一些。

如果可能,请使用PVR压缩格式之一,特别是对于总是移动的精灵来说,因为降级的图像质量几乎不可能注意到移动的精灵。

但是,由于您提到了渐变效果,那么受缩小的颜色位深度影响最大。如果是简单渐变,则可以用CCLayerGradient替换渐变背景以保存背景图像的内存。

最后,您可以使用较小的图像并将其放大。特别是对于透明图像,缩放图像会使图像看起来模糊的事实实际上是有益的。

总结:

  • 不使用由Flash(非常糟糕的主意)出口全屏纹理,至少是尝试的Flash时间轴动画进口商对cocos2d的
  • 动画
  • 使用个人图像与cocos2d的功能
  • 使用纹理地图集(和sprite批处理)来减少内存消耗,提高速度
  • 尽可能减少颜色位深度,再次减少内存更多的速度
  • 实验的有损压缩格式PVR快速/总运动图像
  • 使用更小的图像,并加以推广
+0

谢谢你的宝贵意见。以上所有都很有意义。目前,我决定放弃导出的纹理,并尝试优化动画部分的大小和位深度。 – Bobrovsky

6

1)使用PVR纹理,而不是PNG格式。 PVR提供了一系列格式和质量,所有这些格式和质量的加载速度都比PNG快,并且压缩的变体也使用更少的内存。

2)如果可能的话,将您的动画帧合并到一个精灵表中,这样会更高效。科科斯已经内置了对精灵图纸的支持(它称之为纹理图集)。尽管由于地图集的最大尺寸为1024x1024,这对全屏框架不起作用。

3)为了让您的生活更轻松,请使用sprite sheet生成工具,该工具可以自动创建sprite工作表并将您的纹理转换为PVR。 TexturePackerZwoptex都是不错的选择。

LearnCocos2D关于将动画重构为单独片段的建议是一个好主意,如果可以的话。

如果由于时间或技术原因无法做到这一点,我已经编写了一个OpenGL PVR基于帧的视频播放器,它可以非常高效地播放一系列全屏图像,并将它们流式传输到内存中帧一次。它不使用Cocos2D,只是一个独立的UIView,所以当你的应用在加载Cocos director视图之前加载时,你可以在它自己的视图控制器中显示它。

你可以在这里得到:https://github.com/nicklockwood/GLView - 它包括文档和例子。要记住的主要原因是,在转换为PVR之前,您需要将图像帧的大小调整为两个方格的大小。但是不要担心,当你弹奏它们时,你总是可以将它们拉回到原来的比例,这样它就不会被注意到。

+0

谢谢你的回答和链接。不幸的是,我不能接受两个答案作为答案:-) – Bobrovsky