#javascript #setinterval #frame-rate
Вопрос:
В настоящее время я использую setInterval( () => {}, 16 )
для запуска своего кода 60 кадров в секунду, но это заставляет код работать со скоростью 62,5 кадров в секунду, что заставляет игровые движения ускоряться вдвое быстрее на несколько кадров в секунду. Использование интервала 17 заставляет игровое движение время от времени замирать на один кадр.
Как я могу запустить код действительно со скоростью 60 кадров в секунду для максимальной плавности?
Комментарии:
1. О чем
1000/60
это ?2.Используйте игровой движок JS, например Babylon.js / Фазер 3 / и т.д. -> >html5gamedevs.com
setInterval
может дрейфовать.3. частота кадров зависит от скорости вашего кода и машины, на которой он выполняется. вы не можете просто установить таймер и ожидать одинаковой частоты кадров на всех устройствах.
4. @tempacc Это прекрасно, но зачем изобретать велосипед? Иногда вам приходится признавать, что ваш подход был просто плохим, и есть лучшие решения.
5. @Marc Ну, я написал игру на Javascript, чтобы сделать ее как можно более легкой (и изучить холст), и да, подход был плохим, но я думаю, что я сделаю все гладко, не переписывая всю игру. (Будет использоваться Window.requestAnimationFrame с 0 и deltatime)
Ответ №1:
используйте Window.requestAnimationFrame([обратный вызов])
Таким образом, ваше приложение будет вызвано, когда придет время визуализации, независимо от того, работает ли монитор с частотой 30 Гц, 60 Гц или 120 Гц или более.
См. Этот пример из https://css-tricks.com/using-requestanimationframe/ о том, как его использовать, если документация MDN недостаточно ясна.
var globalID;
function repeatOften() {
$("<div />").appendTo("body");
globalID = requestAnimationFrame(repeatOften);
}
globalID = requestAnimationFrame(repeatOften);
$("#stop").on("click", function() {
cancelAnimationFrame(globalID);
});
$("#start").on("click", function() {
globalID = requestAnimationFrame(repeatOften);
});
div {
width: 10px;
height: 10px;
background: orange;
float: left;
}
button {
position: absolute;
top: 20px;
left: 20px;
}
#stop {
left: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="start">start</button>
<button id="stop">stop</button>
Комментарии:
1. Это в сочетании с deltatime решает проблему. Спасибо.