Historie vývoje počítačových her (109. část – herní konzole Sony PlayStation: dokončení)

2. 1. 2014
Doba čtení: 14 minut

Sdílet

V dnešní části seriálu o historii vývoje her i herního hardware dokončíme popis základních parametrů a vlastností dnes již legendární herní konzole Sony PlayStation. Nejprve se zmíníme o speciálních efektech nabízených grafickým subsystémem a posléze si stručně popíšeme zvukový subsystém i další vlastnosti PSX.

Obsah

1. Historie vývoje počítačových her (109. část – herní konzole Sony PlayStation: dokončení)

2. Další důležité parametry grafického subsystému herní konzole Sony PlayStation

3. Příkazy pro vykreslování a pro konfiguraci grafické pipeline

4. Režimy vykreslování

5. Textury a texturovací jednotka

6. Čip MDEC

7. Geometry Transformation Engine

8. Zvukový subsystém herní konzole Sony PlayStation

9. Odkazy na Internetu

1. Historie vývoje počítačových her (109. část – herní konzole Sony PlayStation: dokončení)

V dnešní části seriálu o historii vývoje her i herního hardware dokončíme popis základních technických parametrů dnes již téměř legendární herní konzole Sony PlayStation. V úvodních kapitolách přímo navážeme na předchozí díl, v jehož závěru byla popsána struktura framebufferu a taktéž všechny typy grafických primitiv (geometrických tvarů a spritů), jejichž vykreslování bylo podporováno přímo v renderovací jednotce (součást GPU). Popíšeme si především různé režimy vykreslování, díky nimž bylo umožněno například simulovat mlhu, poloprůhledné objekty atd. Posléze si alespoň ve stručnosti popíšeme takzvaný GTE (Geometry Transformation Engine), zvukový subsystém a taktéž jednotku CD-ROM, protože právě dobrá podpora této technologie znamenala pro Sony PlayStation velkou konkurenční výhodu v porovnání s některými jinými herními konzolemi páté generace, které využívaly především paměťové moduly (typickým příkladem je Nintendo 64, jehož podrobnějším popisem se budeme zabývat příště).

Minule jsme si mj. řekli, že herní konzole Sony PlayStation je založena na několika čipech vykonávajících veškerou práci při vykreslování dvourozměrného či třírozměrného herního světa i při práci se zvukem a hudbou. Základním čipem je samozřejmě vlastní hlavní mikroprocesor s architekturou RISC (odvozený od čipu R3000A), kterému při práci sekundoval grafický procesor, neboli GPU (Graphics Processing Unit), jenž prováděl vykreslování do framebufferu o kapacitě jednoho megabajtu. Hlavní mikroprocesor sice neobsahoval klasický FPU (jednotku pro práci s hodnotami s plovoucí řádovou čárkou), ovšem namísto toho obsahoval pro herní konzoli mnohem praktičtější modul nazvaný GTE (Geometry Transformation Engine), jenž se používal – jak již ostatně jeho název napovídá – k výpočtům s vektory a maticemi, což jsou operace používané (nejenom) v 3D grafice. Dnes je tato jednotka součástí každého moderního grafického akcelerátoru.

2. Další důležité parametry grafického subsystému herní konzole Sony PlayStation

Činnost GPU (Graphics Processing Unit) v herní konzoli Sony PlayStation lze zjednodušeně popsat následujícím způsobem: GPU postupně načítá vykreslovací a nastavovací příkazy uložené do lineárně vázaného seznamu a každý příkaz postupně provádí (v pořadí odpovídajícímu pořadí načítání příkazů). Pokud se načte vykreslovací příkaz, provede se rasterizace příslušného grafického primitiva (bod, úsečka, obdélník, otexturovaný obdélník, sprite, …) v rasterizační jednotce GPU. Rasterizace spočívá ve vyplnění všech pixelů tvořících obraz grafického primitiva.

