2013-02-14 14 views
11

Pracuję z OpenGL4.X. Od czasu do czasu czytam this Dokumentacja Apple OpenGLES2, w którym stwierdza się, że używanie przeplatanych tablic atrybutów poprawia wydajność na urządzeniach mobilnych z systemem iOS i jest zalecanym sposobem (zamiast używanie bloków atrybutów).Zwiększenie wydajności za pomocą przeplatanych tablic atrybutów w OpenGL4.0

Dla tych, którzy nie rozumieją, co to znaczy tutaj jest przykład:

Blok atrybutów w pojedynczej macierzy atrybut:

float vertices[]{ 
//Triangle vertices: 

    v0x , v0y , v0z , 
    v1x , v1y , v1z , 
    v2x , v2y , v2z , 

    //Triangle UVs: 

    uv0s , uv0t , 
    uv1s , uv1t , 
    uv2s , uv2t , 

    //Triangle Normals: 
    n0x , n0y , n0z , 
    n1x , n1y , n1z , 
    n2x , n2y , n2z 

} 

Interleaved tablica atrybut:

float vertices[]{ 


    v0x , v0y , v0z , 
    uv0s , uv0t ,   ////vertex 1 attributes 
    n0x , n0y , n0z , 

    v1x , v1y , v1z , 
    uv1s , uv1t ,   ///vertex 2 attributes 
    n1x , n1y , n1z , 

    v2x , v2y , v2z , 
    uv2s , uv2t ,   ///vertex 3 attributes 
    n2x , n2y , n2z 

} 

Moje pytanie brzmi: Czy jest to również prawdziwe dla OpenGL działającego na des Ktop GPU? Jeśli tak, to jak duży może być teoretycznie wzrost wydajności?

+0

możliwy duplikat [w jaki sposób wstawione ułożenie wierzchołków pomaga uzyskać wydajność?] (Http://stackoverflow.com/questions/14535413/how-does-interleaved-vertex-submission-help-performance) – legends2k

Odpowiedz

6

Czy to prawda, że ​​OpenGL działa na procesorach graficznych?

Od Vertex specification wiki page:

Zgodnie z ogólną zasadą, należy użyć przeplatane atrybuty, jeśli możliwe. Oczywiście, jeśli chcesz zmienić pewne atrybuty, a nie inne, to przeplatanie tych, które zmieniają się z tymi, które nie są, nie jest dobrym pomysłem.


jak duży zysk wydajność teoretycznie może być?

Nie mogę na nie odpowiedzieć, ale nie spodziewam się ogromnej poprawy. Jedynym pewnym sposobem jest pomiar.

+0

+1 dla Wiki ref. Zawsze zapominam o jego istnieniu! –

4

Zaletą przeplatanych tablic atrybutów jest lokalizacja pamięci. Oznacza to, że wszystkie niezbędne dane werteksów znajdują się obok siebie i można je bardziej efektywnie pobrać w porównaniu z danymi znajdującymi się w wielu buforach.

Posiadanie duża liczba wierzchołków z wiele atrybutów może manifestować różnicę w wydajności. Wartości dużych i wielu należy ustalić poprzez profilowanie.

+0

To też czytałem ale jak bardzo wpływa to na wydajność w rzeczywistości? Oto jest pytanie. –

+0

@MichaelIV * "W rzeczywistości" *? - Zależy od miliona różnych rzeczy. Jaki sprzęt? Jaki kierowca? Ile atrybutów? Ile wierzchołków? Czy musisz zmieniać pewne atrybuty dynamicznie? Jeśli tak, jak obciążyć karą aktualizację w stosunku do kar pieniężnych w renderowaniu? Co jeszcze robisz w swoim strumieniu, czy jest to związane z pasmem? - Naprawdę, chcesz usłyszeć liczby czy co? –

+0

Myślę, że możesz umieścić coś tak obszernego jako odpowiedź :) –

4

Aby każdy optymalizacji aby być wzrost wydajności, musi najpierw zoptymalizować coś, co jest wydajność gardłem. O ile nie jest to obecnie wąskie gardło, zrobienie czegokolwiek z tego powodu nie musi poprawić wydajności.

Nie ma sposobu, aby odpowiedzieć na pytanie, ponieważ jakiekolwiek zwiększenie wydajności w pierwszej kolejności zależy od tego, czy jest się wąskim gardłem w zakresie wydajności transferu wierzchołków (tj. Co to optymalizuje). Chyba że faktycznie przesuwasz kartę graficzną tak mocno, że twój moduł cieniujący, moduł cieniujący i procesor nie stają się wąskimi gardłami, to nie ma znaczenia.

I nie ma sposobu, aby dowiedzieć się, ile zyski to jest, ponieważ inny sprzęt będzie reagować inaczej. Różne sytuacje będą reagować odmiennie w zależności od tego, jak wąskie gardło jest wąskie.

Po prostu przeprowadź swoje atrybuty. To nic nie kosztuje, wymaga minimalnego czasu lub wysiłku i może nie być banalne pod względem wydajności.

+0

Tak, widzę, ale fakt, że sugerujesz używanie domyślnego przeplatania, prawdopodobnie oznacza, że ​​jest to najlepsza opcja w większości przypadków. –

1

Mogę się mylić, ale moja percepcja jest taka, że ​​GPU potrzebuje danych (wierzchołki, normalne i mapy UV), gdy renderowanie mówi wierzchołek trójkąta, a bufor dla wierzchołków, normalnych i uvmaps jest duży dla obiekt np duża kula (renderowana za pomocą glvertex not glsphere) ...

Procesor graficzny musi się poruszać w kierunku wierzchołków, normalnych i uvmap podczas renderowania małego prostokąta, ponieważ nie może przechowywać wszystkich w buforze wewnątrz samo.

Komunikacja przez magistralę jest zwykle wolniejsza niż szybkość procesora.

Teraz, w tym przypadku, tablice z przeplotem są dużym zyskiem i zmniejszają komunikację magistrali, a procesor graficzny może z łatwością przetwarzać tablice z przeplotem i będzie miał wszystkie dostępne dane dla renderowania określonego zestawu wierzchołków.

Powiązane problemy