home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 03 / ami010.txt < prev    next >
Text File  |  1997-04-06  |  11KB  |  293 lines

  1.  
  2.  
  3. Jak ulepszyê procedurë? (odc. 5.)
  4. ---------------------------------
  5.  
  6. CHUNKY PIXEL
  7.  
  8. <lead>Czësto, kiedy piszemy procedurë, zdarza sië sytuacja, ûe
  9. naleûy postawiê znacznâ liczbë punktów, posîugujâc sië
  10. procesorem. Jak wiadomo, operacja, która na "blaszanym" sprowadza
  11. sië do jednego przesîania bajtu, na naszej przyjacióîce rozrasta
  12. sië do pokaúnej wielkoôci procedury.
  13.  
  14. <a>Miklesz/Damage
  15.  
  16. <txt> Co gorsza, jeôli chcemy, aby nasz efekt byî kolorowy, to
  17. wypadaîoby wîâczyê 8 bitplane'ów i na nich wszystkich zapalaê
  18. odpowiednie bity, co dodatkowo spowalnia naszâ rutynë. Co wiëc
  19. poczâê?
  20.  
  21. Wyobraúmy sobie takâ sytuacjë. Mamy na ekranie nastëpujâcy
  22. obrazek (rys. 1.)... Sâ to pionowe paski, kaûdy narysowany w
  23. kolorze o innym numerze, to znaczy, od lewej mamy pasek o numerze
  24. 0, dalej 1, 2, 3 itd. Moûemy ich narysowaê do 255 ($FF), choê jak sië
  25. póúniej okaûe, w praktyce umieszcza sië najwyûej okoîo poîowy
  26. tego. Wracajâc do tematu... Co widzimy na ekranie? Tylko jakieô
  27. róûnokolorowe paski! A dlaczego róûnokolorowe? Bo nie ustawiliômy
  28. odpowiedniej palety. Cóû wiëc robimy? Przypuôêmy, ûe mamy
  29. obrazek, który chcemy wyôwietliê w trybie chunky pixel. Badamy
  30. barwë pierwszego punktu obrazka (0;0) i ustalamy takâ barwë paska
  31. o kolorze 0. Nastëpnie badamy punkt (1;0) i ustalamy pasek o
  32. kolorze 1. Kiedy postâpimy tak z caîâ pierwszâ liniâ (zakîadamy,
  33. ûe mamy tyle samo pasków, ile punktów w linii), to otrzymamy jej
  34. obraz, rozciâgniëty w dóî przez caîy ekran. Szerokoôê danego
  35. punktu jest oczywiôcie równa szerokoôci odpowiadajâcego mu
  36. paska... Trochë to byîo mëtne, ale zapewniam, ûe jeûeli juû tyle
  37. "zaîapiecie", to dalej bëdzie "z górki".
  38.  
  39. Cóû nam daje ta jedna linia rozciâgniëta przez caîy ekran? Otóû
  40. to, ûe uûywajâc Coppera, moûemy operacjë nadawania paskom
  41. odpowiednich kolorów powtórzyê w nastëpnej linii ekranu, dla
  42. drugiej linii obrazka itd. (rys. 2.). Kiedy czynnoôê powtórzymy
  43. dla kaûdego X i Y, to otrzymamy caîy obrazek na ekranie (rys.
  44. 3.).
  45.  
  46. Teraz, kiedy znacie juû zasadë wyôwietlania w trybie chunky
  47. pixel, przedstawië Wam kilka zasad, które naleûy zachowaê, i parë
  48. teoretycznych przykîadów wykorzystania i usprawnienia tego
  49. sposobu.
  50.  
  51. 0. Copper jest doôê wolnym ukîadem i jedna operacja nie zajmuje
  52. nigdy mniej czasu niû wyôwietlenie 8 punktów w trybie low-res, tak
  53. wiëc czësto koderzy decydujâ sië na powiëkszenie w osi Y rozmiarów
  54. piksela, dajâc tym samym wiëcej czasu Copperowi na zmianë
  55. palety.
  56.  
  57. 1. Innym sposobem zwiëkszenia wydajnoôci naszego trybu jest...
  58. zwiëkszenie dîugoôci linii, co daje o kilka zmian kolorów w linii
  59. wiëcej. W standardowym systemie PAL, NTSC lub EURO36 dîugoôê
  60. wyôwietlanej linii równa jest zawsze E1<<1=1C2 punktów low-res, z
  61. czego prosty wniosek, ûe Copper jest w stanie wykonaê maksimum 38
  62. instrukcji. Kiedy jednak wîâczymy bit VARBEAMEN w rejestrze
  63. BEAMCON0, wtedy moûemy zdefiniowaê sobie wîasny tryb
  64. wyôwietlania. Szczególnie waûny jest tutaj rejestr HTOTAL, w
  65. którym ustalamy dîugoôê linii w podwójnych punktach low-resu.
  66. Zdecydowana wiëkszoôê monitorów nie traci synchronizacji nawet
  67. przy dîugoôci EF<<1=1DE, co daje nam 3 B instrukcji w linii.
  68. Poniûej przedstawiam gotowy fragment programu Coppera,
  69. powiëkszajâcy nam wydajnoôê chunky pixel:
  70.  
  71. <l> dc.w HTOTAL, $00EF
  72.  
  73.     dc.w HSSTOP, $000F
  74.  
  75.     dc.w HBSTRT, $0001
  76.  
  77.     dc.w HBSTOP, $0080
  78.  
  79.     dc.w VTOTAL, $0137
  80.  
  81.     dc.w VSSTOP, $002B
  82.  
  83.     dc.w VBSTRT, $010A
  84.  
  85.     dc.w VBSTOP, $002E
  86.  
  87.     dc.w BEAMCON0,$53c0
  88.  
  89.     dc.w HHSTRT, $0000
  90.  
  91. <txt> 2. Jak zapewne wiecie, zmiana barwy w zakresie 12 bitów to
  92. jedna instrukcja, lecz w zakresie 24 bity to juû dwie, wobec tego
  93. stosuje sië raczej skromniejszâ paletë barw, nie tracâc czasu
  94. Coppera na dokîadne "koïcówki" wartoôci natëûeï skîadowych.  Daje
  95. to nam wiëc paletë 1000 kolorów, zamiast 1 000 000. W wiëkszoôci
  96. wypadków jest to jednak w zupeînoôci wystarczajâce.
  97.  
  98. 3. Pamiëtaê naleûy, ûe kaûde obciâûenie DMA moûe niekorzystnie
  99. wpîynâê na szybkoôê Coppera. Dlatego nie naleûy wîâczaê
  100. niepotrzebnych kanaîów i bitplane'ów. Warto teû ustawiê bity
  101. BPAGEM i BLP32 w rejestrze FMODE, co spowoduje, jak powszechnie
  102. wiadomo, szybsze, 64-bitowe przesyîanie danych graficznych i
  103. spadek obciâûenia kanaîów DMA.
  104.  
  105. 4. Pamiëtajmy o tym, ûe rejestry kolorów podzielone sâ na banki,
  106. a o tym, do którego banku aktualnie wpisujemy wartoôci, decydujâ
  107. bity BANK2, BANK1, BANK0 i LOCT w rejestrze BPLCON3. Jeûeli
  108. chcemy wiëc tworzyê obrazki o szerokoôciach wiëkszych niû 20
  109. punktów, to musimy pamiëtaê o zmianie odpowiednich banków. Robimy
  110. to w Copper liôcie, lecz nanoszâc punkty. Istnieje
  111. niebezpieczeïstwo, ûe jako parametr instrukcji zapiszemy jakâô
  112. barwë. Jak ustrzec sië od tego? Sâ dwie metody. Pierwsza, wolna,
  113. lecz dokîadna, polega na stworzeniu tablicy adresów, pod które
  114. dopiero póúniej zapisuje sië barwy. Druga, szybka, lecz
  115. niedokîadna, polega na wpisywaniu danych "jak leci" i dopiero
  116. póúniejszym wypeînieniu na nowo parametrów instrukcji zmian
  117. banków. Jednak naleûy sobie zdawaê sprawë, ûe tracimy tym
  118. sposobem co 21. kolumnë.
  119.  
  120. 5. Obraz narysowany w chunky pixel, moûna bardzo îatwo skalowaê.
  121. Wystarczy zmieniaê szerokoôê kolumn, uzyskujâc skalowanie w osi
  122. X. Moûna teû zmieniaê odlegîoôci pomiëdzy kolejnymi zmianami
  123. palety, uzyskujâc skalowanie w osi Y. Zastanawiaîem sië, czy nie
  124. poôwiëciê temu problemowi trochë wiëcej czasu, ale stwierdziîem,
  125. ûe sprawa jest tak trywialna, ûe nie ma sobie czym zawracaê
  126. gîowy. Tak czy siak, jeûeli jeszcze nie wiecie, jak to wyglâda,
  127. to przyjrzyjcie sië zoomingom w takich moich "wypocinach", jak:
  128. INFTRO 2, U'TRO, NOXZEMA.
  129.  
  130. 6. Kiedy paleta jest zmieniana przez koprocesor graficzny, musimy
  131. byê przygotowani na to, ûe mogâ sië pojawiê pewne niedokîadnoôci,
  132. wynikajâce z tego, ûe w tym samym czasie nastëpuje zmienianie
  133. barw i ich wyôwietlanie. Jak temu zaradziê? Kiedy niedokîadnoôci
  134. sâ zbyt widoczne, stosuje sië coô w stylu trybu double buffer. Na
  135. czym to polega w trybie chunky pixel, spróbujë wyjaôniê: otóû
  136. przypuôêmy, ûe mamy 80 kolorów do zmienienia... Wîâczamy na
  137. zmianë 7 i 8 bitplane'ów, przy czym pamiëtamy, aby wskaúniki
  138. BPL8PTH i BPL8PTL wskazywaîy na zawsze "peîny" bitplane. Kiedy
  139. wyôwietlane sâ kolory 00-7F, to my zmieniamy te od 80-FF, kiedy
  140. wyôwietlane sâ kolory 80-FF, to my operujemy na tych 00-7F.
  141. Proste? Na pewno proste... tylko ûe musimy sië liczyê z tym, ûe
  142. dodatkowy bitplane to dodatkowe obciâûenie DMA!
  143.  
  144. 7. Oprócz wspomnianego przeze mnie powyûej trybu double buffer
  145. dla linii, istnieje, podobnie jak dla bitplane'ów, tryb ten w
  146. odniesieniu do caîych ekranów. Polecam zrealizowaê go w
  147. nastëpujâcy sposób. Naszâ Copper listë zaczynamy od podstawowych
  148. rzeczy, np.:
  149.  
  150. <l> dc.w INTREQ, $8010
  151.  
  152.     dc.w DIWSTRT, $15E1
  153.  
  154.     dc.w DIWSTOP, $9561
  155.  
  156.     dc.w DDFSTRT, $0020
  157.  
  158.     dc.w DDFSTOP, $00C0
  159.  
  160.     dc.w BPL1PTH, $0000
  161.  
  162.     dc.w BPL1PTL, $0000
  163.  
  164.     dc.w BPLCON0, $1200
  165.  
  166.     dc.w BPLCON1, $0000
  167.  
  168.     dc.w BPLCON3, $0020
  169.  
  170.     dc.w BPL1MOD, $0000
  171.  
  172.     dc.w BPL2MOD, $0000
  173.  
  174.     dc.w COLOR00, $0000
  175.  
  176.     dc.w COLOR01, $0FFF
  177.  
  178.     dc.w HTOTAL, $00EF
  179.  
  180.     dc.w HSSTOP, $000F
  181.  
  182.     dc.w HBSTRT, $0001
  183.  
  184.     dc.w HBSTOP, $0080
  185.  
  186.     dc.w VTOTAL, $0137
  187.  
  188.     dc.w VSSTOP, $002B
  189.  
  190.     dc.w VBSTRT, $010A
  191.  
  192.     dc.w VBSTOP, $002E
  193.  
  194.     dc.w BEAMCON0,$53C0
  195.  
  196.     dc.w HHSTRT, $0000
  197.  
  198.     dc.w FMODE, $0003
  199.  
  200.  
  201. <txt>I na koïcu podstawowej czëôci umieszczamy skok do naszej
  202. Copper listy, przeznaczonej do chunky:
  203.  
  204. <l> dc.w COP1LCH,$0000
  205.  
  206.     dc.w COP1LCL,$0000
  207.  
  208.     dc.w COPJMP1,$0000
  209.  
  210. <txt> Naleûy jeszcze odtworzyê poczâtkowy adres Copper listy
  211. podstawowej i dalej moûemy juû zaczâê wpisywanie barw:
  212.  
  213. <l> dc.w COP1LCH,$0000
  214.  
  215.     dc.w COP1LCL,$0000
  216.  
  217. <txt>8. Radzë zwróciê uwagë na to, ûe nie zawsze musimy czekaê
  218. na odpowiedniâ linië, korzystajâc z instrukcji WAIT. Jeûeli tylko
  219. odlegîoôci miëdzy kolejnymi zmianami palety bëdâ w osi Y staîe, a
  220. instrukcje, które wykonuje Copper podczas jednej linii, bëdâ
  221. trwaîy tyle samo co jej wyôwietlenie, to wystarczy raz, na górze,
  222. poczekaê na odpowiedniâ wartoôê X i Y, by nie martwiê sië juû o
  223. poîoûenie promienia wizyjnego...
  224.  
  225. 9. I juû chyba ostatnie przykazanie. Pamiëtajcie, ûe metoda, jakâ
  226. podaîem, nie jest zawsze najlepszâ i jedynâ. Przykîady? Moûemy
  227. czëôê pasków rysowaê na sprite'ach, zamiast na bitplane'ach,
  228. przez co odciâûymy trochë DMA. Kolory moûemy zmieniaê nie
  229. Copperem, ale procesorem. Moûemy teû poîâczyê te dwie metody.
  230. Oprócz tego obraz moûna odbiê w osi Y bâdú powieliê go,
  231. ustawiajâc kopië i oryginaî obok siebie. Moûliwoôci jest wiele.
  232. Wreszcie moûna stawiaê czëôê punktów normalnie na bitplane'ach, a
  233. czëôê na Copperze. W kaûdym razie musicie do kaûdego efektu
  234. dobraê jak najodpowiedniejszâ metodë...
  235.  
  236. Tyle na dzisiaj. W nastëpnym odcinku przedstawië zastosowanie trybu
  237. chunky pixel w efektach typu:
  238.  
  239. -- zoomery
  240.  
  241. -- rotatory
  242.  
  243. -- vibratory
  244.  
  245. -- comanche
  246.  
  247. -- wektorówki cieniowane algorytmem Gourauda
  248.  
  249. -- wektorówki teksturowane
  250.  
  251. Szczególnie tym ostatnim zajmiemy sië w nastëpnym odcinku, a na
  252. teraz zostaîa mi tylko odpowiedú na zadawane mi juû pytanie:
  253. Dlaczego nie doîâczam gotowych procedur-przykîadów do moich
  254. artykuîów? Otóû:
  255.  
  256. 0. Nie po to tîumaczë po 10 razy to czy tamto, ûeby póúniej byle
  257. leniwy lamer wstawiî wîasnâ grafikë i napisaî: "Superejszyn
  258. zómejszyn baj X of Y". Ja wiem, ûe przykîady sâ pouczajâce, ale
  259. jeûeli kogoô bardziej bawi to, ûe obrazek sië zoomuje, niû to, ûe
  260. ON SAM go stworzyî, to ja przepraszam...
  261.  
  262. 1. Skomplikowane procedurki zazwyczaj zajmujâ co najmniej
  263. kilkanaôcie kilo, a wâtpië, czy Ich Wysokoôcie: Bardzo Waûne
  264. Szychy w "Amidze" i LUPUSie, zgodziîyby sië na marnowanie dwóch
  265. stron na jakiô zooming, kiedy moûna wstawiê tam kilka reklam :-).
  266.  
  267. 2. Jeûelibym nawet uzyskaî zgodë na zadrukowanie poîowy
  268. czasopisma úródîami, to komu by sië chciaîo to wklepywaê? Mnie na
  269. pewno nie!
  270.  
  271. 3. Pozostajâ jeszcze dyski public domain, ale te nie wszyscy
  272. kupujâ, nie sâ to przecieû cover dyski!
  273.  
  274. 4. A po ostatnie... Zazwyczaj jak sië pisze procedurë, to nie po
  275. to, aby dziaîaîa samodzielnie, lecz po to, by stanowiîa czëôê
  276. dema, intra. Skutkiem tego jest to, ûe nie raz przystosowanie
  277. procedury do wydania jej jako public domain wymaga dodania
  278. komentarzy, "îadnego" sformatowania i wyrzucenia np. pëtli,
  279. czekajâcej na 5. pattern w module. (Swojâ drogâ, to w moim
  280. wypadku musiaîbym zmieniê mnóstwo "niecenzuralnych" nazw
  281. podprocedur i komentarzy w stylu: ";Modulo zerowe? Hmm... No
  282. chyba raczej nie!" :-).
  283.  
  284. 5. Natomiast jeûeli juû komuô straszliwie zaleûy i MUSI mieê
  285. procedurë, to proszë mnie poszukaê na pierwszym lepszym copy
  286. party, gdyû zazwyczaj urzëdujë sobie w jakimô kâciku z
  287. przywiezionâ Amisiâ peînâ "surówek"...
  288.  
  289. To by byîo tyle "w kwestii formalnej". Ûegnam Was
  290. staroamigowskim: "Amiga Rules, Lores, Hires..."
  291.  
  292.  
  293.