Při vykreslování se přitom na základě aktuálně nastaveného režimu může provádět vyplňování obrazu grafického primitiva konstantní barvou (flat shading), interpolace barev vrcholů (Gouraudovo stínování), texturování (vyplňování rastrovým vzorkem), maskování pixelů na základě nejvyššího bitu, tzv. m-bitu uloženého ve framebufferu a konečně pak poněkud zjednodušený, ale v praxi mnohdy zcela dostačující výpočet průhlednosti spočívající v kombinaci původní barvy pixelu (barva pozadí či barva již vykresleného objektu) s nově vykreslovaným pixelem (nový objekt je překreslovaný přes objekt starý).

V případě použití texturování, tj. při vykreslování spritů či otexturovaných obdélníků, se texely (pixely uložené v rastrové textuře) načítaly přímo z framebufferu. Nesmíme ovšem zapomenout ani na čip nazvaný MDEC, neboli plným názvem Motion Decoder. Tento čip umožňoval urychlit dekódování (resp. poněkud nepřesně řečeno dekompresi) rastrových obrázků uložených dle normy JPEG, čehož bylo možné využít například při zobrazování videa uloženého ve formátu MJPEG (Motion JPEG). Podrobnosti o tomto zajímavém čipu, který umožnil ještě ve větší míře využít všech kladných vlastností mechaniky CD-ROM, kterou byla konzole Sony PlayStation vybavena, si uvedeme v šesté kapitole.

3. Příkazy pro vykreslování a pro konfiguraci grafické pipeline

V předchozí části tohoto seriálu jsme se zmínili o několika typech grafických primitiv, jejichž vykreslování je podporováno přímo v hardwarové renderovací jednotce herní konzole Sony PlayStation. Jedná se jak o různé jednoduché geometrické objekty (bod, úsečka, obdélník, polygon), tak i o sprity, jejichž vykreslování bylo rychlejší, než v případě použití obecných otexturovaných obdélníků:

# Typ Geometrie zadána Popis grafického primitiva
1 bod 1 vrchol vykreslení jednoho pixelu zadanou barvou
2 úsečka 2 vrcholy vykreslení úsečky, možnost jednorozměrného Gouraudova stínování
3 polyčára n vrcholů vykreslení sekvence úseček, možnost jednorozměrného Gouraudova stínování
4 obdélník 1 vrchol+rozměry zobrazen rychleji než obecný čtyřúhelník
5 sprite 1 vrchol+rozměry obdélník s texturou, rychlejší než obecný otexturovaný čtyřúhelník
6 polygon 3 nebo 4 vrcholy čtyřúhelník je interně rozdělen na dva trojúhelníky
7 otexturovaný polygon 3 nebo 4 vrcholy opět dochází k rozdělení na dva trojúhelníky

Podle konkrétního typu grafického primitiva rozpoznávala jednotka GPU následující vykreslovací příkazy:

# Kód Délka paketu Typ primitiva
1 0×20 4 bajty jednobarevný polygon zadaný třemi vrcholy
2 0×24 7 bajtů otexturovaný polygon zadaný třemi vrcholy
3 0×28 5 bajtů jednobarevný polygon zadaný čtyřmi vrcholy
4 0×2c 9 bajtů otexturovaný polygon zadaný čtyřmi vrcholy
5 0×30 6 bajtů polygon se třemi vrcholy, každý vrchol může mít odlišnou barvu
6 0×34 9 bajtů otexturovaný polygon se třemi vrcholy, každý má odlišnou barvu
7 0×38 8 bajtů polygon se čtyřmi vrcholy, každý může mít odlišnou barvu
8 0×3c 12 bajtů otexturovaný polygon se čtyřmi vrcholy, každý má odlišnou barvu
9 0×40 3 bajty jednobarevná úsečka
10 0×48 x bajtů obecná polyčára (proměnný počet vrcholů)
11 0×50 4 bajty úsečka, každý její vrchol (počáteční, koncový) může mít odlišnou barvu
12 0×58 x bajtů obecná polyčára (proměnný počet vrcholů) s odlišnou barvou vrcholů
13 0×60 3 bajty obdélník se specifikovanou barvou
14 0×64 4 bajty sprite
15 0×68 2 bajty bod se specifikovanou barvou
16 0×70 2 bajty obdélník o rozměrech 8×8
17 0×74 3 bajty sprite o rozměrech 8×8
18 0×78 2 bajty obdélník o rozměrech 16×16
19 0×7c 3 bajty sprite o rozměrech 16×16

