Witam wszystkich. Gdy to piszę jest Wielka Sobota. Przedświąteczny klimat tak mnie nastroił, że
postanowiłem coś napisać. Zajmiemy się dzisiaj buforowaniem ekranu.
Wyobraźmy sobie taką sytuację: chcemy zrobić światło latarki latające sobie po ekranie. Najpierw piszemy procedurkę rysującą światełko i później w pętli uruchamiamy ją ze współrzędnymi x,y. Zamiast oczekiwanego pięknego efektu widzimy coś bardzo nieprzyjemnego. Mianowicie na ekranie nie wyświetla się gotowe światełko, tylko powoli, na naszych oczach ono się RYSUJE. To samo dzieje się przy programowaniu skomplikowanych rysunków.
I tu przydaje się buforowanie ekranu.
Buforem ekranu jest jednowymiarowa tablica (obszar w pamięci) o wielkości 64000 bajtów,
bufor : array[0..63999] of byte;
której używamy tak jak ekran. Wszystko co chcemy aby było narysowane na ekranie, malujemy najpierw w niej a dopiero później przesyłamy do pamięci ekranu. Dzięki temu nie będziemy widzieli rysowanego obrazu tylko już gotowca :)
Jeśli czytałeś tekst o trybie 13h to wiesz, że tyle samo co nasz bufor, zajmuje pamięć ekranu w tym trybie. Więc jeśli chcę narysować na ekranie punkt to najpierw wpisuje go do stworzonej wcześniej tablicy (odbywa się to tak jak stawianie piksela na ekranie w 13h czyli x+y*320)
bufor[x+y*320]:=15; -stawi w tablicy biały piksel o współrzędnych x,y
a później przenoszę go na ekran wykorzystując instrukcję mem
mem[$0A000:x+y*320]:=bufor[x+y*320];
(przypominam, że 0A000 to segment, w którym znajduje się pamięć ekranu)
Żeby przenieść cały bufor na ekran należy zrobić takie coś
for x:=0 to 319 do
for y:=0 to 199 do
mem[$0A000:x+y*320]:=bufor[x+y*320];
Przed użyciem bufora można go dla pewności oczyścić
for x:=0 to 319 do
for y:=0 to 199 do
bufor[x+y*320]:=0;
ale nie jest to wymagane.
Jeśli chcemy zrobić więcej niż jeden bufor to zamiast je kilka razy deklarować
var
bufor1 : array[0..63999] of byte;
bufor2 : array[0..63999] of byte;
...
możemy zrobić takie coś
type tablica = array[0..63999] of byte;
i później
var
bufor1 : tablica;
bufor2 : tablica;
...
Można też przy korzystaniu na przemian z kilku buforów zadeklarować je jako zmienne dynamiczne.
var
bufor1 : ^tablica;
bufor2 : ^tablica;
Dzięki temu jeśli jest nam w jakimś momencie potrzebny bufor1, to go tworzymy
(rezerwujemy dla niego pamięć)
new(bufor1);
A gdy przestaje być nam potrzebny to KONIECZNIE usuwamy zarezerwowaną dla niego pamięć.
dispose(bufor1);
Przechowywanie ekranu w buforze jest bardzo dobrym zwyczajem. Wiadomo, że więcej mamy pamięci operacyjnej niż pamięci karty graficznej więc po co rysować w słabszej, jak można w buforze i będzie to o wiele szybsze.
Dzięki temu co się teraz nauczyliśmy będziemy mogli zrobić bardzo ładne efekty graficzne np. ogień, ale to innym razem.
Heniu