我该怎么办? 我有一些512x512 png。我将它们压缩为PVR(这导致了糟糕的质量),我正准备用pngcrush工具压缩PNG。 PVR的文件大小比PNG大2倍x,也许我可以试用JPG文件。
图像是否以压缩状态存储在内存中?或仅在加载过程中压缩计数?或者图像/纹理在内存中未压缩映射?
同样的追求声音。我尝试了不同的格式,如wav,mp3,aac,aiff(caf),但似乎附加soundManager会占用相同大小的内存。
有没有办法减少实际内存消耗,或者压缩仅用于加速纹理/声音加载?
请给我一个灯光。
答案 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