抑制OpenGL ES(iPhone)纹理/ OpenAL的最佳方式是内存占用?

时间:2010-10-23 12:16:11

标签: iphone optimization opengl-es compression openal

我该怎么办? 我有一些512x512 png。我将它们压缩为PVR(这导致了糟糕的质量),我正准备用pngcrush工具压缩PNG。 PVR的文件大小比PNG大2倍x,也许我可以试用JPG文件。

图像是否以压缩状态存储在内存中?或仅在加载过程中压缩计数?或者图像/纹理在内存中未压缩映射?

同样的追求声音。我尝试了不同的格式,如wav,mp3,aac,aiff(caf),但似乎附加soundManager会占用相同大小的内存。

有没有办法减少实际内存消耗,或者压缩仅用于加速纹理/声音加载?

请给我一个灯光。

4 个答案:

答案 0 :(得分:1)

您将始终拥有RAM中的完整数据。对于纹理,我不推荐你任何东西,但对于声音,你可以使用单声道文件。这将使所需的尺寸减少50%。您还可以尝试声音文件的比特率。

答案 1 :(得分:0)

压缩纹理使用较少的RAM,因为它们在VRAM中压缩存储,并且它们以压缩形式运行。

因此,使用压缩纹理,您可以获得上传和VRAM存储的好处。

答案 2 :(得分:0)

关于声音,您可以尝试缓冲它们 - 这意味着在需要时从文件中读取数据,然后在数据播放后丢弃它们。

请注意,如果您的声音较小(例如爆炸)并且实际上可能造成更多伤害(因为每次播放时都必须读取文件),这并不是很有用 - 这取决于它播放的频率,当然。

这种技术的使用方法就像音乐一样;在OpenAL中,您可以使用以下内容缓冲小音频片段:

alSourceQueueBuffers(source, numbuffers, buffers);

还存在检查排队和已处理缓冲区数量的函数:

ALint numqueued, numprocessed;
// total number, including the already-processed buffers!
alGetSourcei(source, AL_BUFFERS_QUEUED, &numqueued);
// number of buffers played completely
alGetSourcei(source, AL_BUFFERS_PROCESSED, &numprocessed);

获得已处理缓冲区的数量后,您可以简单地对已完成的缓冲区进行排队(然后删除):

ALuint processed[numprocessed];
// fills "processed" with the buffers that have been removed
alSourceUnqueueBuffers(source, numprocessed, processed);

...最后,删除缓冲区(假设它们未被使用):

alDeleteBuffers(numprocessed, processed);

有关详情,请参阅OpenAL程序员指南(PDF警告)http://connect.creativelabs.com/openal/Documentation/OpenAL_Programmers_Guide.pdf

答案 3 :(得分:0)

有些事情没有说明。

对于声音文件,减小大小(ram和app大小)的一个好方法是使用caf格式。

使用以下内容转换文件:

/usr/bin/afconvert -f caff -d ima4 $1.aiff $1.caf