2009-04-17 13 views
5

Quindi sto cercando di creare un semplice motore di gioco multi-thread per il gioco che voglio scrivere. Finora, tutto ha funzionato senza problemi, so anche quali passi devo fare per finirlo.Come mantenere sincronizzati i dati del mio mondo in un motore di gioco multi-thread?

C'è solo una cosa che non conosco (beh, tecnicamente, conosco una soluzione per questo, ma spero che ci sia qualcosa di più elegante e veloce) del mio motore - Grafica, Ingresso, Fisica, Audio, ecc.

Il thread di fisica ha una struttura di nodo di scena completa del mondo, in cui simula tutto. Tuttavia, ora devo portare questa struttura sul mio thread grafico, con il minimo sovraccarico possibile. Idealmente, dovrebbe solo trasferire le parti che sono cambiate dall'ultimo aggiornamento.

Sono presenti componenti per il trasferimento di questi dati, solo il problema è la generazione.

Finora, ho pensato a due diversi approcci:

  • copiare l'intera struttura per ogni aggiornamento - molto semplice, ma forse il tempo e intensife memoria (Non ho esperienza con i grandi motori - sarebbe questo sia fattibile?)
  • tenere traccia di quali parti della scena cambiato contrassegnando i nodi scena con alcune bandiere, e poi solo la copia sopra le parti modificate

approccio si potrebbe copiare una grande quantità di memoria, ma senza molta elaborazione in powe r, l'approccio due farebbe il contrario: un sacco di potenza di elaborazione, meno memoria copiata.

C'è qualche risposta generale quale approccio sarebbe più veloce in un tipico ambiente di gioco?

risposta

4

No, non esiste una risposta generale accettata, è un'area di ricerca corrente nello sviluppo di giochi.

I miei 2 centesimi sono la saggezza convenzionale - quale da usare dipende in realtà dal tuo caso d'uso specifico - se il tuo gioco ha molti dati (ad esempio, richiede molta memoria, come la maggior parte dei titoli di successo), probabilmente vorrai solo trasmettere i cambiamenti. Se il tuo gioco non richiede molta memoria (ad esempio giochi arcade), puoi probabilmente farla franca copiando l'intero oggetto.

Suggerirei di implementare entrambi e collegando i timer delle prestazioni per vedere quale funziona meglio per voi; è possibile implementare un'architettura in grado di gestire entrambi i metodi in modo trasparente.

+0

teoria: la velocità di trasferimento di picco della RAM DDR2-1066 è 8533 MB/s, e voglio almeno 100 aggiornamenti al secondo, quindi un aggiornamento deve essere inferiore a 85 MB. Un nodo fisico dovrebbe avere almeno 32 byte (28 per la posizione e l'orientamento almeno 4 per un ID univoco), se si utilizzano gli ID a 32 bit come ID. Assumendo 10.000 oggetti, ciò significherebbe 312,5 kB da copiare per aggiornamento (0,3% del massimo) Tuttavia, questo non include il sovraccarico per la gerarchia dei nodi. Dovrebbe essere facilmente possibile. – Mononofu

Problemi correlati