Metoda střídání obrazovek

Radek Štěrba, RASTER

V mnoha programech pracujících s grafikou můžete s výhodou použít metody střídání obrazovek. O jakou metodu je jedná a jak vlastně funguje se Vám budu snažit vysvětlit v tomto článku.

Iluze pohybu vzniká tak, že nakreslený objekt postupně posunujeme po požadované dráze. V praxi se to nejjednodušeji udělá tak, že smažeme objekt na staré pozici a vykreslíme na nové. Základním problémem při jakékoli animaci je moment překreslení staré pozice novou. Počítač totiž vykresluje obraz 50-krát za sekundu (podle momentálního obsahu videopaměti) a může se stát, že než objekt na nové pozici stačíme vykreslit, dojde k zobrazení celé obrazovky. Prakticky se to projeví tak, že grafický objekt jakoby "problikne". Nezáleží na tom, jak rychle dokážeme objekt vykreslit - musíme pouze nějakým způsobem zajistit, aby nedošlo k vykreslení obrazovky v okamžiku, kdy je právě daný objekt smazaný (před tím, než je umístěn na své nové místo).

Princip 1, (aneb VBI vše vyřeší)

Pokud není grafický objekt příliš velký, můžeme stihnout smazat objekt na starém i vykreslit ho na novém místě během VBI. A co se tím vyřeší?

Rutina VBI probíhá v okamžiku, kdy se paprsek, který vykresluje každou 1/50 sekundy obrazovku, vrací z pravého dolního rohu do levého horního. Tím je automaticky zajištěno, že nedojde v okamžiku zpracovávání této rutiny k vykreslování obrazovky a tedy i k výše zmiňovanému "probliknutí".

Zůstává však otázkou, jak velký - popřípadě kolik menších objektů stačíme během jednoho VBI smazat na starém a vykreslit na novém místě. Tady už záleží na "kvalitě" používaných rutin. Čím lepší (rychlejší) rutina, tím více toho stihneme. Přesto jsou i při použití superrychlých rutin možnosti využití tohoto principu prudce omezeny. V žádném případě to ale neznamená, že by nebyl použitelný. Jen tak pro zajímavost - já sám tento způsob používám ve hře Naturix pro vykreslování všech pohybujících se objektů v místnosti (kromě samotné postavy Naturixe).

Princip 2, (neviditelná obrazovka)

Základní myšlenkou této metody je prodloužení doby mezi vykreslováním obrazovky. Doufám, že je Vám jasné, že monitor (obrazovka televizoru) vykresluje obraz 50-krát za sekundu a že počítač to nemůže nijak ovlivnit. Zdánlivě si tedy základní myšlenka protiřečí s tímto faktem.

Ale existuje možnost - použít "neviditelnou" obrazovku.

Princip je jednoduchý: Představte si, že kromě obrazovky, na kterou se díváte existuje ještě jedna, kterou vy nevidíte). Potom stačí použít obvyklý způsob (tz. normálně smazat objekt na starém místě a vykreslit na novém) s tím rozdílem, že to provedeme na té schované "neviditelné" obrazovce. Teprve až jsme se vším hotovi, překreslíme celý obraz z neviditelné obrazovky na tu viditelnou. Prakticky to znamená zkopírovat videopaměť neviditelné obrazovky na videopaměť viditelné. Protože vidět je jen viditelná obrazovka, nemůže dojít k vykreslení obrazovky v okamžiku, kdy na ní grafický objekt není.

Jedna potíž ale stále zůstává. Zkopírování videopaměti celé obrazovky je časově dost náročná operace. V BASICu je to otázka minut a ani strojová rutina to nestihne za čas menší než 1/50 sekundy. Hrozí tedy i nyní, že obrazovka bude vykreslena v okamžiku, kdy ještě není celá videopaměť zkopírována. Projevuje se to jakýmsi vodorovným lomem, který se občas objevuje na pohybujícím se objektu. Ve většině případů je však tento lom celkem nenápadný a nepůsobí příliš rušivě.

