ios - 为 OpenGL ES/Cocos2d 优化纹理的方法

标签 ios opengl-es cocos2d-iphone textures

我得到了大约 30 个 PNG 32 位格式的纹理。所有纹理的大小都相同(比 iPad 屏幕宽)。大小不是正方形,宽度和高度都不是 2 的幂。相同的纹理旨在用于游戏的 iPhone 版本。

在游戏中,假定这些纹理用于动画(每个纹理都是动画的一帧)。当然,30 个纹理每个使用 4MB 的动画速度不是很快,内存消耗也远未达到可接受的水平。

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

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

最佳答案

第一个建议:改变设计。如果不是你的,必要时使用钝器。这很难正常工作。

您将不得不在制作动画时频繁加载和卸载纹理,以控制内存消耗。这将限制动画可实现的帧率。我怀疑它在 iPad 和第 4 代设备上最多只能达到 30-40 fps,在第 1 到第 3 代设备上可能慢得令人厌恶。

您可以做的最好的优化是不使用 Flash 导出的全屏纹理。基本上,Flash 所做的就是为您制作所有内容的动画,然后为每个动画帧输出全屏图像。 这是为移动设备制作任何动画的最糟糕的解决方案。

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

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

因为另一个很好的优化是尽量减少色位深度。如果您从 32 位变为 16 位(RGBA4444 或 RGBA5551 或 RGB565,具体取决于您需要哪种透明度),您已经将内存消耗减少了一半,并且渲染速度也有所提高。

如果可能,请使用其中一种 PVR 压缩格式,特别是对于始终移动的 Sprite ,因为移动的 Sprite 几乎不可能注意到降低的图像质量。

但是,由于您提到了渐变,因此这些渐变将受到颜色位深度减少的影响最大。如果是简单的渐变,你可以用 CCLayerGradient 替换渐变背景。以节省背景图片的内存。

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

总结:

  • 不要使用 Flash 导出的全屏纹理(非常糟糕的主意),至少尝试使用 cocos2d 的 Flash 时间轴动画导入器
  • 使用具有 cocos2d 功能的动画的单个图像
  • 使用纹理图集(和 Sprite 批处理)来减少内存消耗,提高速度
  • 尽可能减少颜色位深度,再次减少内存,提高速度
  • 对快速/始终移动的图像使用有损压缩格式 PVR 进行实验
  • 使用较小的图像并按比例放大

关于ios - 为 OpenGL ES/Cocos2d 优化纹理的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000865/

相关文章:

ios - 如何为导航 Controller 提供自定义 UIViewControllerAnimatedTransitioning 和使用默认 UIViewControllerInteractiveTransitioning

ios - 如何发送值为image、key为 'file'的图片文件

ios - 用于电子邮件问题的 NSPredicate predicateWithFormat

iphone - 视网膜显示屏图像质量问题

iphone - 打开WEPopover时EXC_BAD_ACCESS使glDrawArrays崩溃

objective-c - 如何在cocos2d中使用self.view?

cocos2d-iphone - Cocos2d 只显示 CCSprite 的一部分

ios - IB中的自定义UIView

iphone - 渲染大量点

ios - 改变 CCSprite 的亮度来模拟时间