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?