Při testování hry Brány Skeldalu na různých sestavách jsem narazil na PC, které nemělo SVGA vůbec. Prostě normální VGA. A tak jsem si v rámci "vlastní zábavy" zkusil napsat "ovladač" ve hře pro 640x480x16 v odstínech šedi. Hra totiž běžela v 640x480xhicolor, vyžadovala tedy SVGA a existovala i transformace do 256 barev tam, kde nebyl hicolor. Ale transformace na 16 barev?
Přesně jak se píše v článku, 16-barevná paleta má dvojí transformaci. Obraz se do výhledu maloval po rovinách, a překvapolo mě, jak to bylo pomalé a to nezávisle na typu karty (i na tehdy moderních SVGA). a rychlosti CPU. Bitblt jedné roviny, přepnutí roviny bitblt druhé roviny, přepnutí roviny, atd.... Přesto byly artefakty přepínaní dost vidět. VYpadalo to, jako když se překresluje e-ink display v dnešní době.
K tomu vznikla ještě varianta s X-mode 320x480x256. Tam se dvojice pixelů vedle sebe sloučily do jednoho a podle tabulky se vybral index pixelu odpovídající barvě v palety. Přenášelo se opět po rovinách, a i tady byly vidět artefakty, tentokrát jako když se otáčí vertikální roleta. Ani tady to nebylo rychlé.
Jen na okraj, DOOM používal 320x200 ale jako x-mode. Nezasahoval do časování, ale změnil chování bitových rovin. Využívalo se toho, že se malují sloupce, před každým sloupcem se nastavila aktivní bitová rovina a nakreslil se sloupec. DOOM používal double/triple buffering a právě kvůli nutnosti obsadit celou paměť VGA používal tento režim. V režimu lowres se malovaly dvojice bodů, díky tomu, že VGA umí zápis do dvou rovin současně, ale horizontální rozlišení bylo poloviční.
jj 640x480 je pomaly a hlavne nema ani double buffering. Proto je docela dost her, ktere prepinaly do 640x400 (to neni standard, ale ma stejne casovani jako textovy rezim, az na pomalejsi pixel clock) a tam je mozne double buffering pouzit, protoze pro 64kB bitplanu je k dispozici nejakych 819 radku. Navic 640x400 melo koukatelnejsi frekvenci 70 Hz, ale zase "natazene" pixely.
Přiznám, že mne tady ten assembler baví. Hlavně proto, že já si tyhle cestu prošlapával v Pascalu, a spoustu věcí prostě vyignoroval - počínaje snahou o co nejrychlejší kód.
Šel jsem cestou, kterou se neodvážím nazvat double buffering
: v paměti jsem si připravil příslušné bitplány a ty, řádek po řádku, kopíroval do videopaměti.
Mělo to tři výhody:
- při přípravě jsem se nemusel zabývat přepínáním rovin,
- při kopírování jsem přepínal jen na začátku řádku (každého bitplane),
- mohl jsem snadno pracovat s okny menšími, než byla celá obrazovka.