Лучший способ подавить текстуру OpenGL ES (iPhone) / объем памяти OpenAL?

Что я должен делать? У меня есть 512x512 PNG. Я сжал их до PVR (что приводит к ужасному качеству), и я готовлюсь сжать PNG с помощью инструмента pngcrush. PVR имеют примерно в 2-х раз больший размер файла, чем PNG, возможно, я могу поэкспериментировать с файлами JPG.

Изображения хранятся в сжатом состоянии в памяти? Или сжатие учитывается только при загрузке? Или изображения / текстуры отображаются несжатыми в памяти?

Тот же квестон идет на звуки. Я пробовал разные форматы, такие как wav, mp3, aac, aiff (caf), но кажется, что присоединение soundManager кушает тот же объем памяти.

Есть ли способ уменьшить фактическое потребление памяти, или сжатия предназначены только для ускорения загрузки текстуры / звука?

Пожалуйста, пролить мне свет.

4 ответа

Вы всегда будете иметь полные данные в вашей оперативной памяти. Для текстур я ничего не могу порекомендовать, но для звука вы можете использовать монофайлы. Это уменьшит необходимый размер на 50%. Вы также можете поэкспериментировать с битрейтом ваших звуковых файлов.

Сжатые текстуры используют меньше оперативной памяти, поскольку они хранятся в сжатом виде в VRAM и работают в сжатом виде.

Так что со сжатыми текстурами вы получаете выгоду при загрузке и хранении VRAM.

Что касается звуков, то вы можете попробовать их буферизовать - это означает, что они читают файлы по мере необходимости, а затем отбрасывают данные после их воспроизведения.

Обратите внимание, что это не очень полезно, если ваши звуки маленькие (скажем, взрывы) и могут на самом деле принести больше вреда, чем нет (потому что он должен читать файл каждый раз, когда он проигрывает) - это, конечно, зависит от того, как часто он воспроизводится.

Где эта техника используется, это такие вещи, как музыка; в 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

Что-то осталось недосказанным.

Для звуковых файлов отличный способ уменьшить размер (как в оперативной памяти, так и в размере приложения) - это использовать формат caf.

Преобразуйте ваши файлы, используя что-то вроде этого:

/usr/bin/afconvert -f caff -d ima4 $1.aiff $1.caf
Другие вопросы по тегам