4. Režimy vykreslování

Při pohledu na tabulku s příkazy pro vykreslování jednotlivých typů grafických primitiv je – zejména z údajů o délkách paketů – patrná snaha o to, aby všechny příkazy byly co nejkratší. Z tohoto důvodu zde například najdeme jak příkaz pro kresbu obecného spritu, tak i speciální příkazy pro sprity o velikost 8×8 pixelů a 16×16 pixelů. U některých typů grafických primitiv se zase odlišují příkazy použité ve chvíli, kdy mají všechny vrcholy stejnou barvu a v případě, kdy programátor potřebovat využít interpolaci barvy, neboli Gouraudovo stínování – Gouraud shading (zde je nutné barvu uložit pro každý vrchol zvlášť). Zajímavá je taktéž podpora pro obecné polyčáry, u nichž není dopředu zadán počet vrcholů. Paket může obsahovat libovolný počet vrcholů, přičemž se za posledním vrcholem zapisuje ukončující kód s hodnotou 0×55555555 (který by teoreticky znamenal vrchol na souřadnicích [0×5555, 0×5555]). Pro speciální efekty bylo možné použít i úsečku, v níž měl každý vrchol odlišnou barvu a při vykreslování se tedy musela použít interpolace barvy (jednorozměrná varianta Gouraudova stínování).

Zbývá nám ještě doplnit informaci o barvách grafických primitiv a/nebo jednotlivých vrcholů. Nezávisle na formátu framebufferu byla barva vždy reprezentována 24bitovou hodnotou. Kromě toho ještě každý vykreslovací příkaz obsahoval jednobitovou hodnotu, kterou se zapínala či vypínala poloprůhlednost. Pokud byla průhlednost povolena, mohla rasterizační jednotka použít jeden ze čtyř režimů výpočtu průhlednosti:

Režim Prováděný výpočet
1 1.0 × dest + 0.5 × source
2 1.0 × dest + 1.0 × source
3 1.0 × dest – 1.0 × source
4 1.0 × dest + 0.25 × source

Označením dest je myšlena barva pixelu uložená ve framebufferu, označením source pak barva pixelu vypočtená v rasterizační jednotce.

5. Textury a texturovací jednotka

Textury použité při vykreslování spritů popř. otexturovaných polygonů musí být ještě před začátkem vykreslování uloženy do framebufferu. Podporovány jsou přitom tři formáty uložení. Při použití prvního formátu je každý texel reprezentován šestnácti bity (dvěma bajty), přičemž pro každou barvovou složku RGB bylo použito pět bitů a šestnáctý bit (s nejvyšší váhou) určoval průhlednost či poloprůhlednost texelu. Druhý formát umožňoval do dvou bajtů uložit barvy dvou za sebou jdoucích texelů; v tomto případě byla barva každého texelu určena osmibitovým indexem do barvové palety, v níž byla každá barva reprezentována patnácti bity. Třetí formát byl částečně podobný formátu druhému, ovšem do dvou bajtů se zde ukládaly indexy barvy čtyř texelů. Každý texel tedy mohl být nastaven na jednu z šestnácti barev; výsledkem byly šestnáctibarevné textury s poměrně malými paměťovými nároky (polovičními oproti formátu druhému a dokonce čtvrtinovými oproti formátu prvnímu).

Textury byly ve framebufferu uloženy do takzvaných stránek textur (texture pages) o rozměrech 256×256 texelů. To znamenalo, že souřadnice v prostoru textury (takzvané u-v souřadnice) byly osmibitové, což snižovalo paměťové nároky na uložení vykreslovacích příkazů. Navíc nemělo smysl podporovat textury o větších rozměrech, a to kvůli poměrně malé kapacitě framebufferu (mnoho her používalo například textury o rozměrech 64×64 texelů). Při vykreslování otexturovaných polygonů či spritů bylo nutné načítat texely z framebufferu a ukládat do něj rozrastrovaný grafický objekt. Tyto operace byly samozřejmě náročné kvůli nutnosti několikanásobného přístupu do paměti framebufferu a proto byl grafický subsystém vybaven vyrovnávací pamětí pro textury. V závislosti na použitém režimu mohla tato vyrovnávací paměť obsahovat jednu texturu o rozměrech 32×32 texelů, 32×64 texelů či 64×64 texelů.

