Il motore C ++ su cui sto lavorando attualmente è suddiviso in diversi thread di grandi dimensioni: Generazione (per la creazione del mio contenuto procedurale), Gameplay (per AI, script, simulazione), Fisica e Rendering.
I thread comunicano tra loro attraverso piccoli oggetti messaggio, che passano da un thread all'altro. Prima di fare un passo, un thread elabora tutti i suoi messaggi in arrivo: gli aggiornamenti si trasformano, aggiungono e rimuovono oggetti, ecc. A volte un thread (Generation) crea qualcosa (Art) e lo passa a un altro thread (Rendering) per la proprietà permanente.
All'inizio del processo e ho notato un paio di cose:
Il sistema di messaggistica è ingombrante. Creare un nuovo tipo di messaggio significa sottoclassare la classe Message di base, creare un nuovo enum per il suo tipo e scrivere la logica su come i thread dovrebbero interpretare il nuovo tipo di messaggio. È un ostacolo per lo sviluppo ed è soggetto a errori di battitura. (Sidenote- lavorando su questo mi fa apprezzare quanto possano essere grandi le lingue dinamiche!)
C'è un modo migliore per farlo? Dovrei usare qualcosa come boost :: bind per rendere questo automatico? Sono preoccupato che se lo faccio perdo la capacità di dire, ordinare i messaggi in base al tipo o qualcosa del genere. Non sono sicuro se quel tipo di gestione sarà persino necessario.
Il primo punto è importante perché questi thread comunicano molto. La creazione e il passaggio di messaggi è una parte importante del far accadere le cose. Vorrei semplificare quel sistema, ma anche essere aperto ad altri paradigmi che potrebbero essere altrettanto utili. Ci sono diversi progetti multithread a cui dovrei pensare per facilitare questo?
Ad esempio, ci sono alcune risorse che sono scritte raramente, ma spesso letti da più thread. Dovrei essere aperto all'idea di avere dati condivisi, protetti da mutex, a cui tutti i thread possano accedere?
Questa è la mia prima volta a progettare qualcosa con il multithreading in mente da zero. In questa fase iniziale penso davvero che stia andando molto bene (considerando), ma sono preoccupato per il ridimensionamento e la mia efficienza nell'implementazione di nuove cose.