Событие l oop - Infinte l oop не остановит рендеринг конвейера в Chrome, но включится Firefox - PullRequest
1 голос
/ 21 января 2020

В следующем коде ручки кнопка «стоп-земля» инициирует бесконечное l oop.

Я ожидал, что l oop не позволит браузеру инициировать рендеринг пипелина, но я был удивлен см., что в Chrome изображение продолжается плавно.

При проверке этого на Firefox изображение немедленно останавливается.

https://codepen.io/amirnamdar-the-scripter/pen/NWPeRNY

<script> 
function stop() {
while (true);
}
</script>

<body>
    <h1> Think you can stop the earth from spinning? </h1>
    <h2>Hit the button</h2>

    <button onclick="stop()" > stop earth </button>
    <img src="https://media.giphy.com/media/ux6AQI6MBwGqY/giphy.gif" width="480" height="270">
</body>

Я предполагаю, что это может иметь какое-то отношение к различным реализациям события l oop в разных движках.

Мне интересно, что V8 делает иначе, чем SpiderMonkey, который приводит в этой разнице.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 января 2020

После комментария Джеффа ниже я хотел бы завершить вопрос его ответом:

они перенесли рендеринг gif-кадра в поток композитора

0 голосов
/ 21 января 2020

Этот эксперимент говорит вам, что в Chrome, JavaScript выполнение и анимация / рисунок gif происходят в отдельных потоках (или, возможно, даже в отдельных процессах). Тот факт, что JavaScript является однопоточным, не означает, что весь остальной браузер также должен работать в том же потоке. Ваш бесконечный l oop по-прежнему будет препятствовать обработке дополнительных событий, потому что управление никогда не вернется к событию l oop - но событие l oop является концепцией JavaScript, и гифкам не нужно заботиться об этом.

Вот обновленный эксперимент, демонстрирующий, что:

<head>
<script>
var stop_requested = false;
function loop() {
  while (!stop_requested) {}
}
function stop() {
  alert('requesting stop');
  stop_requested = true;
}

</script>
</head>
<body>
  <button onclick="loop()">interruptible loop</button>
  <button onclick="stop()">request stop</button>
</body>

Если вы нажмете первую кнопку, будет запущен бесконечный бесконечный l oop, который заблокирует вторую кнопку. обработчик событий (вы никогда не увидите окно предупреждения).

...