Javascript Сборка мусора приостановлена - PullRequest
5 голосов
/ 28 января 2011

Я пытаюсь создать простой игровой движок на JavaScript с помощью WebGl, но у меня возникают некоторые нежелательные проблемы с JavaScript в целом, которых, я надеюсь, можно избежать. Помимо общего отсутствия производительности с JavaScript, у меня возникают странные паузы при рендеринге с WebGl, которые происходят периодически, раз в секунду или около того. Я предполагаю, что это должно произойти с GC в JavaScript. Есть ли способ минимизировать эти «заикания»? Есть ли какие-то распространенные методы, которые я должен знать, способ заставить хотя бы часть сборки мусора происходить в то время, когда я могу контролировать?

Я знаю, что это простые вопросы, но я довольно плохо знаком с JavaScript, и поиск в Интернете не дал мне много полезной информации.

1 Ответ

2 голосов
/ 01 февраля 2011

Повторно используйте объекты как можно чаще.Если вы создаете десятки объектов (например, векторов и матриц) для каждого визуализированного кадра, то вы обязательно получите заикание, связанное с ГХ.Поэтому, когда вы используете подход, основанный на графе сцены, для рендеринга вашей игры, вы можете, к примеру, кэшировать объекты в узлах графа сцены.Или вы можете использовать Pattern Pool Pattern .В других языках, таких как Java, эта техника устарела, потому что создание объектов и сборщик мусора сегодня настолько быстры, что пул объектов больше не помогает.Но в JavaScript это все еще может помочь.

У меня были проблемы с GC-заиканием в игре JavaScript, которую я написал в прошлом году, и я решил ее, переписав свой 2D-векторный движок, поэтому абсолютно никаких новых объектов не создается во время рендеринга кадров.Объекты создаются только один раз, когда сцена строится или к ней добавляются новые узлы сцены.Но отображение и анимация сцены не создают абсолютно никаких новых объектов.

Вы можете взглянуть на мой 2D-движок:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

Вы заметите, чтоЯ кэшировал временно необходимые векторы и матрицы в статических полях и что я использовал изменяемые классы векторов и матриц вместо неизменяемых, поэтому существующие векторы / матрицы модифицируются вместо создания новых векторов / матриц результата при выполнении математических операций с ними.

...