6. Čip MDEC

Další důležitou součástí herní konzole Sony PlayStation je čip nazvaný MDEC, neboli plným názvem Motion Decoder. Tento čip byl navržen takovým způsobem, aby umožňoval urychlit dekódování (resp. poněkud nepřesně řečeno dekompresi) rastrových obrázků uložených dle normy JPEG, čehož bylo možné využít například při zobrazování videa uloženého ve formátu MJPEG (Motion JPEG). Dekódování jednotlivých snímků probíhalo po takzvaných makroblocích o velikosti 16×16 pixelů. Vstupní makroblok obsahoval barvy pixelů ve formátu YUV (YCbCr) (složky Cb a Cr měly poloviční frekvenci), které byly zpracovány diskrétní kosinovou transformací (DCT) a následně RLE komprimací (vyšší frekvence v obraze měly uměle sníženou váhu díky kvantizaci).

Obrázek 1: Převod mezi barvovým prostorem RGB a YCbCr (zde světlost pixelu odpovídá úrovním složek Y, Cb a Cr).

Výstupní makroblok vypočtený čipem MDEC obsahoval taktéž hodnoty barev v matici 16×16 pixelů, ovšem již v dekódované podobě a ve formátu RGB (24bpp popř. alternativně 16bpp), což přesně odpovídalo formátu framebufferu.

Obrázek 2: Díky cíleně aplikované kvantizaci je v běžných obrázcích mnoho koeficientů získaných po DCT nulových, což zvyšuje kompresní poměr po aplikaci RLE (Run-Length Encoding).

Díky tomu, že MDEC prováděl pouze operace nad makrobloky a nikoli další komplikovanější činnosti, byla jeho rychlost poměrně vysoká – dosahovala přibližně 9000 makrobloků za sekundu, což při rozlišení 320×240 pixelů umožňovalo zobrazovat video s třiceti snímky za sekundu (300 makrobloků na snímek). Přenos dat do MDEC probíhal přes první DMA kanál, výstup byl do framebufferu ukládán přes druhý DMA kanál.

7. Geometry Transformation Engine

Další součástí herní konzole Sony PlayStation, o níž jsme se již stručně zmínili, je modul nazvaný Geometry Transformation Engine, neboli zkráceně GTE. Tento modul dokázal provádět několik operací nad vektory a maticemi. Při práci s vektory se rozlišovaly obecné vektory se třemi složkami a normálové vektory, tj. vektory s délkou rovnou jedné. Mezi podporované základní operace patřil posun bodu o zadaný vektor (translate), rotace okolo jedné souřadné osy (rotate) a perspektivní transformace, která slouží k projekci vrcholu z trojrozměrného prostoru do dvourozměrné plochy představující plochu obrazovky. Pro provedení rotace, posunu a perspektivní transformace sloužily instrukce typu RTPS/RTPT, násobení vektoru konstantou (skalárem) se provádělo instrukcí typu GPL, pro násobení matice a vektoru instrukce typu MVMVAGTE navíc obsahoval i další speciální instrukce, například pro interpolaci barvy, částečný výpočet barvy na základě Phongova osvětlovacího modelu atd.

Modul GTE obsahoval 32 pracovních registrů a 32 řídicích registrů, přičemž každý z těchto registrů měl šířku 32 bitů. Pracovní a řídicí registry sloužily pro uložení prvků vektorů a matic. V řídicích registrech byl použit formát s pevnou řádovou čárkou, kde většina hodnot byla reprezentována šestnácti bity: jeden bit sloužil pro uložení znaménka, tři bity pro uložení celé části čísla a zbylých dvanáct bitů pro uložení desetinné části čísla. Tento formát byl tedy vhodný především pro reprezentace malých čísel s absolutní hodnotou v rozsahu 0,0 až 7,99975585938 – jde o poměrně ideální formát pro reprezentaci matice rotace, normálových vektorů atd.

8. Zvukový subsystém herní konzole Sony PlayStation

