ios – 用于优化OpenGL ES / Cocos2d纹理的配方

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

在游戏中,假设这些纹理用于动画(每个纹理是动画的帧).当然,每个使用4MB的30个纹理对动画的速度不是很快,并且内存消耗远不能接近可接受的水平.

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

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

解决方法

第一条建议:改变设计.如果不属于您,请在必要时使用钝力.这很难合理地运作.

您必须经常加载和卸载纹理,同时设置动画以保持内存消耗.这将限制动画的可实现帧率.我怀疑它在iPad和第4代设备上最多只能是30-40 fps,在第1代到第3代设备上可能会非常慢.

您可以做的最佳优化是不使用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导出的全屏纹理(真的很糟糕),至少尝试使用cocos2d的Flash时间轴动画导入器>使用cocos2d功能动画的单个图像>使用纹理图集(和精灵批处理)来减少内存消耗,提高速度>尽可能减少颜色位深度,再次减少内存速度>使用有损压缩格式PVR实现快速/始终运动的图像>使用较小的图像并进行缩放

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...