Что касается звуков, то вы можете попробовать их буферизовать - это означает, что они читают файлы по мере необходимости, а затем отбрасывают данные после их воспроизведения.
Обратите внимание, что это не очень полезно, если ваши звуки маленькие (скажем, взрывы) и могут на самом деле принести больше вреда, чем нет (потому что он должен читать файл каждый раз, когда проигрывает) - это зависит от того, как часто он воспроизводится конечно.
Где эта техника используется, это такие вещи, как музыка; в 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