JAK SOBĚ VYROBITI DEMO GRAFICKÉ KU POTĚŠE VLASTNÍ I OSOB OSTATNÍCH (potřetí) Petr Klimovič l.p.1996 Dneska bych nadhodil něco, co se jmenuje vertikální zatemění. K čemu je to dobré? Pokud jste si s paletou trošku vyhráli, určitě jste se dostali do situace, kdy jste si všimli sněžení. Sněžení jsou poruchy v obraze. Prostě sněžení. Kdo to viděl, ví o čem mluvím, kdo to neviděl, časem uvidí. Co s tím? Odkud še beue? (nový JAR). Obraz na monitoru je vykreslován elektronovým paprskem. Je to princip, na kterém fungují všechny obrazovky, tedy i televizní. Paprsek lítá po stínítku stejným stylem jako se čte kniha. První řádek zleva doprava, na konci řádku bleskové přeskočení na začátek dalšího, atd... Na konci obrazovky se paprsek vrací zase na start do levého horního rohu. V době, kdy paprsek přeskakuje mezi řádky, nebo z konce obrazovky na její začátek, musí být zatemněn. Pokud by paprsek nebyl zatemněný, nechával by za sebou stopu, takže by na monitoru byly vidět jeho přeskoky mezi řádky. Jestliže změníte barvu, kterou paprsek vykresluje, zrovna když je někde uprostřed v obrazovém poli, bude se objevovat sněžení. Barvu můžete měnit pouze v době, kdy je paprsek zatemněný, to se totiž nic nekreslí a až začne paprsek zase vykreslovat, kreslí už novou barvou. Na změnu barvy můžete využít horizontální zatemění, to je doba přeskoku o řádek níž, tento časový interval je ale velmi krátký. Jednodušší je počkat si na vertikální zatemnění, to je doba návratu z pravého dolního do levého horního rohu obrazovky. Tato doba je delší a dá se v ní tedy stihnout více věcí. Běžné monitory mají vertikální frekvenci cca 70Hz, to znamená, že zobrazí za sekundu 70 obrazovek, to je 70 vertikálních zatemnění (vert. zatemnění se provádí po každém vykreslení obrazovky) za sekundu. V době zatemnění si můžete s obrazovkou dělat co je libo. Až zatemnění skončí, začne paprsek kreslit novou obrazovku, která bude ukazovat výsledek vaší činnosti. Takže, jak se čeká na vertikální zatemnění (vertical retrace)? Na portu 3DAh najdete hodnotu, jejíž třetí bit udává, zda zrovna probíhá zatemnění. Je-li bit nastaven, znamená to, že paprsek je zrovna zatemněn. Procedura čekající na začátek zatemnění tedy nejdříve musí zjistit, zda retrace zrovna neprobíhá, počkat na jeho případný konec a pak čekat na začátek. Pokud by se nečekalo na konec právě probíhajícího zatemnění, nemám zaručeno, že jsem nechytil retrace třeba těsně před koncem, pak bych nestihl to, co chci během retrace udělat. procedure CekejVert; var Bajt : byte; begin repeat until (Port [3DA] and 8) = 0 {Cekam na konec retrace} repeat until (Port [3DA] and 8) > 0 {Cekam na zacatek retrace} end; Četnost, s jakou váš počítač generuje vertikalní zatemnění, nezávisí na rychlosti vašeho procesoru, je to záležitost VGA karty a monitoru. Většina dnešních karet zobrazuje 70 obrázků za vteřinu a tedy se objevuje retrace také 70 krát za vteřinu. Zkuste si výše uvedenou proceduru zacyklit ve smyčče 700krát. Provedení tohoto programu by pak mělo na všech počítačích trvat 10 sekund. Zkuste následující prográmek. Vyrobil jsem ho, když jsem zjistil, jak je to všechno rychlé. Chtěl jsem tedy zjistit jak přesně to je rychlé. Var Citac : longint; begin Citac := 0; Inline(FA); {Toto je assembler, zakaz preruseni Repeat Until (Port[3DA] and 8) = 0; {Cekani na vertikalni synch.} Repeat Until (Port[3DA] and 8) > 0; {cekam na zacatek synch.} Repeat Inc (Citac); Until (Port[3DA] and 8) = 0; {Pockam do konce synch.} Inline (FB); {STI} {Opet preruseni povolim} writeln ('Citac Zatemnene doby : ',Citac); Citac := 0; Inline(FA); Repeat Until (Port[3DA] and 8) > 0; {Cekani na vertikalni synch.} Repeat Until (Port[3DA] and 8) = 0; {cekam na konec synch.} Repeat Inc (Citac); Until (Port[3DA] and 8) > 0; Inline (FB); writeln ('Ctac kresleni : ',Citac); end. Na mém 386 SXku 33MHz získám následující hodnoty: Citac Zatemnene doby : 17 Citac kresleni : 3647 486 DX/2 66MHz Citac Zatemnene doby : 31 Citac kresleni : 7531 486 DX/2 80MHz Citac Zatemnene doby : 71 Citac kresleni : 16782 Pentium 75 MHz Citac Zatemnene doby : 79 Citac kresleni : 17762 AMD K5 166MHz Citac Zatemnene doby : 123 Citac kresleni : 27645 Tedy poměr kreslení : tma je asi 1 : 214, tedy retrace trvá 214 krát méně, než vykreslení obrazovky. Uvědomte si při tom, jak je vaše mašina ďábelsky rychlá. 70 obrázků za vteřinu, to je jeden obrázek 1/70 = 0.0142857142 sekundy, čili zhruba 1.4 setiny sekundy. Retrace trvá tedy asi 0.000065 sekundy. To máme 65 milióntin sekundy, neboli 65 mikrosekund, kreslení potom ten zbytek, tedy něco přes 1.3 setiny sekundy, to je opět převedeno do rozumných jednotek 13 milisekund. Během 13 milisekund napočítá moje 386 SX 33MHz do 3647. Zajímá mě, jaká čísla vám to hodí na jiných strojích. Pošlete mi prosím vaše výsledky. Díky. Jak je vidět, moc času na zatemnění nemáme. Můžeme si to ještě taky zkusit v assembleru: label l1, l2, l3, l4, l5, l6; var Svetlo, Tma : word; begin asm cli mov bx, 0 mov dx,3DAh l1: in al,dx and al,08h jnz l1 l2: in al,dx and al,08h jz l2 l3: inc bx in al, dx and al, 08 jnz l3 mov [Tma], bx mov bx, 0 l4: in al, dx and al, 8 jz l4 l5: in al, dx and al, 8 jnz l5 l6: inc bx in al, dx and al, 8 jz l6 mov [Svetlo], bx sti end; writeln ('Svetlo: ',Svetlo); writeln ('Tma: ', Tma); end. Pak z toho vyleze tohle: Svetlo: 5882 Tma: 25 5882/3647 = 1.612832465 krát rychlejší 25/17 = 1.470588235 krát rychlejší Assembler je asi o polovinu rychlejší. Pozor! To neplatí univerzálně - o polovinu rychlejší v tomto případě, jindy může být ještě rychlejší, nebo i méně rychlejší, nikdy ovšem nebude pomalejší. Takže máme proceduru, která čeká na zatemnění. Práce s paletou tedy bude fungovat teď tak, že nejdříve počkáte na retrace a pak teprve můžete měnit paletu. Retrace a práce s paletou nám umožní v příštím díle naprogramovat efekt, který znáte z šetřiče dos navigátora, nebo z různých dem. Budeme vyrábět barevný pruh pohybující se v textovém režimu přes písmo... +------------------------------------------------------+ | Petr Klimovič | | Masarykova 857 | | 735 14 Orlová-Lutyně | | | | Internet: http://buut.home.ml.org | | BBS: 69-6512397 (21-16 hod. Víkendy 21-09 hod.) | +------------------------------------------------------+ výheň