Как такие игры, как GTA IV, не фрагментируют кучу?

Меня интересует тип управления памятью, который может использоваться в такой игре, как GTA IV, учитывая, что ей нужно очень быстро создавать и удалять множество объектов. Как избежать фрагментации кучи и прочего. Если бы кто-то мог указать мне в правильном направлении, я бы очень признателен.


person jmasterx    schedule 14.01.2011    source источник


Ответы (6)


Они используют такие вещи, как объединение памяти, специализированные распределители и специализированные классы контейнеров.

  1. Распределитель Hoard Memory для многопоточных программ.
  2. Версия EA STL. Содержит распределители, контейнеры,
person wheaties    schedule 14.01.2011
comment
объединение памяти! да, забыл этот термин :) - person Daniel; 14.01.2011

Хотя эта статья не относится конкретно к играм, в ней содержится хороший обзор типов настраиваемых распределителей памяти, которые люди часто используют в приложениях C и C++ в попытке повысить производительность (и это немного поучительная история).

Пересмотр пользовательского распределения памяти, Berger, Zorn & McKinley , ОПСЛА 2002 г.

Программисты, надеющиеся повысить производительность, часто используют специальные распределители памяти. В этом подробном исследовании рассматриваются восемь приложений, использующих настраиваемые распределители. Удивительно, но для шести из этих приложений современный распределитель общего назначения (распределитель Lea) работает так же или даже лучше, чем пользовательские распределители. Два исключения используют регионы, которые обеспечивают более высокую производительность (улучшение до 44%). Регионы также снижают нагрузку на программиста и устраняют источник утечек памяти. Однако мы показываем, что неспособность программистов освобождать отдельные объекты внутри регионов может привести к существенному увеличению потребления памяти. Хуже того, это ограничение исключает использование регионов для общих идиом программирования, снижая их полезность. Мы представляем обобщение аллокаторов общего назначения и региональных, которые мы называем reaps. Reaps — это комбинация регионов и куч, предоставляющая полный спектр семантики регионов с добавлением удаления отдельных объектов. Мы показываем, что наша реализация reaps обеспечивает высокую производительность, превосходя другие аллокаторы с региональной семантикой. Затем мы используем тематическое исследование, чтобы продемонстрировать на практике преимущества пространства и программной инженерии Reaps. Наши результаты показывают, что программистам, которым нужны быстрые регионы, следует использовать reaps, а большинству программистов, рассматривающих возможность использования настраиваемых аллокаторов, следует вместо этого использовать аллокатор Lea.

person EmeryBerger    schedule 14.01.2011
comment
Забавно, что первый ответ будет ссылаться на ваш блог :) - person Matthieu M.; 14.01.2011

Есть две очень хорошие реализации malloc для многопоточных реализаций:

  • tcmalloc: Google
  • jemalloc: используется Apache (например)

Вот статья Facebook об улучшении jemalloc. . Это примерно в 5 раз быстрее, чем распределитель памяти Хоарда в текущем топовом ответе :)

person Matthieu M.    schedule 14.01.2011
comment
Этот результат довольно аномален - я надеюсь поработать с Джейсоном Эвансом, чтобы понять, в чем именно заключается проблема. - person EmeryBerger; 16.01.2011
comment
@EmeryBerger: меня это тоже удивило, я очень надеюсь, что вы обнаружите это, хорошие распределители памяти — первый кирпичик для создания быстрого программного обеспечения :) - person Matthieu M.; 17.01.2011

Очень быстрое создание и уничтожение большого количества объектов не обязательно означает фрагментацию кучи. Часто, если объекты одного размера, то освободившееся место можно выделить для следующего.

Часто, даже просто в качестве оптимизации, программа может не освобождать и удалять память для объектов, а хранить старые в пуле и просто брать один и перезаписывать содержимое для создания «нового» объекта.

person sje397    schedule 14.01.2011
comment
+1 за первое предложение. Так много людей говорят о фрагментации и понятия не имеют, что это значит. - person R.. GitHub STOP HELPING ICE; 16.01.2011

Я думаю, поскольку их объекты в основном имеют одинаковый размер, они могут использовать какой-то менеджер внутренней памяти, который на самом деле не освобождает память, но помечает ее как доступную, и в следующий раз, когда выделяется кусок ~ size, он возвращает его.

person Daniel    schedule 14.01.2011
comment
В любом случае это то, что делают простые реализации free(). - person Artelius; 16.01.2011

Многие игры используют некоторые из упомянутых здесь распределителей памяти. dlmalloc — это тот, который мы использовали с большим успехом (мы привязали его к Lua). Вы можете получить информацию о dlmalloc здесь.

Еще одна вещь, о которой я хотел бы упомянуть, это то, что не все игры должны использовать динамическое выделение памяти. Мы использовали мемпулы и использовали области статической памяти для большей части наших игровых данных. Это делают только системы, требующие динамического распределения (Lua и некоторые сторонние библиотеки). Все остальное, что мы делаем, исходит из статических буферов. Мы также не используем STL в игровом коде, что помогает ограничить «ущерб» от фрагментации памяти.

person Mark    schedule 14.01.2011
comment
Обратите внимание, что любая реальная ОС (т. е. ОС рабочего стола/сервера/рабочей станции, кроме Windows) использует распределитель, который алгоритмически очень близок к dlmalloc, уже с различными улучшениями. Единственные системы, в которых добавление dlmalloc в качестве замены malloc может служить какой-либо цели, — это Windows и, возможно, игровые консоли (не знаю, как выглядят их библиотеки). - person R.. GitHub STOP HELPING ICE; 16.01.2011
comment
Это не совсем так. Системы на основе Linux обычно используют распределитель glibc, который действительно основан на dlmalloc. Однако Windows, FreeBSD, Solaris, AIX и Mac OS X используют разные распределители памяти, ни один из которых не основан на dlmalloc. - person EmeryBerger; 16.01.2011
comment
Думаю, мне следовало уточнить, что я говорил о ненастоящих ОС. Помимо личных предубеждений, мой ответ действительно исходил из окон и точки зрения консоли. - person Mark; 17.01.2011