Sono un grande fan di avere un motore di gioco che ha la capacità di adattarsi, non solo in quello che può fare, ma anche in come può gestire il nuovo codice. Recentemente, per la mia grafica sottosistema, ho scritto una class
per essere ignorato che funziona in questo modo:Wrapper su API grafiche
class LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget) = 0;
virtual bool setStreamSource(const VertexBuffer* vertexBuffer) = 0;
virtual bool setShader(const Shader* shader) = 0;
virtual bool draw(void) = 0;
//etc.
};
La mia idea era quella di creare un elenco di funzioni che sono universali tra la maggior parte API grafiche. Poi per DirectX11 vorrei solo creare un nuovo bambino class
:
class LGI_DX11 : public LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget);
virtual bool setStreamSource(const VertexBuffer* vertexBuffer);
virtual bool setShader(const Shader* shader);
virtual bool draw(void);
//etc.
};
Ciascuna di queste funzioni sarebbe poi interfacciarsi con DX11
direttamente. Capisco che qui c'è uno strato di riferimento indiretto. Le persone sono disattivate da questo fatto?
È un metodo ampiamente utilizzato? C'è qualcos'altro che potrei/dovrei fare? C'è la possibilità di usare il preprocessore ma questo mi sembra disordinato. Qualcuno ha anche menzionato i modelli . Che cosa ne pensate?
La soluzione è più leggibile, mentre i preprocessori ei modelli possono sbarazzarsi delle funzioni 'virtuali'. – dari
@dari Effettivamente. Adoro la leggibilità e la semplicità, ma non voglio che lo strato di riferimento indiretto rallenti troppo.Onestamente, non esiterei se non fosse per il fatto che stiamo parlando di grafica qui. –
C'è anche l'opzione di un semplice collegamento con l'implementazione pertinente di una classe. Quindi non è necessario l'indirezione. Ma perdi la capacità di gestire diversi di questi allo stesso tempo, e la possibilità di spedire un singolo exe che funziona con qualsiasi combinazione di tali elementi. –