Wskazówki dotyczące optymalizacji OpenGL [zamknięte]

26

Jakie masz wskazówki, aby zwiększyć efektywność OpenGL?

thyrgle
źródło

Odpowiedzi:

16

Użyj VBO zamiast glStart () / glEnd (). Oszczędza to cykli przesyłania danych do pamięci GPU.

MrValdez
źródło
7
Co więcej, glBegin i glEnd zostały wycofane w późniejszych wersjach i zostały całkowicie usunięte (i dlatego nie będą działać) w wersjach 3.xi wyższych. Jeśli poprosisz o kontekst OpenGL 3.x, nie będziesz mógł ich całkowicie użyć.
Slurps Mad Rips
DirectX narzuca ci to, nie ma odpowiednika glStart()/glEnd().
knight666,
@SAHChandler Nie wiedziałem o tym. Nie zdawałem sobie sprawy, że to jest przestarzałe.
MrValdez
3
@SAHChandler: To do bani! Nauczyłem się całego rysowania za pomocą glBegin () i glEnd (). Nieeee !!!
8

Obowiązuje tu również standardowa końcówka profilu, profil, profil, chociaż narzędzia są nieco inne.

gDEBugger świetnie pomaga ci zobaczyć dokładnie, co się dzieje pod maską. Jest to jednak drogie.

Tetrad
źródło
2
Chciałem tylko dodać, że jest teraz bezpłatny.
DMan,
8

Są to odniesienia do dokumentacji Apple na OpenGL, ale każda odrobina pomaga, prawda? ;)

Optymalizacja wydajności OpenGL: podstawy
optymalizacji przepustowości danych OpenGL w systemie OS X

(Ten ostatni to przykładowa aplikacja)
Optymalizacja wierzchołków

Istnieje również bardzo duża liczba filmów na ten temat (także od Apple), które mówią o rozszerzeniach OpenGL. Niektóre z nich są specyficzne dla systemu OS X, ale kilka innych jest bardziej uogólnionych i najprawdopodobniej można je zastosować w systemach Windows i Linux.

Możesz znaleźć filmy tutaj . Jednak do ich przeglądania potrzebujesz iTunes i konta Apple (ale są bezpłatne!: D)

Slurps Mad Rips
źródło
7

Cóż, to naprawdę zależy od tego, co planujesz zrobić, ale oto podstawy:

  • Twój procesor jest bardzo cenny, podczas gdy twój GPU jest głodną bestią. Odsuń jak najwięcej do GPU. Obecnie możesz to zrobić dzięki doskonałym bibliotekom, takim jak OpenCL, CUDA i Thrust.

  • Zrób oświetlenie w shaderze. Pomoże to nie tylko zachować zdrowie psychiczne, ale pozwoli też na bardzo fajne rzeczy, takie jak shadery i odroczone oświetlenie .

  • Cząsteczki ssą. Nawet podczas korzystania ze sprite'ów punktowych OpenGL.

knight666
źródło
6

Zminimalizuj zmiany stanu. Na wielu platformach każda zmiana stanu potencjalnie opróżnia rurociąg. O wiele lepiej jest łączyć podobne produkty razem i raz zmieniać stan.

Dennis Munsie
źródło
4
glEnable(GL_CULL_FACES);

Prosta wkładka, która stosuje ubranie na tylnej powierzchni. Jest to doskonałe do zmniejszania liczby wielokątów. Zobacz także wybijanie frustum / okluzji w celu zmniejszenia liczby zliczeń.

Kolejną rzeczą do rozważenia jest SIMD dla wektorów i czwartorzędów (najczęściej używanych w obrotach aparatu). Jeśli nie chcesz zadzierać z ASM, sprawdź libSIMD, który jest świetną biblioteką do obsługi SIMD w C.

Krankzinnig
źródło
4

Nie używaj glGet *, gdy masz dostęp do zmiennych lokalnych, np .:

  • Nie pytaj o rozmiar tekstur z OpenGL, przechowuj je przy ładowaniu w zmiennych
  • Nie pytaj o szerokości linii / rozmiary punktów w OpenGL, kiedy możesz zapisać zmiany w swojej aplikacji

Te połączenia są bardzo wolne

Przenieś nieużywane rzeczy poza glBegin - klauzula glEnd (czy to glColor, glNormal lub cokolwiek innego), jeśli nie zmienia się w środku. OpenGL jest maszyną stanu, używa ostatniej wartości.

Kromster mówi, że popiera Monikę
źródło
3

Kluczem jest minimalizacja poleceń OpenGL. Musisz więc spakować wszystkie polecenia do rysowania. W przypadku gier 2d dobrym pomysłem jest użycie Altas Texture i narysowanie wszystkich duszków o tej samej teksturze w jednym poleceniu opengl.

Ellis
źródło
Bądź ostrożny. Przydatne są coraz mniejsze partie, ale w zależności od platformy docelowej „zbyt duże” partie zmniejszają wydajność.
Andreas
3

Partia, partia, partia !! (Ab) użyj GPU, aby renderować jak najwięcej w każdym losowaniu. Gry są w większości ograniczone ilością zmian stanu, a nie ilością trójkątów.

Hannesh
źródło