Jeśli mam wiele tekstur (powiedzmy ponad 5 map) powiązanych z tą samą jednostką tekstur, czy to działa gorzej dla pamięci podręcznej niż gdybym miał tylko 2 lub 3 tekstury?
źródło
Jeśli mam wiele tekstur (powiedzmy ponad 5 map) powiązanych z tą samą jednostką tekstur, czy to działa gorzej dla pamięci podręcznej niż gdybym miał tylko 2 lub 3 tekstury?
Po prostu dodając do odpowiedzi imalletta , prawdą jest, że zwiększenie liczby dostępów do różnych danych tekstur w module cieniującym zwiększy presję na pamięć podręczną GPU, ale istnieje kilka innych czynników, które mogą znacząco wpłynąć na efekt. Jest to również prawdopodobnie skomplikowane przez fakt, że podobnie jak pamięci podręczne procesora, w GPU może być kilka warstw pamięci podręcznej, tj. Jednostka tekstury <= L0 <= L1 <= .. Pamięć
Jeśli masz scenę, która ma minimalizację danych tekstur, czy to ze względu na perspektywę, czy proste skalowanie i nie korzystasz z mapowania MIP, to uzyskasz aliasing. Nie będzie to tylko tworzenie artefaktów wizualnych; jest bardzo prawdopodobne, że będzie to problem z wydajnością.
Gdy tylko pojawi się aliasing, dostęp do tekstury staje się niespójny, co nie tylko spowoduje przeładowanie pamięci podręcznej, ale także wprowadzi wiele „podziałów stron” DRAM (bardziej poprawnie, podziałów wierszy), co może być kosztowne. Mapowanie MIP pomaga zmniejszyć niespójność.
Być może jest to trochę oczywista opcja, ale jeśli możesz użyć kompresji tekstur (np. DXTn | ETC * | PVRTC * | itd.), Celując od 8bpp do, powiedzmy, 2bpp, możesz znacznie zwiększyć efektywność przepustowości / pamięci podręcznej przez czynniki od 4x do 16x. Teraz nie mogę mówić o wszystkich procesorach graficznych, ale niektóre schematy kompresji tekstur (np. Te wymienione powyżej) są tak proste do dekodowania sprzętowego, że dane mogą pozostać skompresowane w całej hierarchii pamięci podręcznej i mogą zostać zdekompresowane tylko w jednostce tekstury, a zatem skutecznie zwielokrotniając rozmiar tych pamięci podręcznych.
Oczywiście niektóre dane, np. Cele renderowania używane jako dane tekstur w kolejnych rendererach, nie mogą stosować kompresji tekstur. Ilekroć jest to możliwe, używaj najmniejszego formatu pikseli, który wykona zadanie, tj. Jeśli zrobi to RGB 32 / 16bpp (A), nie używaj formatów float 4x32!
Jest to nieco związane z powyższym przykładem aliasingu, ale widzieliśmy przypadki, w których tworzone są duże cele renderowania, ale tylko bardzo rzadko próbkowane. Linie pamięci podręcznej, czy to w procesorach, czy procesorach graficznych, są dość długie, więc jeśli używasz tylko jednego piksela w każdej linii pamięci podręcznej, marnujesz transfery.
Również tekstury skompresowane WRT osiągają kompresję poprzez skuteczne współdzielenie danych między lokalnym regionem tekstur. Jeśli nie masz spójnego dostępu, oprócz zmniejszenia zużycia pamięci, kompresja prawdopodobnie nie pomoże.
Nie tyle problem z pamięcią podręczną (no chyba, że obliczone dostępy są dość niespójne), ale dostępy do tekstur, które nie są bezpośrednio zdefiniowane przez współrzędne UV dostarczone z wierzchołkami, mogą być wolniejsze niż te, które są bezpośrednio zdefiniowane.
Chociaż podejrzewam, że większość tekstur w tych dniach będzie przechowywana w kafelkowym lub podobnym do Mortona (aka Twiddled / Swizzled) porządku (lub nawet kombinacji obu), niektóre tekstury mogą być nadal w kolejności linii skanowania, co oznacza, że obrót tekstura może prowadzić do znacznej liczby braków w pamięci podręcznej / podziałów stron. Niestety tak naprawdę nie wiem, jak rozpoznać, czy dany format jest ułożony w taki sposób.
(Aby przeczytać w tle, wypróbuj The Bluth 's The Truth About Texture Mapping . FWIW, biorąc pod uwagę, że kilka kroków dalej doprowadziło do użycia tekstur rzędu Twiddled (tj. Rzędu Mortona) przynajmniej na wczesnym sprzęcie komputerowym ).
Odpowiedź zależy od tego, co masz na myśli. Nowoczesny sprzęt (np. Z niewiążącymi teksturami) tak naprawdę nie dba o to, ile tekstur jest „związanych”. Prawdziwe pytanie brzmi: ile używasz .
Tekstury zazwyczaj przechowują dane w sposób przyjazny dla pamięci podręcznej (jak sądzę, krzywa Mortona). Jeśli użyjesz więcej tekstur, dostaniesz więcej braków pamięci podręcznej, ponieważ teraz tekstury konkurują ze sobą o miejsce.
To naprawdę sprowadza się do dobrze znanej, heurystycznej aplikacji do programowania cieniowania: dotykanie tekstur jest powolne; nie używaj zbyt wielu.