Continuo a colpire questo problema quando si costruisce motori di gioco in cui le mie lezioni vogliono assomigliare a questo:architettura OO per il rendering in giochi basati dello shader
interface Entity {
draw();
}
class World {
draw() {
for (e in entities)
e.draw();
}
}
questo è solo pseudo-codice per mostrare più o meno come il disegno accade. Ogni sottoclasse di entità implementa il proprio disegno. Il mondo scorre attraverso tutte le entità senza un ordine particolare e dice loro di disegnarsi a uno a uno.
Ma con la grafica basata su shader, questo tende ad essere orribilmente inefficiente o addirittura non fattibile. Probabilmente ogni tipo di entità avrà il proprio programma shader. Per ridurre al minimo le modifiche al programma, tutte le entità di ogni particolare tipo devono essere disegnate insieme . Semplici tipi di entità, come le particelle, possono anche voler aggregare il loro disegno in altri modi, come la condivisione di un grande array di vertici. E diventa molto peloso con la fusione e tale in cui alcuni tipi di entità devono essere resi in determinati momenti rispetto agli altri, o anche in più occasioni per passaggi diversi.
Quello che normalmente si ottiene è una sorta di renderer singleton per ogni classe di entità che mantiene un elenco di tutte le istanze e le disegna tutte in una volta. Non è così male poiché separa il disegno dalla logica del gioco. Ma il renderer deve capire quale sottoinsieme di entità disegnare e ha bisogno di accedere a più parti differenti della pipeline grafica. È qui che il mio modello di oggetti tende a diventare disordinato, con un sacco di codice duplicato, accoppiamento stretto e altre cose brutte.
Quindi la mia domanda è: che cos'è una buona architettura per questo tipo di disegno del gioco che sia efficiente, versatile e modulare?
Il fatto che tu lo stia separando da tutto il resto è buono per iniziare, e suona come se fosse disordinato perché è ... beh ... _messy_. ** Il pasticcio ** necessario è sfortunato, ma comunque necessario. Ma dubito che la vedrai come una risposta ... –