我正在从JPG格式加载非常大的纹理,在iOS5之前我会使用Apple示例Texture2D类将RGBG65格式转换为RGB565格式,以将所需的内存空间减半。然后它将以RGB565格式上传到GPU w / glTexImage2D。
使用iOS5我正在转换调用以使用新的GLKTextureLoader。然而,即使JPG没有alpha通道,它似乎只使用RGB888,因此占用了GPU的两倍内存。
有没有办法让GLKTextureLoader在上传到GPU时使用RGB565?我现在正在使用[GLKTextureLoader textureWithContentsOfFile:jpgFile]。我还尝试了[GLKTextureLoader textureWithContentsOfData:data]并将其传递给原始RGB565位图的NSData,但是当我尝试时,我收到错误“{GLKTextureLoaderErrorKey =图像解码失败}”。
答案 0 :(得分:7)
“textureWithContentsOfData”似乎是一个破碎的方法(注意:文档缺少它 - 没有规范说它接受了什么)Apple尚未实现 - 它对我尝试的所有标准NSData输入都失败了。 / p>
然后我接受了这些并使用标准的gl *方法调用将它们直接传递给OpenGL,并且它们工作正常,因此bug存在于GLKit中。
我已经向Apple发送了支持请求,要求他们解释他们的方法,并记录它接受的内容。在那之前,我强烈建议你忽略GLTextureInfo类(这是一个不错的主意,但它是如此错误,它不值得 - 放弃这个课程给了我5倍的性能提升,立即!)
更新:Apple的回复(释义)“嗯。我们也不知道。请将其记录为错误”。
......并且:Apple在收到错误时的反应:“这不是一个错误,它是按照设计的,我们觉得不需要记录它。很明显它的作用”
(他们的“显而易见的”是:你必须发送PNG或JPG或PVR 仅 ...的数据(并且只有在特定硬件上运行时才允许PVR) )其他任何事情都会崩溃。)
他们的最终建议是:使用OpenGL纹理调用来上传纹理,即在纹理加载时完全忽略GLKit - 因为OpenGL可以工作,记录等等。令人失望,但似乎是真的 - 并且在在实时项目中,OpenGL纹理调用通常比Apple的GLKit TextureInfo类快十倍。说真的 - 不要用它,这太可怕了:(。