2011-12-21 3 views
12

Ho fatto il coraggioso tentativo di eliminare il codice sorgente di Doom 3. Una delle cose che ho trovato è la classe matrice utilizzata nel resto della soluzione. È un codice abbastanza semplice da seguire, ma è stata presa una decisione che non sono stato in grado di comprendere. Hanno deciso di combinare colonne e major major per diverse dimensioni.Perché Doom3 ha cambiato le matrici principali di righe e colonne?

  • Matrix 3x3 è la colonna principale
  • Ogni altra matrice è importante fila (penso - non li hanno verificato)

Qualcuno sa il motivo per cui potrebbe essere stato preso questa decisione? Dal momento che OpenGL è la colonna principale, penserei che avrebbe senso usare solo la colonna principale?

+0

Non sono un programmatore grafico, ma penso che la riga principale sia più tipica del codice che ho visto che manipola gli array 2d. Quindi forse è puramente per mantenibilità. –

+0

Come è collegato [tag: C]? – bitmask

+6

Riga-maggiore/colonna-principale hanno effetti molto diversi sul comportamento della cache, a seconda dei tipi di operazioni che vengono eseguite sulle matrici. –

risposta

10

Come già commentato da Oli Charlesworth, questa potrebbe essere una decisione per migliorare il comportamento del caching. Le matrici di OpenGL sono colonne maggiori perché sul lato client sei più interessato alle colonne che alle righe (le colonne formano la base di un sistema di coordinate). Se tuttavia le matrici vengono utilizzate per calcoli come la fisica o il rilevamento di collisioni, molte operazioni saranno più importanti. Quindi questo dipende fortemente dal tipo di operazioni per lo più eseguite sulla matrice in questione. Il motore Doom3 fa un uso pesante di Plücker coordinates, quindi la scelta del layout di memoria giusto ha un effetto molto forte sulle prestazioni complessive e un semplice passaggio tra la maggioranza della matrice può aggiungere/rimuovere un numero significativo di operazioni coinvolte.

1

posso solo immaginare:

Se non ricordo male, la matrice di trasformazione (che è 3x3) è la matrice è necessario più per OpenGL. Dato che OpenGL è la colonna principale, ha senso mantenere anche la colonna di rappresentazione interna al gioco, quindi non devi fare altro lavoro ogni volta che vuoi passare una matrice 3x3 in OpenGL.

Mantenere le altre matrici in fila maggiore era probabilmente una decisione di progettazione. Forse hanno riutilizzato il codice di altri giochi che usano già la riga principale, oi loro programmatori si stanno semplicemente più a proprio agio lavorando con essa. Un'altra possibilità è che molte delle operazioni che eseguono sulle altre matrici utilizzano prevalentemente righe anziché colonne. La riga principale offre quindi un layout di memoria migliore e tempi di accesso più rapidi. Potrebbe anche essere che i formati di file utilizzano le matrici dei negozi come riga principale.

È un sacco di "potrebbe essere" e "se", ma è un approccio, almeno.

Problemi correlati