requestAnimationFrame [now] vs performance.now () несоответствие времени

Допущения: рАФnow время вычисляется в тот момент, когда все обратные вызовы запускаются. Поэтому любая блокировка, которая происходит до вызова первого обратного вызова этого кадра, не влияет на rAFnow и это точно - по крайней мере, для этого первого обратного вызова.

Любые измерения performance.now (), выполняемые до запуска набора rAF, должны выполняться раньше, чем rAF.now.

Тест: Записьbefore (базовое время дочто-нибудь бывает). Установите следующий РАФ. Сравнить РАФnow и актуальноperformance.now() вbefore чтобы увидеть, насколько они разные.

Ожидаемые результаты:

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;
}

Наблюдения: когда есть блокировка до начала кадра, РАФnow время от времени неверно, даже для этого первого кадра. Иногда первый кадрnow на самом деле раньше, чем записаноbefore время.

Независимо от того, происходит ли блокировка перед кадром или нет, очень часто время в кадреrAFnow будет раньше, чем время до кадраbefore- даже когда я устанавливаю РАФпосле Я беру свое первое измерение. Это также может происходить без каких-либо блокировок, хотя это случается реже.

(Я получаю ошибку синхронизации на первом блокирующем кадре в большинстве случаев. Проблема с другими возникает реже, но иногда случается, если вы пытаетесь запустить ее несколько раз.)

При более широком тестировании я обнаружил плохие времена с блокировкой до обратного вызова: 1% из 100 кадров, без блокировок: 0,21645021645021645% из ~ 400 кадров, по-видимому, вызванные открытием окна или некоторыми другими потенциально интенсивными процессорами действиями со стороны пользователя ,

Так что это довольно редко, но проблема в том, что это не должно происходить вообще. Если вы хотите делать с ними полезные вещи, имитировать время, анимацию и т. Д., То вам нужно время, чтобы иметь смысл.

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

И что еще более важно, если у кого-то есть какие-либо предложения относительно того, как я могу обойти эти проблемы, это было бы здорово. Единственное, о чем я могу думать, это взять свой собственныйperformance.now() измерение каждого кадра и использование этого - но это кажется немного расточительным, когда он эффективно запускается дважды в каждом кадре, поверх любых инициируемых событий и так далее

Ответы на вопрос(2)

Ваш ответ на вопрос