Я разрабатываю онлайн-игру с использованием Java Script. Я использую метод setInterval (movimage, 10) для перемещения персонажа игры. Но я видел, что скорость движения игрового персонажа не такая же, как и все компьютер. Пожалуйста, предложите мне.Почему скорость моего игрового персонажа различна на разных компьютерах?
ответ
Вместо setInterval вы должны, вероятно, использовать requestAnimationFrame (https://developer.mozilla.org/en-US/docs/DOM/window.requestAnimationFrame).
Нет смысла пытаться обновить что-то быстрее, чем может рисовать экран. Вы нацелены на 60 кадров в секунду, что составляет около 16 мс на фрейм.
http://paulirish.com/2011/requestanimationframe-for-smart-animating/ содержит дополнительную информацию о том, как это сделать.
Поддержка браузера довольно хороша (http://caniuse.com/#feat=requestanimationframe), вкратце, все текущие браузеры, кроме браузера Android Stock.
Если у вас это работает в IE9 и ниже, https://gist.github.com/paulirish/1579671 выполняет достойную работу по моделированию поведения в этих браузерах. (Хотя, честно говоря, я подозреваю, что это будет последним из ваших забот, особенно в связи с отсутствием canvas
...)
Обратите внимание, что это не поддерживается во всех браузерах (пока). – Uooo
Поддерживается во всех приложениях, кроме Android. (Opera не считается так, как только они будут выпускать версию с помощью Blink). –
Ваше решение отлично работает. Большое спасибо за помощь. –
Даже когда сценарий не делает почти ничего, что занимает больше времени, чем 10 мкс для каждого интервала:
function interval(){
var i=0
intervalID= setInterval(function(){
console.log("called",new Date().getTime());
i++;
if(i>=10){
clearInterval(intervalID);
}
},10);
}
interval()
Вы начинаете замечать разницу, когда компьютер работает медленнее или браузер работает медленнее.
Большое спасибо за помощь. Window.mozRequestAnimationFrame отлично работает. –
Если вы делаете игру, следующий gameloop минимизирует проблему, что она работает с разной скоростью на разных компьютерах:
var loopTime = 33; // 1000ms/30fps (what we want) = 33ms per loop
var startTime, endTime, executionTime;
function gameLoop(){
startTime = new Date().getTime();
doGameMechanics();
drawGame();
endTime = new Date().getTime();
executionTime = endTime - startTime;
if(executionTime < loopTime) { // we were faster than maximum allowed
// sleep the remaining time so the game does not go too fast
setTimeout(function(){ gameLoop(); }, loopTime - executionTime);
}else{ // we were slower than maximum allowed
setTimeout(function(){ gameLoop(); }, 0);
}
}
Вы должны иметь в виду, что ваша логика игры doGameMechanics()
и рисование drawGame()
принять некоторые время тоже. Это может привести к более медленному и более быстрому поведению на разных компьютерах.
В этой игре мы проверяем, как быстро они были выполнены. После измерения времени мы знаем, как долго мы должны ждать (используя setTimeout
). Если мы были «слишком медленными», мы вызываем setTimeout
с 0 миллисекундами в качестве второго параметра. Это необходимо, так что другие Threads (например, ввод пользователя) выполняются, потому что Javascript является однопоточным.
Спасибо, что помогли мне. Я использовал метод window.mozRequestAnimationFrame, и он работает. –
- 1. Скорость приложения на разных компьютерах
- 2. Ограниченная скорость геймплея на разных компьютерах
- 3. Скорость спрайта на холсте различна на разных размерах экрана
- 4. DirectX 11.1/2 сменю сцены/скорость камеры на разных компьютерах
- 5. Почему значение ServicePointManager.SecurityProtocol на разных компьютерах отличается?
- 6. тестирование игрового алгоритма скорость
- 7. создание экземпляра моего персонажа
- 8. Различные пути на разных компьютерах
- 9. Общие сведения openMP - скорость потока различна
- 10. Как получить скорость для моего персонажа в as3
- 11. Почему персонаж моего персонажа не будет двигаться?
- 12. Одинаковый результат на разных компьютерах
- 13. Распространение на разных компьютерах-разработчиках
- 14. ImageIcon Источник на разных компьютерах
- 15. Добавление JLabel в рамку для игрового персонажа
- 16. Дата составления различна для разных версий Android.
- 17. Почему моя программа работает на разных компьютерах с разной скоростью?
- 18. Ответ CORS не получен на разных компьютерах
- 19. Изменения цвета css на разных компьютерах
- 20. Webdriver Selenium различное поведение на разных компьютерах
- 21. Постоянная Java в разных местах различна
- 22. Шрифт JButton появляется на разных компьютерах
- 23. Почему CultureInfo.GetCultures (CultureTypes.SpecificCultures) возвращают различные наборы культур на разных компьютерах
- 24. Почему мое приложение Windows Forms меняет размер на разных компьютерах?
- 25. Почему поведение пакетного скрипта может быть непоследовательным на разных компьютерах?
- 26. Почему мой JButton выглядит по-разному на разных компьютерах?
- 27. Почему мой логотип SVG отличается на разных компьютерах?
- 28. GDI Скриншот, результаты варьируются на разных компьютерах
- 29. Изменения стиля DataGrid на разных компьютерах
- 30. Высота CSS различна в разных браузерах
JS не гарантирует его выполнение точно на 10-м мс, но * через некоторое время после * 10 мс. – zerkms
Установка 'setInterval' до 10 мс не гарантирует, что он будет обновляться каждые 10 мс. Это зависит от браузера, чтобы почтить этот повторяющийся интервал. – Antony
Возможно, 10 слишком мало для интервала. Все, что нужно обрабатывать каждые 10 микросекунд, занимает больше времени на более медленных компьютерах. – HMR