Архитектура Game Engine имеет некоторую информацию по этой теме. Основы в том, что вам нужно провести некоторый анализ, чтобы понять, каковы ваши требования к памяти на уровень / кадр / и т. Д. похожи, но есть несколько паттернов, которые автор упоминал несколько раз:
- Распределители на основе стека. Они выделяют большой сегмент памяти один раз, а затем выделяют указатели в этом блоке памяти в ответ на запросы из других частей игры. Это полезно, чтобы избежать переключения контекста, необходимого для выделения памяти, а также потому, что вы можете использовать свои собственные методы для обеспечения непрерывности или конкретного выравнивания для операций SIMD. Некоторые движки также используют двусторонний стек, где один вид ресурсов загружается сверху, а другой загружается снизу. Возможно, LSR (Load and Stay Resident, то, что понадобится на протяжении всей игры) сверху, и данные для каждого уровня снизу.
- Память с одним кадром или память с двойным буфером: память для операций, выполняемых в течение одного или двух циклов кадров. Это полезно, потому что вместо того, чтобы выделять / освобождать каждый кадр, вы можете просто удалить данные последнего кадра, сбрасывая указатель, который вы используете для отслеживания памяти в начале блока.
- Объектные пулы: блок памяти для многих объектов одинакового размера, таких как частицы, враги, снаряды. Они полезны, потому что вы можете легко достичь смежности, найдя первый неиспользованный сегмент в вашем пуле. Они также упрощают итерацию, поскольку каждый объект находится на известном смещении относительно последнего.
Самая большая вещь, на которую автор обращает внимание, это фрагментация памяти. Это не проблема, если вы разрабатываете, например, для ПК, где у вас есть какая-то резервная копия подкачки памяти, на которую вы можете рассчитывать, но в фиксированном контексте памяти, таком как консоль, существует риск «нехватки памяти» при попытке выделить большой объект, потому что ваша память фрагментирована таким образом, что доступны только маленькие непрерывные блоки. С этой целью он рекомендует, чтобы распределитель на основе стека, как указано выше, также включал метод периодической дефрагментации его содержимого.
Для получения дополнительной информации о реальном коде, который в этом задействован, я настоятельно рекомендую статью Кристиана Гирлинга «У нас не хватает памяти?» , которая охватывает методы для пользовательских распределителей, в основном с точки зрения анализа моделей использования памяти, но это также применимо к разработке специального решения для управления памятью.