2011-12-21 8 views
12

Dokonałem mężnej próby złamania kodu źródłowego doom 3. Jedną z rzeczy, na które natknąłem się, jest klasa macierzy używana w całej reszcie rozwiązania. To dość prosty kod do naśladowania, ale podjęto decyzję, której nie byłem w stanie pojąć. Zdecydowali się na zmieszanie kolumn i Major Major Majorors w różnych rozmiarach.Dlaczego Doom3 zamienił główne macierze kolumn i wierszy?

  • 3x3 Matrix jest kolumna głównym
  • Każda inna matryca jest rząd głównym (myślę - nie je wszystkie zaznaczone)

Czy ktoś wie dlaczego ta decyzja mogła być wykonana? Ponieważ OpenGL jest kolumną główną, myślę, że byłoby sensownym po prostu użyć kolumny głównej?

+0

Nie jestem programistą graficznym, ale myślę, że wiersz główny jest bardziej typowy w kodzie, który widziałem, który manipuluje tablicami 2d. Więc może jest to wyłącznie do utrzymania. –

+0

Jak to jest [tag: C] powiązane? – bitmask

+6

Row-major/column-major mają bardzo różny wpływ na zachowanie pamięci podręcznej, w zależności od tego, jakie typy operacji są wykonywane na macierzach. –

Odpowiedz

10

Tak jak już napisał Oli Charles, może to być decyzja o poprawie zachowania buforowania. Macierze OpenGL są kolumną główną, ponieważ po stronie klienta bardziej interesują Cię kolumny niż wiersze (kolumny tworzą podstawę układu współrzędnych). Jeśli jednak macierze są używane do obliczeń, takich jak fizyka lub wykrywanie kolizji, wiele operacji będzie miało większy zasięg. To silnie zależy od rodzaju operacji wykonywanych najczęściej na danej matrycy. Silnik Doom3 intensywnie korzysta z Plücker coordinates, więc wybór właściwego układu pamięci ma bardzo duży wpływ na ogólną wydajność, a prosty przełącznik między większością matrycy może dodać/usunąć znaczną liczbę operacji.

1

mogę się tylko domyślać:

Jeśli dobrze pamiętam, macierz transformacji (co jest 3x3) jest macierzą trzeba najbardziej dla OpenGL. Ponieważ OpenGL jest kolumną główną, ważne jest, aby kolumna z wewnętrzną reprezentacją gry była ważniejsza, więc nie musisz wykonywać dodatkowej pracy za każdym razem, gdy chcesz przekazać macierz 3x3 do OpenGL.

Utrzymanie drugiego rzędu macierzy było prawdopodobnie decyzją projektową. Być może ponownie użyli kodu z innych gier, które już używają wiersza głównego lub ich programiści po prostu wygodniej z nim pracują. Inną możliwością jest to, że wiele operacji, które wykonują na innych macierzach, w przeważającej mierze wykorzystuje rzędy zamiast kolumn. Row major zapewnia lepszy układ pamięci i szybszy czas dostępu. Może się również zdarzyć, że formaty plików będą używać macierzy magazynu jako wiersza głównego.

To dużo "może być" i "jeśli", ale jest to przynajmniej podejście.

Powiązane problemy