Bob*_*sky 3 textures opengl-es cocos2d-iphone ios
我得到了大约30种PNG 32bit格式的纹理.所有纹理大小相同(比iPad屏幕宽).大小不是正方形,宽度和高度都不是2的幂.相同的纹理意味着用于iPhone版本的游戏.
在游戏中,假设这些纹理用于动画(每个纹理是动画的帧).当然,每个使用4MB的30个纹理对动画的速度不是很快,并且内存消耗远不能接近可接受的水平.
因此,作为OpenGL ES和Cocos2d的新手,我正在寻找食谱如何优化这些特定的纹理和纹理.
关于我应该处理的纹理的其他信息:所有纹理具有相同的渐变背景(海面)和不同的区域(波浪).每一波都有些独特,波浪占据了几乎所有的纹理.纹理从Flash导出(它们最初是矢量图像).
第一条建议:改变设计.如果不属于您,请在必要时使用钝力.这很难合理地运作.
您必须经常加载和卸载纹理,同时设置动画以保持内存消耗.这将限制动画的可实现帧率.我怀疑它在iPad和第4代设备上最多只能是30-40 fps,在第1代到第3代设备上可能会非常慢.
您可以做的最佳优化是不使用Flash导出的全屏纹理.基本上Flash所做的就是为您设置动画,然后为每个动画帧输出全屏图像.这是为移动设备制作动画的最糟糕的解决方案.
相反,使用单个图像和cocos2d动作重新创建cocos2d中的所有动画以组成相同的动画或足够接近的动画.这是更多的编码工作,但它会表现得更好.可能有像LevelHelper这样的工具可以帮助你,但我不确定他们是否可以向你展示动画的实时预览.还有一个工具可以导入Flash时间轴动画,但我不能说它的工作情况如何,或者它是否正常工作.
使用Texture Packer从单个图像创建纹理图集以节省内存并加快渲染速度,特别是与CCSpriteBatchNode结合使用.Plus Texture Packer允许您尝试各种纹理格式,如果您想支持非Retina设备,它将导出SD分辨率图像.
因为另一个好的优化是尽可能地减少颜色位深度.如果从32位变为16位(RGBA4444或RGBA5551或RGB565,具体取决于您需要的透明度),您已经将内存消耗减少了一半,渲染速度也会提高一些.
如果可能的话,使用一种PVR压缩格式,特别是对于总是移动的精灵,因为移动的精灵几乎不可能注意到降低的图像质量.
但是,由于您提到渐变,因此减少颜色位深度会影响最大.如果它是一个简单的渐变,您可以用CCLayerGradient替换渐变背景以保存背景图像的内存.
最后,您可以使用较小的图像并进行缩放.特别是对于透明图像,向上缩放图像使其看起来模糊的事实实际上是有益的.
总结一下:
1)使用PVR纹理而不是PNG.PVR提供了一系列格式和质量,所有这些格式和质量的加载速度都比PNG快,而压缩的变体也会占用更少的内存.
2)如果可能,将动画帧组合成单个精灵表,这样效率更高.Cocos内置了对sprite表的支持(称之为Texture Atlases).这不适用于全屏帧,但因为地图集的最大大小约为1024x1024.
3)为了让您的生活更轻松,请使用精灵表生成工具,该工具可以自动创建精灵表并将纹理转换为PVR.TexturePacker和Zwoptex都是不错的选择.
如果可以的话,LearnCocos2D关于将动画重构为单独部分的建议是个好主意.
如果由于时间或技术原因你不能这样做,我写了一个基于OpenGL PVR帧的视频播放器,可以通过一次一帧地将它们流入内存来非常有效地播放一系列全屏图像.它不使用Cocos2D并且只是一个独立的UIView,因此当您的应用程序在加载Cocos Director视图之前加载时,您可以在它自己的视图控制器中显示它.
你可以在这里得到它:https://github.com/nicklockwood/GLView - 它包括文档和示例.要记住的主要事情是,在转换为PVR之前,您需要将图像帧的大小调整为两个方格.但是不要担心,当你弹奏它们时,你总是可以将它们拉回到它们原来的比例,这样就不会有明显的意义了.