Изменить: Я сообщил об этом как об ошибке Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=668257
Я создаю небольшую игру в холсте в JS с врагами, которые могут стрелять. Для тестирования я создал флаг, объявленный глобально как let fancy = true;
, чтобы определить, следует ли использовать "фантастический" алгоритм таргетинга. Я сделал это так, чтобы нажатие P переключило этот флаг. Моя основная функция frame
, вызывает другую функцию, autoShoot
, пять раз в секунду. autoShoot
использует флаг fancy
.
Сегодня началось что-то странное; Я не помню, какие изменения внесли его. Иногда, когда я нажимаю P, autoShoot
действует как fancy
, не переключается. Я сделал некоторую отладку и обнаружил, что новое, измененное значение отражается внутри frame
, но в autoShoot
значение не обновляется. Это случается с перерывами, и иногда значение в autoShoot
будет фиксироваться (без меня что-либо сделало).
Я сократил код до следующего, что все еще показывает проблему для меня. Попробуйте нажать P несколько раз. Для меня два значения получают "вне синхронизации" и отображаются по-разному после нажатия P только один или два раза:
(Я запускаю Chrome "Версия 54.0.2840.99 м" в Windows 10.)
const canvas = document.getElementById("c");
const width = 0;
const height = 0;
const ctx = canvas.getContext("2d");
const ratio =1;// (window.devicePixelyRatio||1)/(ctxFOOOOOOOOFOOOOOOOOOFOOOOO||1);
canvas.width = width*ratio;
canvas.height = height*ratio;
canvas.style.width = width+"px";
canvas.style.height = height+"px";
ctx.scale(ratio, ratio);
function testSet(id, val) {
console.log(id+": "+val);
document.getElementById(id).innerText = val;
}
let fancy = true;
document.body.addEventListener("keydown", function(e) {
if (e.keyCode == 80) {
fancy = !fancy;
console.log("Set fancy to: "+fancy);
}
});
let bullets = Array(2000);
let lastTime = 0, shotTimer = 0;
function frame(time) {
const dt = (time - lastTime)/1000;
lastTime = time;
if ((shotTimer -= dt) <= 0) {
testSet("frame", fancy);
autoShoot();
shotTimer = 0.2;
}
for (let b of bullets) {}
requestAnimationFrame(frame);
}
function autoShoot() {
testSet("autoShoot", fancy);
}
requestAnimationFrame(frame);
<code>
fancy (frame) = <span id="frame"></span><br>
fancy (autoShoot) = <span id="autoShoot"></span>
</code>
<canvas id="c"></canvas>