我得到了大约 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/