mkm napisał/a:Fajnie:) Mam nadzieję, że w przyszłym tygodniu będę miał trochę czasu by zerknąć dokładniej w kod i go przeanalizować. Z tego co widziałem to jest scan line fill, gdzie wyznaczać X1,x2 dla Y'ków i rysujesz H line blitter'em, tak?
Dokładnie tak.. :D
mkm napisał/a:Ciekawi mnie czy robiłeś porównanie cpu / blitter dla różnych trójkątów? Robiłem podobny eksperyment kiedyś i dla dużych trójkątów było znacznie szybciej blitter'em, ale już przy małych trójkątach (które są bardziej życiowe o obiektach 3d) inicjalizacja blitter'a była bardziej kosztowna niż zysk z jego prędkości ponad cpu i bardziej opłacało mi się używać cpu dla takich sytuacji. Testy był robiony na szybko więc pewnie dało się tą inicjalizację zrobić szybciej i zniwelować efekt. Ciekaw jestem Twoich odczuć i czy robiłeś takie porównania praktyczne? (nie chodzi mi o teoretyczne timingi)
Spróbujemy jednak teoretycznie na początek, ok? :P Nadmiarowy kod dla blittera to:
asr.w #3,d3
move.w d1,endmsk1(a6)
move.l d4,xCount(a6)
move.b #$a0,lineNum(a6); HOG
w przypadku linii poniżej 16 pikseli i
asr.w #3,d3 ;8+6
addq.w #1,d3 ;4
swap d3 ;4
move.w d5,d3 ;4
move.w d0,endmsk1(a6) ;12
move.w d1,endmsk3(a6) ;12
move.l d3,xCount(a6) ;16
move.b #$a0,lineNum(a6); HOG 16
w przypadku linii powyżej 16 pikseli.
Mamy więc 82 cykle na odpalenie blittera.
Na motorli dochodzi wyliczenie skoku do właściwej długości linii i sam skok. Coś takiego:
move.l linesAdr(a4,d3.w),a5 ;20
jmp (a5) ; 8
and.w d0,d2 ; maski w linii pierwszej wypełniającej +4
and.w d1,d3 ; maski w linii ostatniej wypałniającej +4
Rejestry są z czapy, chodzi o wyliczenia :)
Odejmując wszystko wychodzi, że inicjalizacja blittera zabiera o 46 cykle więcej, a to jest w przybliżeniu 4 "move.w d0,i(a6)" - wypełniania na motoroli. To daje 4*16 = 64 piksele. Tyle w najlepszym przypadku zdąży narysować motorola, zanim blitter weźmie się do pracy. Czyli gdzieś po 80-100 blitter dogoni motorolkę.
Zmiana wypełniania z blittera na motorolkę jest w sumie banalna, więc można sobie napisać procedurę i zobaczyć, czy wyliczenia się potwierdzą. :)
Wydaje mi się, że 1-bitplanowe trójkąty wykorzystuje się jednak do wypełniania prostych (i dużych) figur, bo jeśli chcemy mieć skomplikowany obiekt (który prawdopodobnie nie zmieści się jednej ramce), to warto rozważyć użycie wieloplanowego wypełniania, żeby obiekt odpowiednio pokolorować.