Links ::  | DEV web management system | Katalóg | Webhosting | Recepty
  
 Index | Registrácia | Hľadať | Galéria | BoardNeprihlásený užívateľ  //Piatok, 17. Novembra 2017 
Navigation
Index
Top 10 autorov
Top 20 článkov
Hľadať
Galéria

Zones
Asp.(NET)
C/C++
Flash
Grafika+Design
Hardware
Hry
Html/Css/Xml
Java
Linux
Networks
Operačný systém
Pascal/Delphi
PHP
Security
Software
SQL
Visual Basic
Wap/Wml
Windows
Zóna iné

Links
Script index Interval.cz Pc.sk Regedit.sk TipyaTriky.sk Builder.cz Asp.cz Živě.sk Zoznam.sk Code.box.sk Root.cz Quant&Financial

Odkazy

Sessions
Stránky Developer.sk si práve číta 413 čitateľov, z toho je 0 zaregistrovaných

BackEnd
Odkazy na nové články je možné preberať pomocou backend.php

kuk

    Velmi rychla grafika v Pascale

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é 599968x, komentárov: 1
Hodnotenie :    |  Pondelok, 17. Marca 2003

Pridať nový komentár/Komentáre
Vaše hodnotenie :   horšie  lepšie
Login
Login:
Heslo:

Hľadať
 
v článkoch
v diskusiach
v komentároch

Top read
PHP Coder

Priklady v C. 1.čast.

DEV web management system

Php a bezpečnosť skriptov

Autorun CD

Top discuss
Jednoduchý web formulár (ASP.NET)

Delphi seriál: (1.časť)

Velmi rychla grafika v Pascale

DEV web management system

Naša ikona
Páčia sa Vám naše stránky ? Ak áno, podporte nás prosím a umiestnite si na svoju stránku našu ikonku:





Copyright (c) Developer.sk, All rights reserved.
Powered by DEV web management system