ASI Замена игрового аллокатора на jemalloc

SR_team

like pancake
Автор темы
BH Team
4,932
6,659
Версия SA-MP
  1. Любая
jemalloc.asi — замена игрового аллокатора памяти для GTA: San Andreas

Идея этого плагина появилась у меня после новости о выходе jemalloc 5.3.1.




Что это такое?

jemalloc.asi — это ASI-плагин для PC-версии GTA: San Andreas, который переводит основные игровые аллокации на jemalloc 5.3.1.

Проще говоря, игра начинает использовать современный аллокатор памяти там, где это действительно важно. jemalloc давно применяется в высоконагруженных проектах и интересен здесь тем, что умеет:
  • снижать фрагментацию памяти;
  • вести себя предсказуемо при большом числе мелких выделений;
  • работать стабильнее на длинных игровых сессиях;
  • упрощать диагностику ошибок работы с памятью;
  • гибко настраиваться без пересборки плагина.

Сейчас плагин уже перехватывает базовые пути выделения памяти:
  • malloc
  • calloc
  • realloc
  • free
  • игровые обёртки для выровненных аллокаций и освобождения памяти




Зачем это вообще нужно?

В GTA:SA, особенно в сборках с большим количеством ASI, CLEO, кастомных ресурсов, стриминга, дополнительных моделей, эффектов и разных служебных обвязок, аллокатор памяти начинает играть заметно более важную роль, чем кажется на первый взгляд.

jemalloc интересен здесь не только как «ещё один быстрый malloc», а как инструмент, который может дать:
  • более аккуратную работу с фрагментацией при длительной игре;
  • лучшее поведение на множестве мелких и средних аллокаций;
  • более удобную отладку, когда нужно ловить use-after-free, мусор в памяти, подозрительные места в коде или нестабильные моды;
  • понятную настройку во время запуска через переменные окружения;
  • возможность сравнивать разные профили работы памяти без перекомпиляции.

То есть это полезно и как попытка улучшить общую картину по памяти, и как удобная база для исследования того, как конкретная сборка ведёт себя под разной нагрузкой.




Почему именно jemalloc 5.3.1?

Потому что это зрелый, широко известный аллокатор с хорошей репутацией, понятной документацией и удобными настройками.
Отдельно было интересно сравнить его поведение по фрагментации и общей «адекватности» с другими современными решениями, особенно в условиях модифицированной GTA:SA.




Что это даёт на практике?

В удачном сценарии можно получить:
  • более стабильное поведение на долгих игровых сессиях;
  • снижение хаотичной деградации из-за большого числа выделений/освобождений памяти;
  • более удобную диагностику проблемных модов или своих хуков;
  • возможность запускать разные профили работы памяти под разные задачи: от «экономим память» до «ловим ошибки максимально агрессивно».

Важно понимать, что это не магическая кнопка “+100 FPS”.
Основной интерес здесь — память, фрагментация, стабильность, предсказуемость и отладка.

Данный блок написан AI, основываясь на фичах jemalloc. Автор плагина не гарантирует ничего 😁




Тюнинг jemalloc без пересборки

Одна из самых приятных вещей в jemalloc — возможность настраивать его через переменную окружения JE_MALLOC_CONF.

То есть можно менять режим работы плагина без правки кода и без новой сборки.

Примеры полезных профилей:

Код:
abort_conf:true,narenas:1,dirty_decay_ms:1000,muzzy_decay_ms:0

Код:
abort_conf:true,narenas:1,tcache:false,dirty_decay_ms:0,muzzy_decay_ms:0

Код:
abort_conf:true,background_thread:true,dirty_decay_ms:30000,muzzy_decay_ms:30000

Код:
abort_conf:true,zero:true,junk:free

Код:
abort_conf:true,junk:true

Код:
abort_conf:true,junk:free

Код:
abort_conf:true,stats_print:true




Как задать JE_MALLOC_CONF

Вместо запуска через PowerShell удобнее просто прописать переменную в пользовательских переменных среды Windows:

  1. Откройте «Дополнительные параметры системы»
  2. Нажмите «Переменные среды...»
  3. В блоке «Переменные пользователя» создайте новую переменную:
    • Имя: JE_MALLOC_CONF
    • Значение: нужная строка конфигурации, например:
      Код:
      abort_conf:true,narenas:1,dirty_decay_ms:1000,muzzy_decay_ms:0
  4. Перезапустите игру

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




Почему здесь полезен abort_conf:true?

Потому что он помогает не гадать, применились ли настройки вообще.

Если в конфиге опечатка, неверное значение или несовместимый параметр, то с abort_conf:true это всплывёт сразу, а не превратится в тихое «кажется, jemalloc что-то проигнорировал».

Для экспериментов, тестов, диагностики и сравнения профилей это очень удобно.




Текущий статус

Проект уже собирается как jemalloc.asi, использует jemalloc + MinHook и перехватывает базовые пути выделения памяти, включая обёртки для выровненных аллокаций.

Дальше особенно интересно:
  • сравнивать разные профили JE_MALLOC_CONF;
  • смотреть, как меняется поведение сборок с большим количеством модов;
  • оценивать фрагментацию и стабильность на длинных игровых сессиях;
  • решать, где jemalloc действительно выигрывает, а где прирост минимален.




Важно

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




Исходный код: https://gitlab.com/prime-hack/samp/plugins/jemalloc-asi.git
 

Вложения

  • jemalloc.asi
    442 KB · Просмотры: 62

Орк

Известный
519
498
Данный блок написан AI, основываясь на фичах jemalloc. Автор плагина не гарантирует ничего 😁
Теперь я понял негодование в мою сторону из-за нейроописания. Его понимает только автор темы

В общем, для обычного пользователя установил и забыл? Или обычному пользователю лучше не устанавливать?
 

SR_team

like pancake
Автор темы
BH Team
4,932
6,659
В общем, для обычного пользователя установил и забыл? Или обычному пользователю лучше не устанавливать?
Установил и, если повезло, то уменьшится фрагментация памяти - игра будет чуть дольше адекватно работать. Ну или дописал zero:true в конфиг - и если повезет тоже, будет чуть меньше крашей*
Но полезнее всего разрабам, так как можно маркировать выгруженную память и на при краше будет видно если это дабл фри**

* - игра не инициализирует некоторые указатели нулями, а потом пытается к ним обратиться, если видит, что там не 0, но в основном такие объекты лежат в пулах, где память заранее проинициализирована нулями
** - для этого разраб должен использовать игровой аллокатор, например для загрузки анимки
 
  • Нравится
Реакции: ARMOR, MLycoris и Орк

NegrVkletke

Известный
70
14
Для сампа слишком бесполезный плагин, так понимаю не более чем эксперимент