0

Я разрабатываю игру, используя холст HTML5 и JavaScript. Исходные fps приличные, но по мере продолжения игры fps уменьшается. Исходный fps составляет около 45 кадров в секунду, но он уменьшает до 5 кадров в секунду.HTML5 Частота обновления игры с запросомAnimationFrame

Ниже мой gameloop

var last_draw = Date.now(); //To track when last time GameDraw was called last time 
var fps; 
function gameloop() 
{ 
    var elapsed = Date.now() - last_draw; 
    last_draw = Date.now() 
    fps = 1000/elapsed; 
    context.clearRect(0,0,canvas.height,canvas.width);// This function clears the canvas. 
    GameUpdate();// This function updates property of all game elements. 
    GameDraw(); //This function draws all visible game elements in the canvas. 
    window.requestAnimationFrame(gameloop); //Requests next frame 
} 

window.requestAnimationFrame(gameloop); 

Он испытал это в следующих браузерах:

  1. Mozilla Firefox 32.0.3
  2. Google Chrome 38.0.2125.101 м

Мои вопросы::

  1. Почему rAF вызывает это реже, так как игра продолжается?
  2. Это из-за утечки памяти?
  3. Это потому, что время, затраченное GameDraw и GameUpdate, очень велико?
  4. Время выполнения функции Gamedraw отличается от времени, затраченного на фактическое рисование элементов в холсте. Gamedraw вызывает функцию draw для каждого игрового элемента.
+3

Ваш код кодирования выглядит нормально. Мы не можем помочь вам найти точную проблему без дополнительной информации. Инструменты разработчика Chrome имеют отличные инструменты для проверки утечек памяти или профиля (измеряют скорость выполнения) различных функций. Я рекомендую бесплатный курс https://www.codeschool.com/courses/discover-devtools, чтобы узнать, как использовать эти инструменты. – Iftah

+0

Спасибо, сэр за ваш ответ. Вы правы, я должен сначала изучить chrome devtools, чтобы устранить мою проблему. –

ответ

1

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

Поскольку вопрос (ы) не может иметь один твердый ответ, я кратко рассмотрим каждую из подвопроса:

Почему RAF называет его менее часто, как игра продолжается?

Как вы уже догадались в следующем вопросе - что-то подтекает: это может быть что угодно, скажем, добавляя больше текстур, обработчики событий, объекты DOM и т.д. в каждом цикле ... просто имея слишком много JS объекты накапливаются, потому что они остаются ссылкой, поэтому сборщик мусора не может избавиться от них. Но суть в том, что вам нужно узнать, что меняется/incresing между каждыми двумя кадрами.

Это из-за утечки памяти?

Очень вероятно, и все же так легко проверить. В Chrome Shift + Escape открывает диспетчер задач, где вы можете видеть использование памяти, процессора и т. Д. Для каждой открытой вкладки. Отслеживайте это.

Это потому, что время, затраченное GameDraw и GameUpdate, очень велико?

Определенно! Это может также вызвать утечку памяти. Научитесь делать профилирование профилей CPU и canvas, это очень поможет вам. Я считаю, что профилирование холста в Chrome все еще является экспериментальной функцией, поэтому вам нужно сначала включить его из флагов конфигурации. Эти две функции составляют 99% запаздывания, исследуйте, что там происходит.

Время выполнения функции Gamedraw отличается от времени, затраченного на фактическое рисование элементов в холсте. Gamedraw вызывает функцию draw для каждого игрового элемента.

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

+0

Сэр, я записал график моей игры, используя chrome devtools. Похоже, что время запуска скрипта, рендеринга и рисования меньше 16 мс, но есть серый бар для «других», как упоминалось в chrome devtools, занимает больше времени. Можете ли вы объяснить, что представляет собой эта серая полоса? следующая ссылка на моментальный снимок временной шкалы - [Хронология моментальных снимков] (https://drive.google.com/file/d/0B34WuAFidsDNeHJ3YU1POVVUSzA/view?usp=sharing) –

+0

Это может быть много. Попробуйте расширить свои devtools до полноэкранного режима, а затем используйте мышь, чтобы выбрать часть временной шкалы. Список со всем событием за этот период будет показан ниже. Изолируйте те, которые занимают больше времени, и посмотрите, есть ли что-то, что вы можете сделать, чтобы их оптимизировать. – Shomz

+0

В браузере Chrome я использовал диспетчер задач для наблюдения за памятью и процессором, и в соответствии с памятью наблюдения время от времени увеличивалось, а процессор был 25. Теперь он уверен, что объекты создаются, и это не сбор мусора. Поэтому покажите мне направление, чтобы решить эту ситуацию. Я также хотел бы сказать, что в моей игре большую часть времени я создал объекты с использованием нового оператора и сохранил его ссылку в массиве. Чтобы очистить этот объект, я просто использовал функцию сращивания в массиве, чтобы очистить его ссылку. Достаточно ли разрешить этот объект для сбора мусора? –

Смежные вопросы