 Pascal v dnešnej dobe patrí akurát tak do múzea, no podľa mňa je to stále jeden z najlepších "výučbových" jazykov a stále sa učí na niektorých školach(napr aj karlova univerzita:). Preto sa možno bude hodiť vedieť ako vykreslovať rýchlo a ešte rýchlejšie.
Grafika pomocou vkládaného assembleru
V Pascale majú grafiku na starosti grafické ovládače. Sú to práve tie súbory s príponou BGI a pascalisti ich začali používať v dobe, keď grafická karta Herkules bola čosi také, ako v dnešnej dobe GeForce4. Čiže pri práci s grafikou sa vždy obraciame na ovládače, ktoré nie sú súčasťou EXE súboru. Ďalší problém nastáva vo chvíli, keď program pri volaní procedury InitGraph (gd,gm, 'cesta k ovládaču'); hľadá driver v zadanom adresáry. A keď už program konečne rozchodíme, funguje v pohode, ale strašne pomaly. Najlepšie sa teda bude vykašľať na BGIčka a o grafiku sa starať ručne. Najlepšie "asm" spôsobom.
Inicializácia grafického módu
Ten naštartujeme pomocov prerušenia INT 10h a do registra AX hodíme požadované rozlíšenie (VGA režim).
Napríklad : $13 -320x200x256 - grafický, $12 -640x480x16 - grafický alebo $3 -80x25x16 - textový.
Potom spustíme grafiku nasledujúcou procedúrou.
procedure init256;assembler;
asm
mov ax, $0013
int $10
end;
Vykreslenie bodu
V tomto momente už potrebujeme vedieť čo to o VRAM(videopamäť). Je to časť pamäti, kde je uložene všetko to, čo je práve na obrazovke. Pristupujeme do nej rovnako, ako do každej inej, jediný a dosť podstatný rozdiel je v tom, že každou zmenou obsahu sa zmení obsah obrazovky.
V móde 320x200x256 je počiatok VRAM na adrese $A000:0000. Na prvom mieste je farba prvného bodu v prvom riadku, na druhom mieste farba druhého bodu prvného riadku atď. Ak chceme zmeniť farbu bodu so súradnicami x,y v pascale by sme vykonali príkaz: MEM [$A000:x+320*y]:=farba; Keďže asm je asm tu je jednoduchý zdroják:
procedure bod256 (x,y:word;farba:byte);assembler;
asm
jmp @dalej
@vid:
dw $0,$a000
@dalej:
les di,cs:[offset @vid]
mov di,y
mov ax,di
shl di,6
shl ax,8
add di,ax
add di,x
mov al,farba
mov es:[di],al
end;
Tieto procedúry sú oveľa rýchlejšie a umožňujú vytváranie lepšej, rýchlejšej a hlavne plynulejšej grafiky v DOSe.
Existuje však ešte rýchlejší spôsob vykresľovania obrazovky - Virtual Screen. Je to prekrásne rýchly systém, pomocov ktorého nie je problem naprogramovať jednoduchý scrolling! Celá veda jednoducho povedané spočíva vo rýchlom vykresľovaní poľa[0..199,0..319]. VS obsahuje dve procedúry, z ktorých jedna maže spomínané pole a druhá ho vykresľuje. Na nás ostáva už len dorobenie priradenia čísel farieb do poľa. Jediným problémom je to, že naše vykresľovanie bude fungovať len do módu 320x200, v dôsledku obmedzenosti pamäte. Tu sú procedúry a potrebné prvky:
type obrz=array[0..199,0..319] of byte;
var obr:^obrz;
x,y:word;
procedure putpixel(x,y:word;fa:byte);
begin
obr^[y,x]:=fa;
end;
procedure cls;
begin
x:=seg(obr^);
y:=ofs(obr^);
asm
push es
push di
mov ax,[x]
mov es,ax
mov di,[y]
mov cx,32000
xor ax,ax
rep stosw
pop di
pop es
end;
end;
procedure mov;
begin
x:=seg(obr^);
y:=ofs(obr^);
asm
push di
push es
push si
push ds
mov ax,[x]
mov si,[y]
mov ds,ax
mov ax,0a000h
mov es,ax
xor di,di
mov cx,32000
rep movsw
pop ds
pop si
pop es
pop di
end;
end;
begin
new(obr);
...
dispose(obr);
end.
Poľu sa musí priradiť pamät, na začiatku sa MUSÍ nadefinovať a na konci sa MUSÍ zrušiť!
Autor : [skippo], čítané 724528x, komentárov: 1Hodnotenie : |           | | Pondelok, 17. Marca 2003 |
Pridať nový komentár/Komentáre
Vaše hodnotenie : horšie     lepšie |
|