Bez ograniczeń prędkości


Przed narysowaniem każdego kolejnego punktu jednostka rasteryzująca sprawdza w buforze Z, czy w danym miejscu nie został już wcześniej narysowany obiekt, który jest bliżej obserwatora i zasłania obiekt nowo rysowany. Jeśli dla danego punktu wartość bufora Z wynosi 0 (nic się jeszcze nie pojawiło w danym punkcie) lub narysowane obiekty znajdują się dalej, wówczas ten punkt zostaje zapalony, a jego współrzędna Z zapisana w buforze Z.

Na użytek gier wystarcza bufor Z o 16-bitowej głębi, co pozwala na opisanie ponad 65 tysięcy pozycji w głąb ekranu. W profesjonalnych zastosowaniach stosuje się bufor 24-bitowy.

Poszczególne punkty trafiają do <font color="red">bufora ramki (ang. frame buffer). Gdy już wszystkie informacje o scenie są przesłane do jednostki rasteryzującej, zawartość bufora ramki zostaje wysłana na ekran. Cała procedura rozpoczyna się od nowa - ustawienie geometrii, oświetlenia, nałożenie tekstury. Wszystko zostaje powtórzone kilkadziesiąt razy w ciągu sekundy.

Bez ograniczeń prędkości
Zastosowanie bufora Z pozwala znacząco odciążyć jednostkę rasteryzującą, która w przeciwnym wypadku musiałaby narysować (zupełnie niepotrzebnie) wiele dodatkowych trójkątów. Z drugiej strony, okazuje się, że odwołania do bufora Z niezwykle skutecznie zapychają znaczną część dostępnego pasma pamięci. Jest to problem niezwykle ważny. O jego znaczeniu można się przekonać, porównując osiągi kart opartych na układach Radeon i kart z procesorami GeForce 2 bądź VSA-100. Radeon dysponuje wprawdzie mniejszą mocą, ale zdecydowanie lepiej optymalizuje dostęp do bufora Z. To mu pozwala wykorzystać pełną moc procesora, podczas gdy GeForce i Voodoo duszą się, bo pamięć nie nadąża z przesyłaniem danych do dużo szybszych procesorów.

Okazuje się zresztą, że istnieje wiele problemów, o których producenci nie chcą głośno mówić, a które zdecydowanie ograniczają wydajność karty graficznej. Skoro wiemy już, jak powstaje grafika 3D, przyjrzymy się teraz, dlaczego na razie nie może powstawać szybciej.

Karty z problemami

Nowe technologie w GeForce 2 GTS

W chwili debiutu układu GeForce 2 GTS sporo szumu było wokół jednostki T&L, rzekomo drugiej generacji. W praktyce cały przyrost wydajności tego układu związany jest ze wzrostem częstotliwości taktowania procesora graficznego. Ciekawszym rozwiązaniem jest natomiast technologia określana zazwyczaj skrótem NSR (NVIDIA Shading Rasterizer).

<font color="red">NSR - to odpowiednik technologii, którą ATI nazywa "Pixel Tapestry Architecture". Sprowadza się do tego, że układ GeForce 2 GTS w jednym cyklu zegara może wykonać na pojedynczym pikselu aż 7 różnych operacji, takich jak nakładanie tekstury bazowej, oświetlenia czy warunków atmosferycznych.

<font color="red"> Pełnoekranowy antyaliasing - po raz pierwszy pełnoekranowy antyaliasing (czyli wygładzanie "schodkowych" krzywizn) zastosowała w swoich kartach firma 3dfx. Razem z układem GeForce 2 GTS również nVIDIA wprowadziła tę technologię, choć stosując inne niż 3dfx podejście. Obraz jest renderowany w wyższej od docelowej rozdzielczości i potem skalowany, co eliminuje nieprzyjemne schodki.

Ostatnio wśród producentów układów graficznych (a co za tym idzie, także wśród producentów kart) nastała nowa moda. Polega ona na używaniu przymiotnika "gigapikselowy". Gigapikselowy może być procesor graficzny, a jeśli nie jest, to na pewno po połączeniu kilku procesorów gigapikselowa będzie oparta na nich karta. Jak łatwo się domyśleć, przymiotnik ten odnosi się bezpośrednio do wydajności poszczególnych układów i kart. Opisuje wartość współczynnika wypełniania (ang. fill rate) - parametru informującego, ile pikseli w ciągu sekundy może "wyprodukować" dana karta.