Posledním modulem herní konzole Sony PlayStation, s nímž se dnes seznámíme, je modul nazvaný SPU, neboli celým jménem Sound Processing Unit. Jedná se o modul určený pro generování (stereo) hudby a zvuků a taktéž pro přehrávání hudby uložené na discích CD-ROM (resp. CD-ROM XA, což je technologie, o níž jsme se již zmínili v předchozí části tohoto seriálu). Modul SPU zpracovává zvuková data a dokáže generovat až 24hlasou hudbu či zvuky. Pro uložení zvukových dat slouží buffer o kapacitě 512 kb, v němž jsou zvuková data rozdělena po blocích o velikosti šestnácti bajtů. V těchto blocích jsou uloženy jak vlastní komprimované samply, tak i dvoubajtová hlavička obsahující informaci o formátu samplů atd. První 4kb v bufferu jsou určeny pro uložení zvukových dat načtených z CD-ROM (CD-ROM XA), která jsou navíc částečně digitálně předzpracovaná (nastavení hlasitosti atd.). Formát těchto zvukových dat odpovídá možnostem CD-Audio, tj. jedná se o šestnáctibitové samply se vzorkovací frekvencí 44,1 kHz.

bitcoin školení listopad 24

Zajímavější je ta část modulu SPU sloužící pro generování hudby, tj. nikoli pro pouhé přehrávání samplovaných zvuků uložených na CD-ROM. Jak již bylo řečeno v předchozím odstavci, dokáže SPU vytvářet až 24hlasou hudbu tvořenou 24 generátory. Každý generátor buď přehrává předem připravené samply, šum, popř. může být využit ve funkci frekvenčního modulátoru pro další generátor – tímto způsobem lze tvořit hudbu s využitím frekvenční modulace, tj. podobným způsobem, s jakým jsme se seznámili při popisu herních konzolí čtvrté generace. Z tohoto důvodu obsahuje každý generátor programovatelnou obálku ADSR (Attack, Decay, Sustain, Release), která ovlivňuje hlasitost generovaného signálu. Obálka tvořená čipem SPU má poněkud širší možnosti, než klasické ADSR obálky, protože lze volit i postupný pokles úrovně sustain, která je ve starších generátorech buď konstantní nebo klesající bez možnosti ovlivnit úroveň tohoto poklesu.

Modul SPU se konfiguruje pomocí sady řídicích registrů, s jejichž využitím lze nastavit jak základní parametry (hlasitost pro pravý a nezávisle i pro levý kanál), tak i složitější zvukové efekty, mezi něž patří například parametry již zmíněné ADSR obálky, reverb (a to i pro hudbu čtenou z CD-ROM), parametry dolnopásmové propusti atd. Veškerá práce SPU je přitom zcela nezávislá na činnosti hlavního CPU, ovšem SPU lze nakonfigurovat takovým způsobem, aby se generovalo hardwarové přerušení při přehrání samplů z nějakého zvukového kanálu, takže CPU může například provést rekonfiguraci SPU, vytvořit nové samply apod.

