2010-05-03 4 views
5

Ich lese gerade durch die Dokumentation DirectX und stieß auf etwas Interessantes auf der Seite für IDirect3DDevice9::BeginScene:DirectX: Game-Loop-Reihenfolge, zuerst zeichnen und dann Eingabe?

maximale Parallelität zwischen der CPU und dem Grafikbeschleuniger zu aktivieren, ist es vorteilhaft, IDirect3DDevice9 zu nennen :: Endszene so weit vor dem Anstehen als möglich.

Ich bin es gewohnt, meine Spielschleife zu schreiben, um Eingaben zu verarbeiten und solche, dann zu zeichnen. Habe ich es rückwärts? Vielleicht sollte das Spiel Schleife mehr wie folgt aus: (semi-Pseudo-Code, offensichtlich)

while(running) { 
    d3ddev->Clear(...); 
    d3ddev->BeginScene(); 
    // draw things 
    d3ddev->EndScene(); 

    // handle input 
    // do any other processing 
    // play sounds, etc. 

    d3ddev->Present(NULL, NULL, NULL, NULL); 
} 

Nach diesem Satz der Dokumentation, würde diese Schleife „maximale Parallelität aktivieren“.

Wird dies normalerweise getan? Gibt es Nachteile beim Bestellen der Spielschleife? Ich sehe nach der ersten Iteration kein wirkliches Problem damit ... Und ich weiß, der beste Weg, den tatsächlichen Geschwindigkeitszuwachs von etwas wie diesem zu erkennen, ist, es tatsächlich zu benchmarken, aber hat jemand anderes das bereits versucht und kann man irgendeinen tatsächlichen bestätigen Geschwindigkeitszunahme?

+1

Ich habe keine DirectX-Erfahrung (XNA dev), aber ich weiß, dass dies wahrscheinlich ein leicht "lückiges" Gefühl für das Spiel verursachen würde, wie Dinge gezeichnet werden, bevor Ihr Spiel mit der neuen gelieferten Eingabe aktualisiert und aktualisiert wird. – RCIX

+0

@RCIX Siehe meine Antwort –

Antwort

2

Da ich immer das Gefühl hatte, dass es "umständlich" war, vor dem Sim zu zeichnen, tendierte ich dazu, die Draws bis nach dem Update zu schieben, aber auch nach dem "Present Call". Z.B.

while True: 
    Simulate() 
    FlipBuffers() 
    Render() 

Während auf dem ersten Frame bist du nichts Flipping (und Sie müssen die Dinge so einrichten, dass das erste Flip in der Tat in einen bekannten Zustand ist Flip), das mich immer ein bisschen schöner als die Indienststellung Render() zuerst, obwohl die Reihenfolge der Operationen die gleichen sind, wenn Sie gerade unterwegs sind.

2

Die kurze Antwort ist ja, so ist es üblich. Werfen Sie einen Blick auf die folgende Darstellung auf dem Spielschleife in God of War III auf der PS3:

http://www.tilander.org/aurora/comp/gdc2009_Tilander_Filippov_SPU.pdf

Wenn Sie eine doppelt gepufferte Spiel mit 30 fps läuft, wird der Input-Lag sein 30.1 ~ = 0,033 Sekunden, was viel zu klein ist, um von einem Menschen erkannt zu werden (zum Vergleich wird jede Reaktionszeit unter 0,1 Sekunden auf 100 Metern als Fehlstart betrachtet).

+0

3msec ist für einen Menschen definitiv nicht unterscheidbar, beim Midi-Piano ist alles über 4-5ms bemerkbar und alles über 10ms ist, wenn nicht unspielbar, sehr nervig. Könnte ein Unterschied sein zwischen dem Spielen eines Musikinstruments \ Videospiels. –

2

Es ist erwähnenswert, dass auf fast allen PC-Hardware BeginScene und Endscene nichts tun. Tatsächlich puffert der Treiber alle Zeichenbefehle und dann, wenn Sie den Befehl aufrufen, beginnt er möglicherweise nicht einmal zu zeichnen. Sie puffern häufig mehrere Frames von Zeichenbefehlen, um die Bildrate zu glätten. Normalerweise macht der Fahrer Dinge, die auf dem gegenwärtigen Ruf basieren.

Dies kann zu Input-Lag führen, wenn die Bildrate nicht besonders hoch ist.

Ich würde wetten, wenn Sie Ihr Rendering unmittelbar vor dem Geschenk würden Sie keinen Unterschied zu der Schleife, die Sie oben geben, bemerken. Natürlich kann dies auf einigen seltsamen Hardwarekomponenten Probleme verursachen, so dass Sie im Allgemeinen am besten aus der Schleife kommen, wie Sie oben vorschlagen.