C # Classi matematici astratti dalle biblioteche

3

Attualmente sto scrivendo una libreria che astrae il rendering 3D e usa SharpDX e OpenTK come librerie grafiche. Il problema è che OpenTK e SharpDX hanno le proprie implementazioni di Vector2, Matrix, Quaternion e così via.

Ho trovato 3 possibili modi per affrontare questo problema.

  1. La mia API deve avere sovraccarichi di funzione per entrambi i tipi matematici. Se voglio estendere il codice di rendering di base con caratteristiche di livello più elevato (come una classe Transform che gestisce la posizione, la rotazione e la scala) ho bisogno di preferire l'uno sull'altro o fornire un codice per entrambi i tipi matematici che non è ottimale.

  2. Crea il mio tipo matematico che consente le conversioni tra i tipi SharpDX e OpenTK. Non ottimale neanche perché il codice matematico era già stato scritto due volte. Non dovrei inventare di nuovo la ruota.

  3. Flat out usa solo uno a livello di API e converti solo se necessario. Con questo approccio mi legherei a una libreria che significa che se voglio usare il renderer OpenTK, ma l'API usa i tipi di matematica SharpDX, ho ancora bisogno di avere la libreria SharpDX in giro senza mai usare la parte "grafica" di esso .

Mi sento come l'opzione 2. risulterebbe nel codice di utilizzo più bello ma è il lavoro più richiesto. Sto cercando possibili soluzioni a questo problema oltre alle 3 opzioni che ho menzionato sopra.

    
posta prydain 27.10.2015 - 02:39
fonte

2 risposte

1

Potresti implementare le tue "funzioni di livello superiore" in termini di interfacce astratte come IVector2 , IMatrix , IQuaternion e forse alcune fabbriche astratte come IVector2Factory . Quindi fornisci due adattatori per ciascuna di queste interfacce, basata su SharpDX types e una su OpenTK types. In questo modo, non associ le tue nuove classi all'una o all'altra libreria.

Ovviamente, a un certo livello devi prendere una decisione quale delle due librerie o degli adattatori che intendi utilizzare nel tuo programma finale.

    
risposta data 27.10.2015 - 08:13
fonte
1

Potresti usare un'altra libreria vettoriale, invece di scrivere la tua. Quindi converti in rappresentazioni specifiche della libreria dove necessario.

Microsoft sta lavorando su un'implementazione chiamata System.Numerics.Vectors che può persino ottenere l'accelerazione SIMD.

    
risposta data 27.10.2015 - 09:32
fonte

Leggi altre domande sui tag