Предположения: rAF now
Время рассчитывается во время запуска всех обратных вызовов. Поэтому любая блокировка, которая происходит до первого обратного вызова этого фрейма, не влияет на rAF now
, и это точно - по крайней мере, для этого первого обратного вызова.requestAnimationFrame [now] vs performance.now() time discrepancy
Любые измерения performance.now(), сделанные до запуска rAF-набора, должны быть раньше, чем rAF now
.
Тест: Запись before
(базовое время до ничего бывает). Установите следующий rAF. Сравните rAF now
и введите номер телефона performance.now()
, чтобы узнать, насколько отличаются.
Ожидаемые результаты:
var before = performance.now(), frames = ["with blocking", "with no blocking"], calls = 0;
requestAnimationFrame(function frame(rAFnow) {
var actual = performance.now();
console.log("frame " + (calls + 1) + " " + frames[calls] + ":");
console.log("before frame -> rAF now: " + (rAFnow - before));
console.log("before frame -> rAF actual: " + (actual - before));
if (++calls < frames.length) { before = actual; requestAnimationFrame(frame); }
});
// blocking
for (var i = 0, l = 0; i < 10000000; i++) {
l += i;
}
Наблюдения: Когда происходит блокирование до начала кадра, время RAF now
порой неправильно, даже для этого первого кадра. Иногда первый кадр now
на самом деле является более ранним временем, чем записанное время before
.
есть ли преграждает происходит перед кадром или нет, каждый так часто в кадре время rAFnow
будет раньше времени до кадра before
--Но, когда я настроить RAF после я беру первое измерение , Это также может произойти без каких-либо блокировок, хотя это реже.
(я получаю ошибку синхронизации на первом блокирующем кадре большую часть времени. Getting вопрос о других встречается реже, но иногда случается, если вы попытаетесь запустить его несколько раз.)
С более обширным тестирование, я обнаружил плохие времена с блокировкой до обратного вызова: 1% от 100 кадров, без блокировки: 0.21645021645021645% от ~ 400 кадров, что, по-видимому, вызвано открытием окна или некоторым другим потенциально интенсивным действием процессора.
Так что это довольно редко, но проблема в том, что это не должно происходить вообще. Если вы хотите делать с ними полезные вещи, имитируя время, анимацию и т. Д., То вам нужны эти времена, чтобы иметь смысл.
Я принял во внимание то, что сказали люди, но, возможно, я до сих пор не понимаю, как все работает. Если это все в спецификации, я бы хотел, чтобы какой-нибудь псевдо-код укрепил его в моем сознании.
И что еще более важно, если у кого-то есть предложения по поводу того, как я мог обойти эти проблемы, это было бы потрясающе. Единственное, что я могу придумать, это взять мой собственный performance.now()
измерение каждого кадра и использовать его - но это кажется немного расточительным, если он эффективно запускается дважды в каждом кадре, поверх любых событий, вызванных событиями, и так далее.
Я добавил состояние остановки в ваш фрагмент. Не стесняйтесь отката, но таким образом код на самом деле заканчивается в какой-то момент :). –
Нет, это круто. Спасибо, @MikeMcCaughan. – Whothehellisthat