Меня интересует тип управления памятью, который может использоваться в такой игре, как GTA IV, учитывая, что ей нужно очень быстро создавать и удалять множество объектов. Как избежать фрагментации кучи и прочего. Если бы кто-то мог указать мне в правильном направлении, я бы очень признателен.
Как такие игры, как GTA IV, не фрагментируют кучу?
Ответы (6)
Они используют такие вещи, как объединение памяти, специализированные распределители и специализированные классы контейнеров.
- Распределитель Hoard Memory для многопоточных программ.
- Версия EA STL. Содержит распределители, контейнеры,
Хотя эта статья не относится конкретно к играм, в ней содержится хороший обзор типов настраиваемых распределителей памяти, которые люди часто используют в приложениях C и C++ в попытке повысить производительность (и это немного поучительная история).
Пересмотр пользовательского распределения памяти, Berger, Zorn & McKinley , ОПСЛА 2002 г.
Программисты, надеющиеся повысить производительность, часто используют специальные распределители памяти. В этом подробном исследовании рассматриваются восемь приложений, использующих настраиваемые распределители. Удивительно, но для шести из этих приложений современный распределитель общего назначения (распределитель Lea) работает так же или даже лучше, чем пользовательские распределители. Два исключения используют регионы, которые обеспечивают более высокую производительность (улучшение до 44%). Регионы также снижают нагрузку на программиста и устраняют источник утечек памяти. Однако мы показываем, что неспособность программистов освобождать отдельные объекты внутри регионов может привести к существенному увеличению потребления памяти. Хуже того, это ограничение исключает использование регионов для общих идиом программирования, снижая их полезность. Мы представляем обобщение аллокаторов общего назначения и региональных, которые мы называем reaps. Reaps — это комбинация регионов и куч, предоставляющая полный спектр семантики регионов с добавлением удаления отдельных объектов. Мы показываем, что наша реализация reaps обеспечивает высокую производительность, превосходя другие аллокаторы с региональной семантикой. Затем мы используем тематическое исследование, чтобы продемонстрировать на практике преимущества пространства и программной инженерии Reaps. Наши результаты показывают, что программистам, которым нужны быстрые регионы, следует использовать reaps, а большинству программистов, рассматривающих возможность использования настраиваемых аллокаторов, следует вместо этого использовать аллокатор Lea.
Есть две очень хорошие реализации malloc
для многопоточных реализаций:
tcmalloc
: Googlejemalloc
: используется Apache (например)
Вот статья Facebook об улучшении jemalloc. . Это примерно в 5 раз быстрее, чем распределитель памяти Хоарда в текущем топовом ответе :)
Очень быстрое создание и уничтожение большого количества объектов не обязательно означает фрагментацию кучи. Часто, если объекты одного размера, то освободившееся место можно выделить для следующего.
Часто, даже просто в качестве оптимизации, программа может не освобождать и удалять память для объектов, а хранить старые в пуле и просто брать один и перезаписывать содержимое для создания «нового» объекта.
Я думаю, поскольку их объекты в основном имеют одинаковый размер, они могут использовать какой-то менеджер внутренней памяти, который на самом деле не освобождает память, но помечает ее как доступную, и в следующий раз, когда выделяется кусок ~ size, он возвращает его.
free()
.
- person Artelius; 16.01.2011
Многие игры используют некоторые из упомянутых здесь распределителей памяти. dlmalloc — это тот, который мы использовали с большим успехом (мы привязали его к Lua). Вы можете получить информацию о dlmalloc здесь.
Еще одна вещь, о которой я хотел бы упомянуть, это то, что не все игры должны использовать динамическое выделение памяти. Мы использовали мемпулы и использовали области статической памяти для большей части наших игровых данных. Это делают только системы, требующие динамического распределения (Lua и некоторые сторонние библиотеки). Все остальное, что мы делаем, исходит из статических буферов. Мы также не используем STL в игровом коде, что помогает ограничить «ущерб» от фрагментации памяти.
dlmalloc
, уже с различными улучшениями. Единственные системы, в которых добавление dlmalloc
в качестве замены malloc
может служить какой-либо цели, — это Windows и, возможно, игровые консоли (не знаю, как выглядят их библиотеки).
- person R.. GitHub STOP HELPING ICE; 16.01.2011