Jak ulepszyê procedurë? (odc. 5.) --------------------------------- CHUNKY PIXEL 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. Miklesz/Damage 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: 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 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.: 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 I na koïcu podstawowej czëôci umieszczamy skok do naszej Copper listy, przeznaczonej do chunky: dc.w COP1LCH,$0000 dc.w COP1LCL,$0000 dc.w COPJMP1,$0000 Naleûy jeszcze odtworzyê poczâtkowy adres Copper listy podstawowej i dalej moûemy juû zaczâê wpisywanie barw: dc.w COP1LCH,$0000 dc.w COP1LCL,$0000 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..."