Warsztat.GD

Programowanie => Platformy => Platformy mobilne => Wątek zaczęty przez: PsichiX (ΨΧΞ) w Październik 22, 2012, 10:15:52

Tytuł: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 22, 2012, 10:15:52
Witam,
Od jakichś kilku miesięcy portuję xenona na androida i jak dotąd szło dobrz, prawie każdy problem większy znajdował odpowiedź na stackoverflow, aż do teraz. Mianowicie:
Mam ja sobie osobne wątki logiki i renderingu i próbuję stworzyć zasób shadera. Najpierw próbowałem go stworzyć w wątku logiki, ale jak wiadomo, można je tworzyć tylko w wątku renderingu, tak więc też zrobiłem, lecz funkcje tworzące shader nadal zwracają 0 (czyli błąd). Gdzie i jak tworze te shadery:
mam ja sobie system maszyny stanów w wątku logiki, w onEnter() wrzucanego na stos stanu wywołuję coś w stylu:
renderView.queueEvent(new Runnable(){public void run()
{
int id = GLES20.glCreateShader();
// inne akcje i sprawdzanie debugowe czy wartość jest poprawna
}});
wszędzie gdzie widziałęm kod, zasoby były tworzone w onSurfaceCreate() render view, a więc czy jest to koniecznością, aby tylko i wyłącznie w tej metodzie tworzyć zasoby? martwi mnie to, bo to rujnuje system maszyny stanów, który w tym przypadku jest bezużyteczny oraz nie będę mógł w takim przypadku dynamicznie tworzyć i zwalniać zasobów.
Bardzo proszę o podpowiedź, co mogę zrobić, aby poprawnie utworzyć zasoby?
Z góry dziękuję!
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 22, 2012, 10:36:44
Cytuj
lecz funkcje tworzące shader nadal zwracają 0 (czyli błąd)
A błędy z kompilacji sprawdzałeś? Bo jak kompilacja shadera zwraca błąd, to driver powinien się jakoś przed tobą z tego wytłumaczyć.

No i pamiętaj, że na fizycznym urządzeniu nie wiesz jaki driver dostaniesz, więc spodziewaj się wszelkiego rodzaju faili kompilacji. Nawet tam, gdzie shader jest całkowicie poprawny driver może się wysypać. Przykładowo na Samsungu Galaxy S nie polecam w ogóle używać makr ani niczego co zaczyna się od #. Mi w najlepszym przypadku zwracało errory z głupotami, a w najgorszym crashowało aplikację* ze stack tracem pokazującym gdzieś w kod drivera.

*) Efekt taki da się osiągnąć linijką "#define float2 vec2". Nie mam pojęcia jak oni pisali ten kompilator, ale słowo "float" w nazwie makra powoduje crash. Ale nie jest to w praktyce problemem, bo na tym Samsungu makra same z siebie i tak są nie do użytku. Jeżeli potrzebujesz to polecam postawić własny makroprocesor.

EDIT: I żeby nie było: crashujący shader był 100% poprawny - przechodził walidację przez malisc i działał poprawnie na ARMowym emulatorze OpenGL ES 2.0.


I tak - spodziewaj się więcej faili tego rodzaju, zależnych od konkretnego modelu sprzętu i drivera. All the joy of GLSL. :)


Cytuj
wszędzie gdzie widziałęm kod, zasoby były tworzone w onSurfaceCreate() render view, a więc czy jest to koniecznością, aby tylko i wyłącznie w tej metodzie tworzyć zasoby?
Nie. Zasoby możesz tworzyć w dowolnym momencie, byle w wątku renderującym. Ja załatwiłem to u siebie tak, że wątek UI kolejkuje zdarzenia, które są przetwarzane w momencie callbacka do renderingu z SurfaceView, więc nie muszę się martwić bo mam wszystko w efekcie jednowątkowo. :)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: .:NOXY:. w Październik 22, 2012, 11:13:39
Krzychu dobrze mowi zerknij na logi nie masz pojecia jak na Mobilnych shadery szaleja :) 90% przypadkow z podowu precision jest bo sie typy nie podobaja i ogolnie ogromnego okrojenia sie spodziewaj.
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 22, 2012, 11:21:05
Panowie, jaki log z kompilacji, skoro na glCreateShader() zwraca 0, a nie można kompilować nieistniejącego shadera ;)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 22, 2012, 11:54:02
No nie powiedziałeś które funkcje zwracają zero, to założyłem że te od kompilacji. :)