Oddajmy się na chwilę prostym zabawom matematycznych. W rozdzielczości 800x600 obraz składa się z 480 tysięcy punktów. Jeśli założymy, że powinien zostać wyświetlony 100 razy na sekundę, karta musi przygotować w tym czasie 48 milionów punktów, co oznacza, że jej efektywna wydajność wynosi 48 megapikseli. W przypadku rozdzielczości 1600x1200 i tej samej liczby wyświetlanych klatek na sekundę niezbędna efektywna wydajność karty wynosi 192 megapiksele.

Zanim przejdziemy dalej, trzeba jeszcze wyjaśnić, w jaki sposób wyznacza się teoretyczną wydajność karty. Wzór jest bardzo prosty: częstotliwość taktowania procesora graficznego razy liczba potoków renderujących razy (ewentualnie) liczba zainstalowanych procesorów graficznych. Układ GeForce 2 wyposażony jest w cztery potoki renderujące. Wersja "Ultra" taktowana jest z częstotliwością 250 MHz (250 milionów operacji na sekundę). Proste mnożenie 250 milionów razy 4 daje wynik, o którym mówi producent - miliard pikseli na sekundę. Wynika z tego, że układ GeForce 2 Ultra należy do elitarnej grupy układów gigapikselowych. Inny przykład to karta Voodoo 6000. Wyposażona jest w cztery dwupotokowe procesory graficzne taktowane z częstotliwością 166 MHz. Mnożenie daje wynik jeszcze lepszy niż w przypadku GeForce 2 Ultra: 166 milionów razy 2 potoki razy 4 układy daje wydajność rzędu 1,33 gigapiksela.

Natychmiast pojawia się pytanie. Jeśli wydajność karty wynosi Gigapiksel/s, a potrzeba niecałych 200 megapikseli/s, żeby wyświetlić 100 klatek w rozdzielczości 1600x1200 punktów, to dlaczego najszybsze na rynku karty nie wyświetlają 500 klatek na sekundę? Przecież wynika to w logiczny sposób z dzielenia gigapiksela przez 200 megapikseli.

Niestety, sytuacja nie jest tak oczywista, jak się wydaje na pierwszy rzut oka. Po pierwsze, zanim konkretny piksel pojawi się na ekranie, podlega wielu modyfikacjom, na przykład teksturowaniu, oświetleniu itd. Każda z tych operacji wymaga czasu procesora graficznego. Jeśli twórcy grafiki zaplanowali szczególnie zaawansowane efekty, na każdym pikselu wykonuje się nawet 4-5 operacji, zanim zostanie wysłany na ekran. Już teraz widać, że maksymalny współczynnik wypełniania musi być wielokrotnie wyższy od współczynnika efektywnego (wyliczonego na podstawie pikseli faktycznie wyświetlonych na ekranie).

Bez ograniczeń prędkości
Są jeszcze dodatkowe problemy. Po pierwsze, specyfika tworzenia grafiki trójwymiarowej (na podstawie modeli zbudowanych z trójkątów) w wielu sytuacjach zmusza do nieefektywnego wykorzystania zasobów sprzętowych układu graficznego. Dzieje się tak zwłaszcza w przypadku skomplikowanych scen, składających się z tysięcy wielokątów. Wiele tych wielokątów ma wówczas rozmiary jednego piksela lub nawet mniejsze. Trzeba pamiętać, że do jednostki renderującej może zostać przesłany najwyżej jeden wielokąt naraz. Co to oznacza w przypadku układu GeForce 2, wyposażonego w cztery potoki renderujące? Tylko 1 potok jest aktywny, podczas gdy pozostałe 3 czekają bezczynnie. Podobnie zresztą zdarzyłoby się, gdyby wielokąt składał się z 5 pikseli. W pierwszym cyklu zegara aktywne byłby wszystkie 4 potoki, ale na drugi cykl zostaje już tylko 1 piksel do renderowania, co znów sprawia, że 3 potoki są bezczynne.

Przypomnijmy dla porównania, że Radeon (układ produkowany przez ATI) wyposażony jest w 3 potoki renderujące, a VS100 (3dfx) - tylko w 2. Które z tych rozwiązań będzie sobie radzić najefektywniej w przyszłych grach i programach - czas pokaże. Tak czy inaczej, problem pojawia się w przypadku wszystkich popularnych układów graficznych i obniża dość wyraźnie efektywny współczynnik wypełniania.

To nie koniec kłopotów. Prawdziwie wąskim gardłem większości kart graficznych stają się układy pamięci. W nie tak odległych czasach (właściwie przed pojawieniem się kart opartych na pierwszej wersji układu GeForce) przepustowość pamięci zainstalowanej na karcie graficznej nie była problemem - z zapasem wystarczała do tego, żeby układ graficzny pracował w pełni wydajnie. Niestety, sytuacja zmieniła się teraz diametralnie.