Grafico della scena in thread separato


12

Sviluppo il mio motore di gioco per divertimento (ma non a scopo di lucro). Ho il rendering in un thread e gli aggiornamenti del mio grafico di scena (velocità, ecc.) In un altro. Quando è il momento di eseguire il rendering, il thread di rendering aggiunge i nodi visibili a un nuovo buffer lineare e li attraversa.

Più in dettaglio, il mio grafico della scena è a triplo buffer. Ogni nodo nel mio grafico di scena ha tre copie delle sue matrici di trasformazione relativa e assoluta (4x4). In qualsiasi momento, una copia viene scritta dal thread del grafico della scena, una copia viene letta dal renderer ed esiste una terza in modo che il lettore o lo scrittore possano passare alla successiva senza attendere l'altra. Ciò impedisce di scrivere su qualcosa mentre viene eseguito il rendering e di visualizzare un grafico della scena aggiornato parzialmente. In qualche modo ho anche una quarta copia di ogni matrice con cui l'utente può lavorare in modo da non entrare in conflitto con il thread di aggiornamento. Questo sembra funzionare bene evitando di dover sincronizzare tutto il tempo.

Tuttavia, questo è un casino.

Questi sono i miei obiettivi finali per il sistema:

  • Il rendering e l'aggiornamento del grafico della scena rimangono in thread separati.
  • Riduci al minimo quanto questi thread devono attendere l'uno sull'altro.
  • Non eseguire il rendering di una scena che è stata parzialmente aggiornata dal thread di aggiornamento. Ciò è particolarmente evidente se la telecamera si sta muovendo rapidamente e talvolta viene visualizzata prima o dopo un aggiornamento.
  • Utilizzo della memoria ridotto. Ho troppe matrici per nodo. Sto anche considerando di passare ai vettori per posizione / rotazione / scala a causa della maggiore deriva in virgola mobile con le matrici.
  • Capacità di gestire decine di migliaia di nodi. Il sistema attuale lo fa ragionevolmente bene.

Spero anche di incorporare Bullet (il motore fisico) e il networking in futuro, nessuno dei quali ho pensato molto.

Quali sono alcuni approcci per realizzare un grafico di scena migliore?

Risposte:


4

Hai letto la tesi di Johannes Spohr su "Pace" e il suo renderer? Descrive un cosiddetto renderer parallelo "motore di invio" * e può darti alcune idee.

Ecco la pagina di riepilogo (in tedesco), ed ecco un link diretto al PDF che è in inglese.

( *: questo link va anche all'articolo in cui inizialmente ho sentito parlare della tesi.)

EDIT: L'ho scremato solo in precedenza, e l'ho appena guardato di nuovo ... e mi sono reso conto che è davvero lucido sui dettagli del grafico della scena. Immagino di non rendermi conto di quanto fosse ortogonale il suo design. Scusa se non è particolarmente utile.


1
Un pezzo di questo documento mi è ancora uscito: "Idealmente, l'applicazione non dovrebbe nemmeno sapere che esiste un grafico di scena, dovrebbe solo essere consapevole di un componente di visualizzazione che deve informare delle modifiche al modello di dati". Ciò ha ispirato in me un nuovo modo di pensarci: non ho bisogno di triplicare il buffer dell'intera scena, solo ciò che è visibile attraverso la fotocamera attuale. Posso spostare l'abbattimento dal thread di rendering al thread del grafico della scena (quando incontra una telecamera), e in qualsiasi momento, uno di questi tre buffer può essere scritto da esso e un altro letto dal renderer.
EricP,

1
Potresti anche consultare l'articolo "Design del motore incentrato sulla fotocamera per il rendering multithread" in Game Engine Gems 1 e il relativo "Rendering parallelo pratico con DirectX 9 e DirectX 10" - microsoft.com/downloads/en/…
Neverender

1
Sembra che Game Engine Gems 1 sia disponibile online gratuitamente: books.google.com/…
EricP
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.