2016-07-30 27 views
0

Ich versuche, eine Video-Spiel-Engine, die die render Funktion als eine Schleife ausführen müssen. Wenn diese Funktion beendet ist, will ich es wieder laufen, und wieder und wieder ... Aber wenn ich versuche dies:Führen Sie eine Funktion unendlich oft

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

while(1) { render(); } 

Der Browser freeze in wenigen Sekunden. So habe versucht, ich einen anderen Weg:

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

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

auch:

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

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

Aber das läuft die Funktion nur ~ 500-mal an einem zweiten, will ich es laufen ~ 5000 mal. Das ist möglich, wenn ich die Laufzeit (0,00015 Sekunden) anschaue, aber ich finde keinen Weg, dies zu tun.

Hat jemand eine Idee?

+6

Versuchen Sie ['requestAnimationFrame'] (https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), aber wenn Sie * bereits * 500 fps bekommen, warum brauchen Sie mehr? –

+0

@Lucas Trzesniewski: Sie sollten dies als Antwort wiederholen. – doctorless

+1

@drheart jemand schon FGITWed das, aber um ehrlich zu sein, ich bin ziemlich zweifelhaft über OP 500 fps Figur;) –

Antwort

3

Was Sie tun möchten, ist window.requestAnimationFrame auf diese Weise verwenden:

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

window.requestAnimationFrame(render); 

Sie können nie eine „unendliche“ Anzahl der Anrufe erhalten, die davon abhängen, wie stark Ihre Hardware ist. Sie können auch einfach die "Delta-Zeit" (Zeit, die zwischen zwei aufeinanderfolgenden Aufrufen von render verstrichen ist) berechnen, um die Spielanimation für jeden Benutzer reibungslos zu gestalten, unabhängig von der Hardware.

+0

Durch die Berechnung der Zeit, die benötigt wird, um die 'render' Funktion auszuführen, kann ich sehen, dass was auch immer ich benutze (requestAnimationFrame, setInterval) Ich kann die Funktionen nicht 5000 Mal hintereinander ausführen. Aber es sollte möglich sein, ich verstehe nicht, warum es nicht funktioniert. Für den 'window.requestAnimationFrame' Weg, der ein Maximum von 60 fps einstellt, aber nicht erlaubt, die" Delta-Zeit "zu reduzieren. Ich werde versuchen, die Delta-Zeit der verschiedenen Möglichkeiten, die ich getestet habe, zu messen und morgen einen Bericht hier zu veröffentlichen. – ClementNerma

+0

(Sorry für die späten) Nach ein paar Tests ist die Delta-Zeit (seltsamerweise) etwa 2 mal höher mit 'requestAnimationFrame' als mit einem einfachen' setTimeout' (das war nicht 'setInterval' Ich habe meine Frage bearbeitet). Und wenn ich 4000 Polygone auf den Bildschirm setze, sind die FPS mit dem 'setTimeout'-Weg etwa 2 mal höher ..... – ClementNerma