1

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

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

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

有没有办法减少实际内存消耗,或者压缩只是为了加快纹理/声音加载?

请给我一盏灯。

4

4 回答 4

1

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

于 2010-10-23T12:20:36.803 回答
0

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

因此,使用压缩纹理,您可以在上传和 VRAM 存储方面受益。

于 2010-10-23T15:15:20.817 回答
0

有些话没说。

对于声音文件,减小大小(内存和应用程序大小)的好方法是使用 caf 格式。

使用以下方式转换您的文件:

/usr/bin/afconvert -f caff -d ima4 $1.aiff $1.caf
于 2012-02-12T11:09:44.353 回答
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

于 2010-10-23T21:08:38.970 回答