Jogl zwiekszenie wydajności przy rysowaniu

0

Witam was drodzy forumowicze dzisiaj mam do was pewne pytanie związane z wydajnością jogla. Mianowicie mój program rysuje pewne rzeczy w openglu i używam do tego walców. Do rysowania walców używam gluta bo w sumie tak jest najłatwiej.W pewnym momencie napotkałem jednak problem. Otóż dołożyłem do mojego programu obsługę myszki i przy przesuwaniu myszka obraca mi się obraz . I problem jest taki że gdy rysuje cylindry cały czas w funkcji display() to zauważyłem nie dość że poważne użycie procesora ( rzędu 60%) to obraz nie przesuwa mi sie płynnie tylko odrobinę sie przycina i przesuwa sie zdecydowanie wolniej niż gdy użyje tak zwanych displaylist. Lecz ich użycie blokuje mi całkowicie możliwość dynamicznej zmiany obrazu w openglu na czym trochę mi zależy. Wiecie może co z tym zrobić?

0

Nie wiem dokładnie jak jest zaimplementowany GLUT w JOGLu, ZTCW jest on przepisany w Javie. Być może za każdym razem alokuje np nowy Direct IntBuffer, albo np wysyła int[] do OpenGLa. Obydwie operacje są kosztowne - alokowanie Direct Buffer w Javie trochę zajmuje (u mnie max można chyba zaalokować 250k Direct Buffers na sekundę), a jeżeli wysyłasz int[] do OpenGLa, to na czas operacji po drugiej stronie JNI musi być wstrzymany GC, bo nie może on ani przesuwać tej tablicy przy odśmiecaniu i defragmentacji pamięci.

Rozwiązanie jest np takie:

  • zaalokuj odpowiednio duży Direct IntBuffer na dane o wierzchołkach,
  • generuj proceduralnie wszystkie figury swoimi funkcjami,
  • wysyłaj dane jako Intbuffer,
  • używaj ponownie ten bufor ile tylko się da, bez alokowania dodatkowych, ew miej pulę takich buforów - chodzi przede wszystkim o zminimalizowanie liczby alokacji Direct Buffers,

Uwaga: Buffer musi być Direct, czyli metoda isDirect() musi zwracać true.

Ja, na potrzeby swojej prymitywnej gierki w OpenGLu, stworzyłem funkcję generującą opis sfery: http://code.google.com/p/sokoj/source/browse/src/my/sokoban/utils/Sphere.java

Innym rozwiązaniem byłoby np użycie najnowszych wersji OpenGLa i ewentualnie OpenCLa, aby generować proceduralnie elementy po stronie GPU i/ lub używać instancjonowania w Geometry Shaderach.

Direct Buffer to mniej więcej coś jak operator new w C++ (z wyjątkiem obowiązku samodzielnej dealokacji chyba) - przez cały czas ta tablica ma stały adres w pamięci i jest w ogóle poza główną stertą Javy. Zwykły nie-Direct Buffer to opakowanie na zwykłą tablicę Javową, więc zysku z tego nie ma przy komunikacji z OpenGLem.

ATSD:
Używasz najnowszego JOGLa ze strony jogamp.org czy przestarzałe wersje z innych stron?

1 użytkowników online, w tym zalogowanych: 0, gości: 1