home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
03
/
ami010.txt
< prev
next >
Wrap
Text File
|
1997-04-06
|
11KB
|
293 lines
Jak ulepszyê procedurë? (odc. 5.)
---------------------------------
CHUNKY PIXEL
<lead>Czësto, kiedy piszemy procedurë, zdarza sië sytuacja, ûe
naleûy postawiê znacznâ liczbë punktów, posîugujâc sië
procesorem. Jak wiadomo, operacja, która na "blaszanym" sprowadza
sië do jednego przesîania bajtu, na naszej przyjacióîce rozrasta
sië do pokaúnej wielkoôci procedury.
<a>Miklesz/Damage
<txt> Co gorsza, jeôli chcemy, aby nasz efekt byî kolorowy, to
wypadaîoby wîâczyê 8 bitplane'ów i na nich wszystkich zapalaê
odpowiednie bity, co dodatkowo spowalnia naszâ rutynë. Co wiëc
poczâê?
Wyobraúmy sobie takâ sytuacjë. Mamy na ekranie nastëpujâcy
obrazek (rys. 1.)... Sâ to pionowe paski, kaûdy narysowany w
kolorze o innym numerze, to znaczy, od lewej mamy pasek o numerze
0, dalej 1, 2, 3 itd. Moûemy ich narysowaê do 255 ($FF), choê jak sië
póúniej okaûe, w praktyce umieszcza sië najwyûej okoîo poîowy
tego. Wracajâc do tematu... Co widzimy na ekranie? Tylko jakieô
róûnokolorowe paski! A dlaczego róûnokolorowe? Bo nie ustawiliômy
odpowiedniej palety. Cóû wiëc robimy? Przypuôêmy, ûe mamy
obrazek, który chcemy wyôwietliê w trybie chunky pixel. Badamy
barwë pierwszego punktu obrazka (0;0) i ustalamy takâ barwë paska
o kolorze 0. Nastëpnie badamy punkt (1;0) i ustalamy pasek o
kolorze 1. Kiedy postâpimy tak z caîâ pierwszâ liniâ (zakîadamy,
ûe mamy tyle samo pasków, ile punktów w linii), to otrzymamy jej
obraz, rozciâgniëty w dóî przez caîy ekran. Szerokoôê danego
punktu jest oczywiôcie równa szerokoôci odpowiadajâcego mu
paska... Trochë to byîo mëtne, ale zapewniam, ûe jeûeli juû tyle
"zaîapiecie", to dalej bëdzie "z górki".
Cóû nam daje ta jedna linia rozciâgniëta przez caîy ekran? Otóû
to, ûe uûywajâc Coppera, moûemy operacjë nadawania paskom
odpowiednich kolorów powtórzyê w nastëpnej linii ekranu, dla
drugiej linii obrazka itd. (rys. 2.). Kiedy czynnoôê powtórzymy
dla kaûdego X i Y, to otrzymamy caîy obrazek na ekranie (rys.
3.).
Teraz, kiedy znacie juû zasadë wyôwietlania w trybie chunky
pixel, przedstawië Wam kilka zasad, które naleûy zachowaê, i parë
teoretycznych przykîadów wykorzystania i usprawnienia tego
sposobu.
0. Copper jest doôê wolnym ukîadem i jedna operacja nie zajmuje
nigdy mniej czasu niû wyôwietlenie 8 punktów w trybie low-res, tak
wiëc czësto koderzy decydujâ sië na powiëkszenie w osi Y rozmiarów
piksela, dajâc tym samym wiëcej czasu Copperowi na zmianë
palety.
1. Innym sposobem zwiëkszenia wydajnoôci naszego trybu jest...
zwiëkszenie dîugoôci linii, co daje o kilka zmian kolorów w linii
wiëcej. W standardowym systemie PAL, NTSC lub EURO36 dîugoôê
wyôwietlanej linii równa jest zawsze E1<<1=1C2 punktów low-res, z
czego prosty wniosek, ûe Copper jest w stanie wykonaê maksimum 38
instrukcji. Kiedy jednak wîâczymy bit VARBEAMEN w rejestrze
BEAMCON0, wtedy moûemy zdefiniowaê sobie wîasny tryb
wyôwietlania. Szczególnie waûny jest tutaj rejestr HTOTAL, w
którym ustalamy dîugoôê linii w podwójnych punktach low-resu.
Zdecydowana wiëkszoôê monitorów nie traci synchronizacji nawet
przy dîugoôci EF<<1=1DE, co daje nam 3 B instrukcji w linii.
Poniûej przedstawiam gotowy fragment programu Coppera,
powiëkszajâcy nam wydajnoôê chunky pixel:
<l> dc.w HTOTAL, $00EF
dc.w HSSTOP, $000F
dc.w HBSTRT, $0001
dc.w HBSTOP, $0080
dc.w VTOTAL, $0137
dc.w VSSTOP, $002B
dc.w VBSTRT, $010A
dc.w VBSTOP, $002E
dc.w BEAMCON0,$53c0
dc.w HHSTRT, $0000
<txt> 2. Jak zapewne wiecie, zmiana barwy w zakresie 12 bitów to
jedna instrukcja, lecz w zakresie 24 bity to juû dwie, wobec tego
stosuje sië raczej skromniejszâ paletë barw, nie tracâc czasu
Coppera na dokîadne "koïcówki" wartoôci natëûeï skîadowych. Daje
to nam wiëc paletë 1000 kolorów, zamiast 1 000 000. W wiëkszoôci
wypadków jest to jednak w zupeînoôci wystarczajâce.
3. Pamiëtaê naleûy, ûe kaûde obciâûenie DMA moûe niekorzystnie
wpîynâê na szybkoôê Coppera. Dlatego nie naleûy wîâczaê
niepotrzebnych kanaîów i bitplane'ów. Warto teû ustawiê bity
BPAGEM i BLP32 w rejestrze FMODE, co spowoduje, jak powszechnie
wiadomo, szybsze, 64-bitowe przesyîanie danych graficznych i
spadek obciâûenia kanaîów DMA.
4. Pamiëtajmy o tym, ûe rejestry kolorów podzielone sâ na banki,
a o tym, do którego banku aktualnie wpisujemy wartoôci, decydujâ
bity BANK2, BANK1, BANK0 i LOCT w rejestrze BPLCON3. Jeûeli
chcemy wiëc tworzyê obrazki o szerokoôciach wiëkszych niû 20
punktów, to musimy pamiëtaê o zmianie odpowiednich banków. Robimy
to w Copper liôcie, lecz nanoszâc punkty. Istnieje
niebezpieczeïstwo, ûe jako parametr instrukcji zapiszemy jakâô
barwë. Jak ustrzec sië od tego? Sâ dwie metody. Pierwsza, wolna,
lecz dokîadna, polega na stworzeniu tablicy adresów, pod które
dopiero póúniej zapisuje sië barwy. Druga, szybka, lecz
niedokîadna, polega na wpisywaniu danych "jak leci" i dopiero
póúniejszym wypeînieniu na nowo parametrów instrukcji zmian
banków. Jednak naleûy sobie zdawaê sprawë, ûe tracimy tym
sposobem co 21. kolumnë.
5. Obraz narysowany w chunky pixel, moûna bardzo îatwo skalowaê.
Wystarczy zmieniaê szerokoôê kolumn, uzyskujâc skalowanie w osi
X. Moûna teû zmieniaê odlegîoôci pomiëdzy kolejnymi zmianami
palety, uzyskujâc skalowanie w osi Y. Zastanawiaîem sië, czy nie
poôwiëciê temu problemowi trochë wiëcej czasu, ale stwierdziîem,
ûe sprawa jest tak trywialna, ûe nie ma sobie czym zawracaê
gîowy. Tak czy siak, jeûeli jeszcze nie wiecie, jak to wyglâda,
to przyjrzyjcie sië zoomingom w takich moich "wypocinach", jak:
INFTRO 2, U'TRO, NOXZEMA.
6. Kiedy paleta jest zmieniana przez koprocesor graficzny, musimy
byê przygotowani na to, ûe mogâ sië pojawiê pewne niedokîadnoôci,
wynikajâce z tego, ûe w tym samym czasie nastëpuje zmienianie
barw i ich wyôwietlanie. Jak temu zaradziê? Kiedy niedokîadnoôci
sâ zbyt widoczne, stosuje sië coô w stylu trybu double buffer. Na
czym to polega w trybie chunky pixel, spróbujë wyjaôniê: otóû
przypuôêmy, ûe mamy 80 kolorów do zmienienia... Wîâczamy na
zmianë 7 i 8 bitplane'ów, przy czym pamiëtamy, aby wskaúniki
BPL8PTH i BPL8PTL wskazywaîy na zawsze "peîny" bitplane. Kiedy
wyôwietlane sâ kolory 00-7F, to my zmieniamy te od 80-FF, kiedy
wyôwietlane sâ kolory 80-FF, to my operujemy na tych 00-7F.
Proste? Na pewno proste... tylko ûe musimy sië liczyê z tym, ûe
dodatkowy bitplane to dodatkowe obciâûenie DMA!
7. Oprócz wspomnianego przeze mnie powyûej trybu double buffer
dla linii, istnieje, podobnie jak dla bitplane'ów, tryb ten w
odniesieniu do caîych ekranów. Polecam zrealizowaê go w
nastëpujâcy sposób. Naszâ Copper listë zaczynamy od podstawowych
rzeczy, np.:
<l> dc.w INTREQ, $8010
dc.w DIWSTRT, $15E1
dc.w DIWSTOP, $9561
dc.w DDFSTRT, $0020
dc.w DDFSTOP, $00C0
dc.w BPL1PTH, $0000
dc.w BPL1PTL, $0000
dc.w BPLCON0, $1200
dc.w BPLCON1, $0000
dc.w BPLCON3, $0020
dc.w BPL1MOD, $0000
dc.w BPL2MOD, $0000
dc.w COLOR00, $0000
dc.w COLOR01, $0FFF
dc.w HTOTAL, $00EF
dc.w HSSTOP, $000F
dc.w HBSTRT, $0001
dc.w HBSTOP, $0080
dc.w VTOTAL, $0137
dc.w VSSTOP, $002B
dc.w VBSTRT, $010A
dc.w VBSTOP, $002E
dc.w BEAMCON0,$53C0
dc.w HHSTRT, $0000
dc.w FMODE, $0003
<txt>I na koïcu podstawowej czëôci umieszczamy skok do naszej
Copper listy, przeznaczonej do chunky:
<l> dc.w COP1LCH,$0000
dc.w COP1LCL,$0000
dc.w COPJMP1,$0000
<txt> Naleûy jeszcze odtworzyê poczâtkowy adres Copper listy
podstawowej i dalej moûemy juû zaczâê wpisywanie barw:
<l> dc.w COP1LCH,$0000
dc.w COP1LCL,$0000
<txt>8. Radzë zwróciê uwagë na to, ûe nie zawsze musimy czekaê
na odpowiedniâ linië, korzystajâc z instrukcji WAIT. Jeûeli tylko
odlegîoôci miëdzy kolejnymi zmianami palety bëdâ w osi Y staîe, a
instrukcje, które wykonuje Copper podczas jednej linii, bëdâ
trwaîy tyle samo co jej wyôwietlenie, to wystarczy raz, na górze,
poczekaê na odpowiedniâ wartoôê X i Y, by nie martwiê sië juû o
poîoûenie promienia wizyjnego...
9. I juû chyba ostatnie przykazanie. Pamiëtajcie, ûe metoda, jakâ
podaîem, nie jest zawsze najlepszâ i jedynâ. Przykîady? Moûemy
czëôê pasków rysowaê na sprite'ach, zamiast na bitplane'ach,
przez co odciâûymy trochë DMA. Kolory moûemy zmieniaê nie
Copperem, ale procesorem. Moûemy teû poîâczyê te dwie metody.
Oprócz tego obraz moûna odbiê w osi Y bâdú powieliê go,
ustawiajâc kopië i oryginaî obok siebie. Moûliwoôci jest wiele.
Wreszcie moûna stawiaê czëôê punktów normalnie na bitplane'ach, a
czëôê na Copperze. W kaûdym razie musicie do kaûdego efektu
dobraê jak najodpowiedniejszâ metodë...
Tyle na dzisiaj. W nastëpnym odcinku przedstawië zastosowanie trybu
chunky pixel w efektach typu:
-- zoomery
-- rotatory
-- vibratory
-- comanche
-- wektorówki cieniowane algorytmem Gourauda
-- wektorówki teksturowane
Szczególnie tym ostatnim zajmiemy sië w nastëpnym odcinku, a na
teraz zostaîa mi tylko odpowiedú na zadawane mi juû pytanie:
Dlaczego nie doîâczam gotowych procedur-przykîadów do moich
artykuîów? Otóû:
0. Nie po to tîumaczë po 10 razy to czy tamto, ûeby póúniej byle
leniwy lamer wstawiî wîasnâ grafikë i napisaî: "Superejszyn
zómejszyn baj X of Y". Ja wiem, ûe przykîady sâ pouczajâce, ale
jeûeli kogoô bardziej bawi to, ûe obrazek sië zoomuje, niû to, ûe
ON SAM go stworzyî, to ja przepraszam...
1. Skomplikowane procedurki zazwyczaj zajmujâ co najmniej
kilkanaôcie kilo, a wâtpië, czy Ich Wysokoôcie: Bardzo Waûne
Szychy w "Amidze" i LUPUSie, zgodziîyby sië na marnowanie dwóch
stron na jakiô zooming, kiedy moûna wstawiê tam kilka reklam :-).
2. Jeûelibym nawet uzyskaî zgodë na zadrukowanie poîowy
czasopisma úródîami, to komu by sië chciaîo to wklepywaê? Mnie na
pewno nie!
3. Pozostajâ jeszcze dyski public domain, ale te nie wszyscy
kupujâ, nie sâ to przecieû cover dyski!
4. A po ostatnie... Zazwyczaj jak sië pisze procedurë, to nie po
to, aby dziaîaîa samodzielnie, lecz po to, by stanowiîa czëôê
dema, intra. Skutkiem tego jest to, ûe nie raz przystosowanie
procedury do wydania jej jako public domain wymaga dodania
komentarzy, "îadnego" sformatowania i wyrzucenia np. pëtli,
czekajâcej na 5. pattern w module. (Swojâ drogâ, to w moim
wypadku musiaîbym zmieniê mnóstwo "niecenzuralnych" nazw
podprocedur i komentarzy w stylu: ";Modulo zerowe? Hmm... No
chyba raczej nie!" :-).
5. Natomiast jeûeli juû komuô straszliwie zaleûy i MUSI mieê
procedurë, to proszë mnie poszukaê na pierwszym lepszym copy
party, gdyû zazwyczaj urzëdujë sobie w jakimô kâciku z
przywiezionâ Amisiâ peînâ "surówek"...
To by byîo tyle "w kwestii formalnej". Ûegnam Was
staroamigowskim: "Amiga Rules, Lores, Hires..."