Luc's GC и игра в реальном времени - PullRequest
7 голосов
/ 31 октября 2010

Как я знаю, трассирующий GC не может избежать блокировки потока во время полного GC.

Я использовал XNA + C #, и время GC было невозможно удалить. Поэтому я перешел на более низкий уровень языка C, но понял, что мне нужен язык сценариев. Я рассматриваю Lua, но я беспокоюсь о механизме Lua GC. Lua использует GC с инкрементной трассировкой, и блокировка потоков тоже должна быть.

Так как мне справиться с этим в игре в реальном времени?

Ответы [ 3 ]

10 голосов
/ 09 ноября 2010

Сила Луа в том, что он убирается с вашего пути.Хотите занятия?Это можно построить с помощью метатаблиц.Хотите песочницу?используйте lua_setfenv .

Что касается сборщика мусора.Используйте его как есть первым.Если позже вы обнаружите проблемы с производительностью, используйте lua_gc для точной настройки его поведения.

Некоторые примеры:

  • Отключите сборщик мусора в те моменты, когдаЗамедление будет проблемой.

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

  • Отключить коллектор и выполнить полный сбор в точках остановки, то есть на экране загрузки или в сцене вырезания или вВключите смену в игре с горячими местами.

Вы также можете рассмотреть альтернативный язык сценариев. Белка очень старается быть Луа второго поколения.Он старается сохранить все хорошие возможности Lua, исключая при этом любые ошибки в дизайне.Одно из больших различий между ними заключается в том, что белка использует подсчет ссылок вместо сборки мусора.Оказывается, подсчет ссылок может быть немного медленнее, чем сборка мусора, но он очень детерминирован (AKA realtime).

3 голосов
/ 03 ноября 2010

Правильный способ справиться с этим:

  1. Напишите небольшой прототип, содержащий только основные вещи, которые вы хотите протестировать.
  2. Профилируйте его, воспроизводя различные сценарииэто может произойти в вашей игре (много доступной памяти, мало доступной памяти, различное количество потоков, и тому подобное)
  3. Если вы не найдете видимого узкого места, вы можете использовать Lua.В противном случае вам придется искать альтернативные решения (возможно, Lisp или Javascript)
2 голосов
/ 27 февраля 2014

Вы можете исправить Lua GC, чтобы ограничить время каждого цикла сбора. Например: http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

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

В следующей статье рассматриваются две стратегии использования Lua для управления роботом в режиме реального времени (1. не генерировать мусор или 2. использовать распределитель O (1) и настраиваться при запуске сбора GC): https://www.osadl.org/?id=1117

...