Gioco multi-thread: aggiornamento, rendering e come dividerli


8

Dal post StackOverflow (mi è stato consigliato di spostare questo):

Quindi, sto lavorando su un motore di gioco e ho fatto progressi abbastanza buoni. Tuttavia, il mio motore è a thread singolo e i vantaggi di suddividere l'aggiornamento e il rendering in thread separati sembrano un'ottima idea.

Come dovrei farlo? I motori di gioco a thread singolo sono (concettualmente) molto facili da realizzare, hai un ciclo in cui aggiorni -> render -> sleep -> ripeti. Tuttavia, non riesco a pensare a un buon modo per interrompere l'aggiornamento e il rendering a parte, soprattutto se modifico le loro velocità di aggiornamento (suppongo di passare attraverso il ciclo di aggiornamento 25x al secondo e di avere 60fps per il rendering) - cosa succede se inizio l'aggiornamento a metà strada attraverso un ciclo di rendering o viceversa?


Risposte:


6

Si desidera raddoppiare / triplicare il buffer di tutti i dati necessari per il rendering che vengono modificati nel passaggio di aggiornamento. In questo modo non eseguirai il rendering con qualcosa che è stato parzialmente modificato. Il motivo per cui probabilmente dovrai triplicare il buffer è necessario 1) la copia che stai aggiornando, 2) l'ultima copia che hai aggiornato completamente e 3) la copia attualmente in uso per il rendering che non desideri modificare .

La parte più difficile è probabilmente trovare il modo migliore per organizzare i tuoi dati per questo.


4

Questo sito web discute il problema e ha implementato una soluzione a triplo buffer come suggerito da Roger:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

È abbastanza difficile da implementare, ma il sito Web ha una distribuzione sia sorgente che binaria dell'implementazione se sei interessato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.