W takim razie sprawdź, czy w onSurfaceCreated Ci to zadziała. Jeżeli nie, to najwyraźniej problem jest z kontekstem (np. wybrał się ES 1.1), albo w ogóle go nie ma. Jeżeli zadziała, to upewnij się, że tworzysz zasoby po tym, jak już masz kontekst (a nie np. w wątku renderującym ale przed utworzeniem kontekstu). No i generalnie debug log Twoim przyjacielem jest. Jak nie wiesz co się dzieje, to printuj gdzie jesteś i co robisz. A na start chociaż komunikaty o tworzeniu shadera i inicjalizacji kontekstu, żeby mieć pewność że chociaż to jest we właściwej kolejności.
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 22, 2012, 12:16:32
hmm, kontekst na bank tworzy się gles 2.0 i na bank przed odpaleniem maszyny stanów - wymuszona kolejność taka przez silnik, a gdyby nei utworzył się kontekst 2.0 to by wyłączyło apke w ramach zabezpiecznia. Spróbuje jeszcze pobrać tekst z glGetError po glCreateShader - może jakoś pomoże. Aha, całość koduje jak i testuje na urządzeniu (Galaxy Pocket), więc tut też nie mam problemu z różnicami emulator<->device.
Wieczorem dam znać co dały Wasze rady :)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 22, 2012, 21:42:24
cholera, faktycznie zle blokowalem watek logiki poki rendering nie bedzie gotow :0
zastanawia mnie tylko, ze logi kompilacji wygladaja na jakby uciete:
shadery: "compile"
program: "missing main function of shade"
wtf? :D
czy glGetShaderInfoLog() zwraca stringa  kodowaniu innym niz utf-8? oraz z racji, ze debugowo sprawdzam tresc wczytanego shadera  jest on dobry, to czy musze przekoowac tresc z utf-8 na jakies inne kodowanie dla glSetShaderSource()?
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: FoToN w Październik 22, 2012, 23:02:14
Ja miałem u siebie przypadek, że pobrana długość logu nie była zgodna z rzeczywistą. Tzn. jak dałem potem char buffer[512], lub jakiś inny większy kawałek pamięci to dostałem cały log ;)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 22, 2012, 23:34:23
Cytuj
zastanawia mnie tylko, ze logi kompilacji wygladaja na jakby uciete:
shadery: "compile"
program: "missing main function of shade"
Brak fflush(my_file) czy coś w tym stylu? ;)

Cytuj
czy glGetShaderInfoLog() zwraca stringa  kodowaniu innym niz utf-8?
Pewnie zwraca w zwykłym ASCII.

