Domanda

Stavo leggendo attraverso la documentazione di DirectX e incontrato qualcosa di interessante nella pagina per IDirect3DDevice9 :: BeginScene :

  

Per attivare il parallelismo tra la massima   la CPU e l'acceleratore grafico,   è vantaggioso chiamata    IDirect3DDevice9 :: EndScene per quanto   in vista di chiamare presente possibile.

mi è stato abituato a scrivere il mio ciclo di gioco di inserire la maniglia e tale, quindi disegnare. Devo all'indietro? Forse il ciclo di gioco dovrebbe essere più simile a questo: (semi-pseudocodice, ovviamente)

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);
}

In base a tale sentenza della documentazione, questo ciclo sarebbe "consentire il parallelismo massimo".

E 'questo comunemente fatto? Ci sono aspetti negativi di ordinare il ciclo di gioco come questo? Non vedo alcun problema reale con esso dopo la prima iterazione ... E so che il modo migliore per conoscere l'aumento della velocità effettiva di qualcosa come questo è in realtà punto di riferimento, ma ha chiunque altro già provato questo e si può attestare a qualsiasi reale aumento di velocità?

È stato utile?

Soluzione

Dal momento che ho sempre sentito che era "scomodo" per disegnare-before-sim, tendevo a spingere il sorteggio fino a dopo l'aggiornamento, ma anche dopo la chiamata "presente". Per es.

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

Mentre sul primo fotogramma voi sono flipping nulla (ed è necessario impostare le cose in modo che il primo flip effettivamente capovolgere ad uno stato noto), questo mi ha sempre colpito come un po 'più bello che mettere il render () prima , anche se l'ordine delle operazioni sono gli stessi una volta che sei in corso.

Altri suggerimenti

La risposta è sì, questo è come è comunemente fatto. Date un'occhiata al seguente presentazione sul ciclo di gioco in God of War III su PS3:

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

Se si sta eseguendo un doppio gioco tamponata a 30 fps, l'input lag sarà di 1/30 ~ = 0,033 secondi che è modo di piccole per essere rilevato da un essere umano (per confronto, in qualsiasi momento di reazione in 0,1 secondi su 100 metri è considerato una falsa partenza).

È importante notare che su quasi tutto l'hardware del PC e BeginScene EndScene non fare nulla. Infatti i buffer del driver il backup di tutti i comandi pareggio e poi quando si chiama presente, può anche non iniziare a disegnare. Comunemente tampone up più fotogrammi di comandi di tiraggio per appianare frame rate. Di solito il pilota fa le cose, basata soprattutto del presente bando.

Ciò può causare lag ingresso quando frame rate non è particolarmente elevato.

scommetto se avete fatto immediatamente il resa prima del presente che ci si nota alcuna differenza per il ciclo si dà sopra. Naturalmente su alcuni bit dispari di hardware questo può quindi causare problemi così, in generale, si sta meglio fuori loop come lei suggerisce sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top