Princip 3, (ANTIC nám pomůže - střídání dvou obrazovek)

Díky skvělým koprocesorům v počítačích Atari lze princip 2 vylepšit až k dokonalosti. Zobrazovací čip ANTIC umožňuje změnit adresu, která bude použita jako začátek videopaměti při zobrazování. Tuto adresu můžeme změnit okamžitě - jedná se jen o přepsání dvou bytů v DisplayListu (DL), tedy z hlediska časové náročnosti o zanedbatelnou operaci.

Takže princip: Představte si dvě obrazovky (pro názornost si je označíme A a B). Na A se díváme (tu vykresluje ANTIC) a na B kreslíme (tu nevidí nikdo). Až máme na B vykreslenou novou pozici (tj. smazán objekt na starém místě a vykreslen na novém), změníme začátek videopaměti pro zobrazování (v DL) tak, aby ukazoval na obrazovku B. Adresu videopaměti pro určení kam se bude kreslit (tj. obsah adres 88 a 89) nastavíme tak, aby ukazoval na obrazovku A. Nyní tedy ANTIC ukazuje obrazovku B a my kreslíme na A. Až máme vše hotovo, přepneme začátek videopaměti pro zobrazování (v DL) zase na obrazovku A a začátek videopaměti pro kreslení (adresy 88 a 89) na B. Tento postup střídáme pořád dokola.

V každém okamžiku tedy kreslíme na jinou obrazovku, než na kterou se díváme. Nemůže proto dojít k jakémukoliv problikávání či jiným rušivým efektům.

Nesmíme však zapomenout na to, že začátek videopaměti pro zobrazování (v DL) se skládá ze dvou bytů (dolního a horního). Pokud měníme oba tyto byty, musíme zajistit, aby ANTIC nepřečetl DisplayList v okamžiku po změně jednoho bytu a ještě před změnou druhého. Tím pádem by došlo k vykreslení obrazovky dané špatným začátkem videopaměti (který by neukazoval ani na A, ani na B). To lze zajistit provedením změny ve VBI.

Snazším řešením je zvolit začátky videopamětí pro obě obrazovky tak, aby byl jejich dolní byte stejný - pak je vše bez problémů. Obrazovky pak střídáme změnou pouhého 1 bytu!!!

A ještě něco navíc...
Můžete si do RAM umístit ještě třetí obrazovku (označme si ji třeba C), na které budete mít nakreslené pozadí. Potom můžete mít pohybující se objekty před pozadím následujícím způsobem:

  1. Nastavíte A jako viditelnou obrazovku, B pro kreslení.
  2. Obrazovku C překopírujete na B (na B je tedy pozadí).
  3. Na B dokreslíte pohybující se objekty (teď je na B všechno).
  4. Nastavíte B jako viditelnou obrazovku, A pro kreslení.
  5. Obrazovku C překopírujete na A (na A je tedy pozadí).
  6. Na A dokreslíte pohybující se objekty (teď je na A všechno).

A pořád dokola (bod 1 až 6)...

Překopírovávání obrazovky C na A (a na B) Vám bude automaticky zajišťovat i smazávání dokreslovaných objektů.

Pokud budete dokreslovat několik menších pohybujících se objektů, doporučuji vylepšit algoritmus tak, že budete z obrazovky C překopírovávat jen bloky (obdélníky), které jsou na místech dokreslovaných objektů. Zbytek obrazovky A (resp. B) totiž zůstává beze změny, takže je zbytečné ho stále obnovovat. Je to pak sice o něco komplikovanější řešení, ale uspořený čas stojí za to.

Závěrem:
Je pravda, že použití více obrazovek je paměťově náročné, ale jde o velmi efektivní a hojně používanou metodu. Bez střídání obrazovek byste nepoznali žádný letecký simulátor ani hry se spoustou pohybujících se grafických objektů. A nemyslete si, že jde o metodu vhodnou jen pro 8-bitové Atari. Na vyšších počítačích se používá v naprosté většině her.