2016-11-10 2 views
0

У меня возникли проблемы с производительностью с requestAnimationFrame().requestAnimationFrame() проблема с производительностью

Рассмотрите следующий код. Это простой цикл, который печатает время с момента последнего кадра каждый раз, когда эта дельта больше 20 мс.

const glob_time_info = {delta_time: 0.0, last_frame: performance.now()}; 

var render = function (timestamp) { 
    glob_time_info.delta_time = timestamp - glob_time_info.last_frame; 
    glob_time_info.last_frame = timestamp; 
    if(glob_time_info.delta_time > 20) 
     console.log(glob_time_info.delta_time); 
    requestAnimationFrame(render); 
}; 
render(performance.now()); 

Как я понял requestAnimationFrame этот фрагмент не должен печатать что-либо, потому что он пытается запустить 60 раз в секунду (60 Гц, как мой монитор). Поэтому временная дельта всегда должна быть примерно в пределах 16-17 мс.

Но он печатает раз около 33 мсек каждые несколько секунд. Почему?

Я испытал это на окнах 10 с Chrome 54 и Firefox 49. Я владеть i5-6600


UPDATE Вот вывод скрипта NIT в оконное и убунту. Windows, что вы делаете? для Windows 10 (PC): enter image description here WIndows 8 (такой же нетбук, как показано ниже): enter image description here Ubuntu (тот же нетбук, как описано выше): enter image description here

+0

Он привязан к 16 и меняется, когда я запускаю его. Вероятно, связано с сборкой мусора и другими материалами, которые делает ваш компьютер. – JonSG

+1

«пытается» быть ключевым словом, если что-то блокирует поток, даже на несколько миллисекунд, оно больше не выполняется – adeneo

+0

Я также думал о GC, но каждые несколько секунд? и что он должен собирать :) И как вы можете делать гладкую анимацию, если каждые несколько секунд частота кадров падает до 30FPS или хуже –

ответ

0

Как заявил Трэвис J в комментариях, это связано с операционной системой.

Эта проблема с производительностью не отображается в Linux. Поэтому я ничего не могу с этим поделать.

+0

«это связано с операционной системой» --- ну, окна 10 и менее мощный процессор здесь: я получаю 15-16ms за итерацию. – zerkms

+0

Я также получаю 15-16 мс, но каждые несколько секунд появляются пики. Вы пробовали мой фрагмент кода? –

+0

Нет, я запускаю один из другого ответа. – zerkms

2

Легко проверить свою гипотезу о том, что проблема связана с платформой, на которой вы работаете, - измерьте производительность.

В скором времени запустите requestAnimationFrame несколько раз, как вы это сделали, и отметьте отметку времени на каждом прогоне. После этого просто визуализируйте результаты.

var times = []; 
 
var measure = function() { 
 
    times.push(new Date().getTime()); 
 
    if (times.length > 100) return draw(); 
 
    requestAnimationFrame(measure); 
 
}; 
 
var draw = function() { 
 
    var dataset = { 
 
    x: [], 
 
    y: [], 
 
    type: 'bar' 
 
    }; 
 
    var layout = { 
 
    xaxis: { 
 
     title: 'measurement #' 
 
    }, 
 
    yaxis: { 
 
     title: 'iteration duration (ms)' 
 
    }, 
 
    height: 250 
 
    }; 
 
    var options = { 
 
    displayModeBar: false 
 
    }; 
 
    times.reduce(function(previous, current, i) { 
 
    dataset.x.push(i); 
 
    dataset.y.push(current - previous); 
 
    return current; 
 
    }, times.shift()); 
 
    Plotly.newPlot('target', [dataset], layout, options); 
 
} 
 
measure();
#target { 
 
    margin-top: -50px; 
 
}
<script src="https://cdn.plot.ly/plotly-1.2.0.min.js"></script> 
 
<div id="target"></div>

Вы можете запустить тот же моделирование на различных операционных системах и разных браузерах, чтобы увидеть, если вы можете сузить этот вопрос дальше.

+0

Спасибо! Я поставил фотографии в вопросе. –

Смежные вопросы