9. Odkazy na Internetu

  1. MIPS Architecture Overview
    http://tams-www.informatik.uni-hamburg.de/applets/hades/web­demos/mips.html
  2. MIPS Technologies R3000
    http://www.cpu-world.com/CPUs/R3000/
  3. Sony PlayStation (Wikipedia)
    http://en.wikipedia.org/wi­ki/PlayStation_(console)
  4. The Official PlayStation muzeum
    http://playstationmuseum.com/pla­ystation-systems/
  5. CPU-collection: IDT R3010 FPU
    http://www.cpu-collection.de/?tn=0&l0=co&l1=ID­T&l2=R3010+FPU
  6. The MIPS R2000 Instruction Set
    http://suraj.lums.edu.pk/~cs423a05/Re­ference/MIPSCodeTable.pdf
  7. Maska mikroprocesoru RISC 1
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC1.jpg
  8. Maska mikroprocesoru RISC 2
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC2.jpg
  9. The MIPS Register Usage Conventions
    http://pages.cs.wisc.edu/~cs354–2/beyond354/conventions.html
  10. C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
    http://www.eecs.berkeley.e­du/Pubs/TechRpts/1982/CSD-82–106.pdf
  11. Berkeley RISC
    http://en.wikipedia.org/wi­ki/Berkeley_RISC
  12. Great moments in microprocessor history
    http://www.ibm.com/develo­perworks/library/pa-microhist.html
  13. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  14. Sega documentation
    http://koti.kapsi.fi/~anti­me/sega/docs.html
  15. 1995 Programming on the Sega Saturn
    http://cowboyprogramming.com/2010/06/03/1995-programming-on-the-sega-saturn/
  16. Sega Myths-Saturn was the most difficult console to program for of 5th Gen
    http://forums.sega.com/show­thread.php?313485-Sega-Myths-Saturn-was-the-most-difficult-console-to-program-for-of-5th-Gen
  17. SuperH RISC engine Family
    http://www.renesas.com/pro­ducts/mpumcu/superh/index­.jsp
  18. Sega Saturn
    http://en.wikipedia.org/wi­ki/Sega_saturn
  19. Jaguar Sector – II
    http://www.jaguarsector.com/index.php
  20. Atari Age: Atari Jaguar History
    http://www.atariage.com/Ja­guar/history.html
  21. Jaguar
    http://www.giantbomb.com/jaguar/3045–28/
  22. Consoles that won't die: The Atari Jaguar
    http://venturebeat.com/2013/04/25/con­soles-that-wont-die-atari-jaguar/
  23. Atari Jaguar and Atari Jaguar CD
    http://videogamecritic.com/ja­guarinfo.htm
  24. Atari Jaguar Documentation (Forum)
    http://www.jaguarsector.com/in­dex.php?showforum=65
  25. Atari Jaguar Programming (Forum)
    http://www.jaguarsector.com/in­dex.php?showforum=63
  26. The Jaguar Underground Documentation
    http://justclaws.atari.or­g/devcats/dox/dox.htm
  27. Blitter (Wikipedia CZ)
    http://cs.wikipedia.org/wiki/Blitter
  28. Blitter (Wikipedia EN)
    http://en.wikipedia.org/wiki/Blitter
  29. Bit blit
    http://en.wikipedia.org/wiki/Bit_blit
  30. Disassembler for the portable Jaguar DSP emulator (zdrojový kód s instrukcemi)
    http://mamedev.org/source/src/e­mu/cpu/jaguar/jagdasm.c.html
  31. Fourth-Generation Consoles
    http://gaming.wikia.com/wiki/Fourth-Generation_Consoles
  32. Fifth-Generation Consoles
    http://gaming.wikia.com/wiki/Fifth-Generation_Consoles
  33. History of video game consoles (fifth generation)
    http://en.wikipedia.org/wi­ki/History_of_video_game_con­soles_(fifth_generation)
  34. Atari Jaguar
    http://gaming.wikia.com/wi­ki/Atari_Jaguar
  35. Atari Jaguar Games
    http://gaming.wikia.com/wi­ki/List_of_Atari_Jaguar_ga­mes
  36. MyMedia Games Network Retrospective – Nintendo Super FX chip
    http://psp.mmgn.com/News/MyMedia-Games-Network-Retrospe-G6W
  37. Wikipedia: Super FX
    http://en.wikipedia.org/wiki/Super_FX
  38. IGN: Top 25 Consoles
    http://www.ign.com/top-25-consoles/13.html
  39. Sega Mega Drive
    http://sega.jp/archive/segahard/md/
  40. The16bit Era Of Console Video Games
    http://tvtropes.org/pmwiki/pmwi­ki.php/Main/The16bitEraOf­ConsoleVideoGames
  41. The Console Wars
    http://www.cracked.com/funny-2590-the-console-wars/
  42. Console Wars
    http://tvtropes.org/pmwiki/pmwi­ki.php/Main/ConsoleWars
  43. Era of the „Bit Wars“
    http://www.gtplanet.net/fo­rum/threads/era-of-the-bit-wars.119796/
  44. Rez Wars: How the Bit Wars never really ended
    http://www.ign.com/blogs/be­astmastertoad/2013/01/31/rez-wars-how-the-bit-wars-never-really-ended
  45. Which system ended the „Bit Wars“?
    http://atariage.com/forum­s/topic/199163-which-system-ended-the-bit-wars/

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.