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ň