Zajmuję się tworzeniem dużej gry, która strumieniuje dane poziomu (w tym shadery) podczas poruszania się po świecie gry. Nie chcę mieć haków w mojej liczbie klatek na sekundę, ponieważ shadery są kompilowane/połączone lub po raz pierwszy są używane.Czy potrafisz wstępnie zdekonfigurować moduł cieniujący na wątku tła z własnym kontekstem?
Mam kompilację shaderów i łączenie działające na osobny wątek z własnym kontekstem otwartym. Ale nie udało mi się uzyskać wstępnego podgrzewania shaderów do pracy nad oddzielnym wątkiem (tak, że nie ma żadnej wydajności, gdy używany jest moduł cieniujący).
Podgrzewanie naprawdę nie jest wspomniane w dokumentach iOS i OpenGL. Jest to jednak wspomniane w OpenGL ES Analyzer (jeden z instrumentów dostępnych podczas profilowania z xcode). W tym narzędziu otrzymuję ostrzeżenie "Shader Compiled Outside Prewarming Phase" za każdym razem, gdy coś jest renderowane za pomocą modułu cieniującego, który nie był wcześniej używany do renderowania czegoś. "Rozszerzony szczegół" mówi:
"OpenGL ES Analyzer wykrył kompilację shaderów, która nie jest częścią fazy wstępnego podgrzewania, a kompilacja shaderów może być czasochłonną operacją, aby ich uniknąć, przedwzmacnij wszystkie shadery używane do renderowania. Aby to zrobić, wykonaj wstępne podgrzewanie po uruchomieniu aplikacji i wykonaj wywołanie rysunku przy użyciu każdego z programów cieniujących, które będą używane, przy użyciu dowolnych ustawień stanu glosu, w których program cieniujący będzie używany w połączeniu z. Stany takie jak mieszanie, maska kolorów, logika ops, multisamping, formaty tekstur i prymitywny stan mogą mieć wpływ na kompilację shaderów. "
Termin "kompilacja" jest tu nieco mylący. Szczyty wierzchołków i fragmentów zostały już skompilowane, a program został połączony. Ale za pierwszym razem, gdy coś jest renderowane z danym stanem OpenGL, robi trochę więcej pracy nad shaderem, aby zoptymalizować go do tego stanu, jak sądzę.
Mam kod do wstępnego rozgrzania shaderów, renderując trójkąt o rozmiarze zerowym przed pierwszym użyciem.
Jeśli kompiluję, łączę i wstępnie rozgrzewam shadery głównego wątku z tym samym kontekstem OpenGL, co normalne renderowanie, to działa. Jednak jeśli zrobię to w wątku tła z jego oddzielnym kontekstem Open GL, to nie działa (nadal otrzymuje ostrzeżenie Analyzera przy pierwszym użyciu).
A więc ... może być tak, że wstępne rozgrzewanie cieniowania w oddzielnym kontekście nie ma wpływu na inne konteksty. Lub może być tak, że nie mam tego samego stanu, który ustanowił oddzielny kontekst. Istnieje wiele potencjalnych stanów Open GL, które mogą wymagać konfiguracji. Używam bufora renderowania poza ekranem w wątku tła, aby można było uznać go za część stanu.
Czy ktoś zdołał wykonać wstępne podgrzewanie działające na wątku tła?
Dzięki za linki. Wiedziałem, że ten problem istniał również na komputerze. Bardziej interesuje mnie to doświadczenie ludzi w OpenGL ES. Jeśli ktoś wykonał tę pracę na iOS lub innej platformie OpenGL ES, to byłoby świetnie wiedzieć. W przeciwnym razie będę musiał uciekać się do opracowania systemu, w którym wstępnie obliczę wszystkie moduły cieniujące, które można wykorzystać na poziomie i kontekście, w którym są używane - a następnie wstępnie je ogrzać podczas początkowego obciążenia. – Namaste
Link do Ati jako wygasł. Nowa: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/ATI_OpenGL_Programming_and_Optimization_Guide.pdf –