Cytuj
oraz z racji, ze debugowo sprawdzam tresc wczytanego shadera  jest on dobry, to czy musze przekoowac tresc z utf-8 na jakies inne kodowanie dla glSetShaderSource()?
Nie sądzę, żeby zrozumiał UTF-8. Zwłaszcza że żaden ze znaków spoza ASCII nie jest chyba dozwolony w GLSL.
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 24, 2012, 09:39:30
hmm, zastosowałem rady Krzyśka i podziałało wszytko, shadery się ładnei kompilują - dziękuję :)
no to zostało teraz zrobić vbo i tekstury i można tworzyć pierwsze demo gry! :D
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 24, 2012, 09:50:18
hmm, zastosowałem rady Krzyśka i podziałało wszytko, shadery się ładnei kompilują - dziękuję :)
no to zostało teraz zrobić vbo i tekstury i można tworzyć pierwsze demo gry! :D
Do czego Ci VBO w silniku 2D?
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 24, 2012, 10:35:15
do spritebatcha - duuuużo sprajtów będzie i chciałem to zoptymalizować
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 24, 2012, 10:40:48
do spritebatcha - duuuużo sprajtów będzie i chciałem to zoptymalizować
VBO głównie nadaje się do statycznej geometrii. Do geometrii dynamicznej nie będzie to wiele szybsze od Vertex Array, jeżeli w ogóle. Do tego biorąc pod uwagę fakt, że robiąc dynamiczne VBO można coś bardzo łatwo skopać, w takim przypadku osobiście zawsze wybieram VA, które nad dynamicznym VBO może mieć narzut dodatkowego kopiowania (jeżeli robisz Map/Unmap - przy Buffer(Sub)Data VA będzie zawsze niegorsze), ale za to masz pewność, że team od drivera zrobił to w sensowny sposób dla danej architektury i GPU.
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 24, 2012, 11:00:37
mówisz? hmm, w takim razie zostawię wersję z VA, dziękuję za radę!
przy okazji chciałbym spytać, czy używanie shaderów do postprocessingu (z użyciem FBO) na androidowych telefonach jest czymś normalnym i nie powoduje drastycznego spadku wydajności, czy jednak nie zaleca się tego używać póki co?
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Kos w Październik 24, 2012, 11:03:24
Jeśli spritebatch, to dlaczego nie instancing?
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 24, 2012, 11:08:30
nie zabardzo wiem jak to zaimplementować. kiedyś chciałem się za to zabrać na PCtowej wersji silnika, lecz skończyło się fiaskiem - brak dobrej referencji, która pomogłaby mi to ogarnąć.
Albo jestem za głupi na to (ale wątpię..)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 24, 2012, 11:49:53
Cytuj
przy okazji chciałbym spytać, czy używanie shaderów do postprocessingu (z użyciem FBO) na androidowych telefonach jest czymś normalnym i nie powoduje drastycznego spadku wydajności, czy jednak nie zaleca się tego używać póki co?
Postprocessing jest dość kosztowny, ale drobny postprocess możesz sobie pozwolić. Trzeba tylko pamiętać, żeby wszelkie możliwe texcoordy generować w vertex shaderze i pchać do PS przez współrzędne XY - czyli jak robisz blur na 8 sampli to liczysz texcoordy w VS i wrzucasz na 8 varyingów typu vec2. Wtedy GPU jest w stanie prefetchować tekstury jeszcze przed odpaleniem PS.

Jeśli spritebatch, to dlaczego nie instancing?
Jeżeli już odpowiadasz w danym wątku to proponuję przeczytać chociaż pierwsze słowo tytułu. ;)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Kos w Październik 24, 2012, 12:25:04
To nie ma instancingu w ES 2? Nojaaa ._.
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: PsichiX (ΨΧΞ) w Październik 24, 2012, 12:43:52
co do postprocessu to raczej jakieś efekty imitujące światło byłyby do zrobienia, czyli sama proceduralna manipulacja koloru, nawet możliwie bez użycia tekstury. Aczkolwiek metodę na blura, którą opisałeś, stosuję już od dawna w PCtowej wersji, tak więc z nim nie miałbym problemów :)
Tytuł: Odp: [Android] Shadery, osobne wątki, gdzie i jak tworzyć i zwalniać zasoby?
Wiadomość wysłana przez: Krzysiek K. w Październik 24, 2012, 13:03:01
Cytuj
To nie ma instancingu w ES 2? Nojaaa ._.
Nie zaobserwowałem. :) OpenGL ES 2.0 jest mniej więcej na poziomie Shader Model 2.0.

Zawsze możesz, jak to w OpenGL'ach bywa, użyć pseudoinstancingu, ale instancowanie quadów w ten sposób akurat mija się z celem.