2016-07-30 7 views
0

Я пытаюсь создать движок видеоигр, который должен запускать функцию render как цикл. Когда эта функция закончена, я хочу, чтобы запустить его снова, и снова, и снова ... Но когда я пытаюсь это:Запуск функции бесконечное время

function render() { 
    // some code here which takes ~ 0.00015 second to run 
} 

while(1) { render(); } 

Браузер замораживания в течение нескольких секунд. Так что я попробовал другой путь:

function render() { 
    // some code here which takes ~ 0.00015 second to run 
} 

setTimeout(render); 
// I've tried also 
setTimeout(render, 1); 

Также:

function render() { 
    // some code here which takes ~ 0.00015 second to run 

    setTimeout(render); 
    // OR 
    setTimeout(render, 1); 
} 

Но запускает функцию только ~ 500 раз на секунду, я хочу, чтобы запустить его ~ 5000 раз. Это возможно, если я посмотрю время работы (0.00015 секунды), но я не могу найти способ сделать это.

У кого-нибудь есть идеи?

+6

Попробуйте ['requestAnimationFrame'] (https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), но если вы * уже получаете 500 кадров в секунду, зачем нужно больше? –

+0

@ Lucas Trzesniewski: Вы должны передать это как ответ. – doctorless

+1

@ drheart кто-то уже FGITWed тот, но, честно говоря, я довольно сомневаюсь в цифре 500 кадров в секунду.) –

ответ

3

То, что вы хотите сделать, это использовать window.requestAnimationFrame таким образом:

function render() { 
    window.requestAnimationFrame(render); 
} 

window.requestAnimationFrame(render); 

Вы не можете получить «бесконечный» количество звонков, которые будут зависеть от того, насколько сильно ваше оборудование. Вы также можете легко вычислить «время дельта» (количество времени, прошедшего между двумя последовательными звонками render), чтобы анимация игры была гладкой для любого пользователя, независимо от их оборудования.

+0

Вычислив время, необходимое для запуска функции «render», я вижу, что независимо от того, что я использую (requestAnimationFrame, setInterval), я не могу запускать функции по 5000 раз за раз. Но это должно быть возможно, я не понимаю, почему это не работает. Для метода 'window.requestAnimationFrame', который устанавливает максимум 60 кадров в секунду, но не позволяет уменьшить« время дельта ». Я попытаюсь измерить время дельта различных способов проверки и опубликовать отчет здесь завтра. – ClementNerma

+0

(Прошу прощения). После нескольких тестов время дельта (как ни странно) примерно в 2 раза выше с 'requestAnimationFrame', чем с простым' setTimeout' (это не было 'setInterval', я отредактировал мой вопрос). И когда я помещаю 4000 полигонов на экран, FPS примерно в 2 раза выше с помощью метода 'setTimeout' ..... – ClementNerma

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

  • Нет связанных вопросов^_^