Questo è in C++.Double Buffering per oggetti di gioco, cos'è un modo C++ generico e pulito?
Quindi, sto iniziando da zero scrivendo un motore di gioco per divertirmi e imparare da zero. Una delle idee che voglio implementare è avere uno stato dell'oggetto di gioco (una struct) con doppio buffer. Ad esempio, posso avere sottosistemi che aggiornano i nuovi dati degli oggetti di gioco mentre un thread di rendering esegue il rendering dai vecchi dati garantendo che ci sia uno stato coerente memorizzato all'interno dell'oggetto di gioco (i dati dell'ultima volta). Dopo il rendering del vecchio e l'aggiornamento di nuovo è finito, posso scambiare i buffer e farlo di nuovo.
La domanda è, quale è un buon modo OOP di previsione e generico per esporre questo ai miei corsi mentre si tenta di nascondere i dettagli di implementazione il più possibile? Vorrei sapere i tuoi pensieri e le tue considerazioni.
Stavo pensando che potrebbe essere utilizzato l'overloading dell'operatore, ma come posso assegnare il sovraccarico per un membro di una classe con modello nella mia classe buffer?
per esempio, credo che questo è un esempio di quello che voglio:
doublebuffer<Vector3> data;
data.x=5; //would write to the member x within the new buffer
int a=data.x; //would read from the old buffer's x member
data.x+=1; //I guess this shouldn't be allowed
Se questo è possibile, ho potuto scegliere di attivare o disattivare le strutture doppio buffering senza cambiare molto codice.
Questo è ciò che mi stava prendendo in considerazione:
template <class T>
class doublebuffer{
T T1;
T T2;
T * current=T1;
T * old=T2;
public:
doublebuffer();
~doublebuffer();
void swap();
operator=()?...
};
e un oggetto di gioco sarebbe stato così:
struct MyObjectData{
int x;
float afloat;
}
class MyObject: public Node {
doublebuffer<MyObjectData> data;
functions...
}
Quello che ho in questo momento è le funzioni che restituiscono puntatori al buffer vecchio e nuovo e credo che qualsiasi classe che li usa debba essere consapevole di questo. C'è un modo migliore?
piccola modifica per chiarezza – gtrak
Gary: il sovraccarico dell'operatore è una scelta denotazionale scarsa. Non stai facendo una variante di un operatore accettato, stai facendo qualcosa di abbastanza unico. Vuoi una chiamata alla funzione che rileva l'unicità della soluzione. –
sì, una versione più dettagliata della mia idea originale era che potevo avere operatore + call operator + sul membro appropriato della struttura dati appropriata e passare l'argomento lungo. Capisco cosa intendi però, potrebbe diventare confuso. Il vantaggio nella mia mente è che i dati a doppio scambio potrebbero essere una sostituzione in sostituzione di un dato normale se lo uso, se imposto alcune regole come i membri possono essere solo numeri o aggregati. – gtrak