[#1] [C,asm] Boby, maski i przesunięcia
Hej.
OD czasu do czasu wracam do C i ASMa (jak już mnie Blitz wkurzy) i próbuję dopracowywać swoją bibliotekę gotowych funkcji. Od niedawna siedzę nad funkcjami blitowania. Po raz pierwszy, bo nigdy się za blitowanie nie brałem. Używam rozszerzenia by Bart/Abyss do VS Code i wszystko idzie prawie dobrze, ale mam wrażenie że czegoś nierozumiem jeśli chodzi o blitowanie.

Mam taki kod (z template'a od Barta/Abyss):
WaitBlit();
custom->bltcon0 = 0xfca | ((x & 15) << ASHIFTSHIFT); 
custom->bltcon1 = ((x & 15) << BSHIFTSHIFT);
custom->bltapt  = src + 4*16*5 ;
custom->bltamod = 0;
custom->bltbpt  = src ; 
custom->bltbmod = 0;
custom->bltcpt  = custom->bltdpt  = (UBYTE*)image + 40 * 5 * ( 200+y ) + x / 8;
custom->bltcmod = custom->bltdmod = (320 - 32) / 8;
custom->bltafwm = 0xffff;
custom->bltalwm = 0;
custom->bltsize = ((16 * 5) << HSIZEBITS) | (32/16);


a tak wygląda mój bob. to czerwone to maska do wycięcia "cookie cut"

bob to 16x16 * 5 bitplanów + maska + wolne miejsce po prawej stronie.
kolor czerwony to kolor 31 - same jedynki na każdym bitplanie.
bitmapa i bob są interleaved.

I ten kod działa bo jest raczej totalnie podstawowy, ale:
1. czy to wolne miejsce po prawej od boba jest potrzebne? tzn tak jest w templacie w VS Code i bez tego miejsca przesunięcia bitowe podczas wycinania boba ((x & 15) << ASHIFTSHIFT); nie działają i bob tak jakby się zapętla, ale może da się to obejść?
2. czy maska musi być tak explicite podana? tzn czy np sam bob nie może być od razu maską? tak mis ię wydaje widziałem w innych przykładach w sieci ale u mnie nie działało.
3. tak zdefiniowany bob zajmuje 4 razy więcej miejsca w pamięci niż jak by była sama kulka, nie mówiąc już że robienie maski dla każdej np klatki animacji boba to będzie udręka.

... czy czegoś nie rozumiem i coś można zrobić inaczej. łatwiej podczas blitowania?
[wyróżniony] [#2] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #1

1. Blitter operuje na słowach, więc bitmapa musi mieć szerokość wielokrotności 16px. Czasami, zwłaszcza przy dziwnych i nierównych wartościach srcx/dstx specyfika blittera powoduje, że potrzebne jest dodatkowe słowo na źródłowej bitmapie. Ale to są przypadki ekstremalne i na 95% tylko potrzebne jak srcX jest nierówne. Na 95% możesz tę swoją bitmapę mieć na szerokość 16px. Problem tylko taki, że żeby wyświetlić tę piłkę np na x=5 to musisz na szerokość blitować na pierwszym jak i drugim słowie bitplanu - pierwszy załatwi piksele x=5..15, drugi 16..21. Bltsize jest pod to ustawione, dlatego tam masz właśnie 32/16. Ustawienie bltmod robi ciche założenie że blit ma szerokość bitmapy, dlatego setowany jest na zero. Musiałbyś ustawić bltamod/bltbmod na -2 żeby to dobrze działało, by po każdej linii blitter wracał na spodziewane miejsce.

2./3. Blitter nie wie co to kolory, podajesz mu bitplane'y źródłowe i jeden docelowy. Mógłbyś mieć 5bpp boba i 1bpp maskę i 5 razy setupować blit, podając każdorazowo jeden bitplane boba i jeden bitplane maski, ale jest to wolne. Zblitowanie "ciurem" jest tylko możliwe jak masz wszystkie bitplane'y przy sobie (najczęściej w formacie interleaved czyli przeplot linii bitplane'ów), ale też wtedy musisz dostarczyć takiej samej wielkości dane maski, stąd maska jest 5bpp. Klasyczna zamiana czasu wykonania na większe zużycie pamięci.

Jest bodaj funkcja systemowa, której możesz powiedzieć który kolor to maska, ale ona wykonuje sporo dodatkowych operacji by najpierw tę maskę wyłuskać do użycia w blicie, co daje dodatkowy narzut przy każdym jej wywołaniu.

Masz dwie opcje:
- zrobić sobie jakiś tool który będzie Ci przygotowywał odpowiednio bitmapy z maską, potem tylko je załączasz/wczytujesz w produkcji i używasz
- robisz to samo, tylko na początku programu i godzisz się na dłuższy loading.

Generalnie blitter to chyba najbardziej skomplikowany element hw Amigi, ogarnięcie w miarę uniwersalnych funkcji do jego używania zajęło mi sporo czasu. To co tam masz to mocno wyspecjalizowany kod, który się rozwali jak zaczniesz w nim dłubać bez przygotowania merytorycznego. Polecam przeczytanie rozdziału o blitterze w Hardware Reference Manual, prześledzenie co ten przykładowy kod faktycznie robi i potem zagmeranie tak, żeby faktycznie to z bitmapą szeroką na 16px w każdym przypadku zadziałało. A jak chcesz gotowca to możesz co nieco wyrypać z ACE ;)


Ostatnia aktualizacja: 03.02.2024 10:14:43 przez teh_KaiN
5
[#3] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #1

1. Jeżeli BOB ma szerokość 16 pikseli, to nie potrzeba tego miejsca po prawej stronie. Jeżeli rysujesz na przecięciu słów (a tak jest zazwyczaj dla BOBów) wystarczy wówczas rozszerzyć rozmiar Blitu o 1 słowo i odjąć 2 od Modulo maski i danych BOBa (kanały A i B Blittera) oraz ostatnie słowo maski (bltalwm) ustawić na 0.

2. Maska potrzebuje zajmować tylko 1 bitplan. Bezproblemowo ją wygenerujesz, za pomocą Blittera. Nie trzeba ich przygotowywać w programie graficznym.

Ostatnia aktualizacja: 03.02.2024 10:18:45 przez Hexmage960
1
[#4] Re: [C,asm] Boby, maski i przesunięcia

@teh_KaiN, post #2

bardzo dziękuję za odpowiedzi
zaraz zabieram się za testowanie z modulo -2 :)

Ale nie zrozumcie mnie źle, że jakoś się przechwalam, czy coś, ale po 8+ latach próbowania kodowania na Amidze coś tam już wiem. wiele z tego co napisał teh-kain już wiedziałem ale to własnie te niuanse o których napisaliście powyżej to jest te ostatnie, najtrudniejsze 20%.
i zgadzam się. blitter jest zagmatwany, ale zaczynam (chyba) rozumieć dlaczego.

btw: jak odnajdę to wkleję linki do fajnych tooli, któŸe znalazłem do konwertowania.

aha no i do ACE zaglądam co jakiś czas ;)

Ostatnia aktualizacja: 03.02.2024 10:36:30 przez c64portal
[#5] Re: [C,asm] Boby, maski i przesunięcia

@Hexmage960, post #3

@HExmage

ad 2)
no tak, ale musi być wtedy *5 aby pokryć całego boba który jest na 5 bitplanach.

co do narzędzi to ostatnio znalazłem i zacząłęm używać tego:
do konwertowania: https://github.com/tditlu/amigeconv
do pakowania: https://github.com/lab313ru/rnc_propack_source
ale chyba widziałem gdzieś konwerter, który robił maski od razu. ktoś zna?
[#6] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #5

ad 2)
no tak, ale musi być wtedy *5 aby pokryć całego boba który jest na 5 bitplanach.

Tak jest jeżeli chcesz narysować BOBa w formacie interleaved za pomocą jednej operacji Blittera.

Maska wtedy się powtarza i zajmuje 5 razy więcej pamięci niż potrzeba. Kolega Teh_KaiN o tym pisał.

Wystarczy, że maska będzie mieć 1 bitplan i rysujesz po jednym bitplanie BOBa, tak jak jest zazwyczaj.
[#7] Re: [C,asm] Boby, maski i przesunięcia

@Hexmage960, post #6

Wystarczy, że maska będzie mieć 1 bitplan i rysujesz po jednym bitplanie BOBa, tak jak jest zazwyczaj

no tak ale wtedy robię 5 blitów co wg mnie jest wolniejsze. czy nie jest?
tak robi Blitz i od tego staram się uciec (idąc w C).
No właśnie wychodzi że coś za coś, albo więcej pamięci, albo szybciej :)

Ostatnia aktualizacja: 03.02.2024 11:38:49 przez c64portal
[#8] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #7

Rysujesz dokładnie tyle samo danych graficznych, tylko że nie w 1 a w 5 krokach.

Jeżeli grafika ma np. rozmiar 32x32 to nie powinno być żadnej różnicy w prędkości. Bitplan ma wtedy 64 słowa pamięci, czyli tyle co 16x16 w 4 bitplanach.

W przypadku małych obiektów jak 16x16 faktycznie rozmiar jednego bitplanu BOBa jest niewielki (16 słów pamięci), ale nadal opłaca się według mnie podzielić rysowanie na bitplany.

Ostatnia aktualizacja: 03.02.2024 12:08:35 przez Hexmage960
[#9] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #5

ACE taki ma, nazywa się bitmap_conv. Robi z dwie bitmapy - jedna zawiera maskę, druga obraz. Tylko że output jest wyłącznie w ACE'owym formacie. Jak się nie boisz ceplusplusa to sobie tę desktopową aplikację możesz przerobić pod swoje potrzeby.

no tak ale wtedy robię 5 blitów co wg mnie jest wolniejsze. czy nie jest?


Jest cholernie wolne bo co prawda blitter pracuje tyle samo czasu, ale raz że musisz go N razy setupować, dwa że musisz N-1 razy czekać aż skończy swoje, przeważnie nie robiąc nic (chyba że sprytnie ułożysz kod) zanim każesz mu zrobić następny bitplan. Rysując w interleaved puszczasz raz rysowanie boba, robisz po drodze logikę kolejnego, i jak dochodzi do jego rysowania to najczęściej już blitter skończył, albo czekasz tylko krótką chwilę.

Ostatnia aktualizacja: 03.02.2024 13:40:55 przez teh_KaiN
[#10] Re: [C,asm] Boby, maski i przesunięcia

@teh_KaiN, post #9

Jest cholernie wolne

tak żech coś czuł ;)

a przy okazji to zrobiłem sobie skrypcik (banalny) który mi produkuje maski i skleja png + maska w jeden plik.
robię to przy użyciu pakietu ImageMagic (convert).
1
[#11] Re: [C,asm] Boby, maski i przesunięcia

@teh_KaiN, post #2

Ja bym od siebie dodał w sprawie generowania w grze maski boba na podstawie boba. Oprócz tego że loading trwa to dłużej (jak to zostało napisane) i co zależy od ilości bobów, to jest plus taki że oszczędzasz miejsce na dysku. Chociaż w dobie dysków twardych może to nie być duży plus. Acz uważam, że warto to wziąć pod rozwagę.

Ostatnia aktualizacja: 03.02.2024 21:23:04 przez asman
1
[#12] Re: [C,asm] Boby, maski i przesunięcia

@asman, post #11

Mam kolejne jeszcze pytanie, aby już nie zakładać nowego wątku zadam tutaj.

Chcę scrollować bitmapę interleaved w bok (prawo) bo przymierzam się do zrobienia cork-screw scrolla, ale o ile w bitmapie z bitplanami jeden-po-drugim to działa to tutaj jak bitmapa się zawija to bitplany są przesunięte o linię i kolory zaczynają się oczywiście kaszanić. Jest na to jakiś sposób? Czy cork-screw nie zadziała z interleaved?
TIA
[#13] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #12

Zadziała. To że kaszanią Ci się kolory, to jest wynik tego, że jako bitplane 0 zaczyna być wyświetlana zawartość która wcześniej szła jako bitplane 1 itd. Ale to absolutnie w niczym nie przeszkadza. Po prostu rysuj nowe rzeczy biorąc pod uwagę to przesunięcie. A właściwie nie musisz nic w matmie zmieniać, tylko podanie X większego niż bitmapa przewiduje zrobi swoje. ;)
1
[#14] Re: [C,asm] Boby, maski i przesunięcia

@teh_KaiN, post #9

Hej, ja nigdy w przypadku BOBów nie korzystałem z trybu interleaved i nie miałem kłopotów. Jeżeli BOB jest odpowiednio duży to jest to identyczne jak kopiowanie małego za jednym zamachem.

Zgadzam się, że im większy rozmiar operacji Blittera, tym lepiej. Żeby spożytkować czas, gdy Blitter jest zajęty (choć kopiowanie jest bardzo szybkie i procesor nie czeka dużo), można obsłużyć w tym czasie kilka innych sygnałów.

W przypadku kafelków, jak najbardziej korzystam z interleaved i szybkiego kopiowania.
[#15] Re: [C,asm] Boby, maski i przesunięcia

@Hexmage960, post #14

no ja właśnie wczoraj kontynuowałem poznawanie blitera i to właśnie na kafelkach (16x16).
muszę powiedzieć, że jestem bardzo pozytywnie zaskoczony szybkością. a jak jeszcze usunąłem każdorazowe ustawianie modulo (A i D) i innych parametrów kolejnych blitów które są identyczne to postawienie 40 kafelków w 5 bitplanach jest nawet ultra-szybkie.
myślę że z taką prędkością to byłbym w stanie stawiać 200 kafelków w jednej ramce a to, przy przesiadce z Blitza to jakiś kosmos!
wow. walczę dalej.


Ostatnia aktualizacja: 05.02.2024 12:07:22 przez c64portal
[#16] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #15

Nigdy nie robiłem testu ile można kafli postawić w jednej ramce, ale pamiętam kilka przydatnych rzeczy :)

W grze Apple Hunt (prosty klon boulder dasha) narzucanych jest 300 kafli co ramkę (16x16x3). gra chodzi w 50fps.
A znowuż w grze Psycheual to jest narzucanch (o ile dobrze policzyłem z filmiku) 234 kafle (18x13x5) i gra lata w 25fps, gdyż dochodzą jeszcze boby. Za to masz prawie za darmo (podmiana numeru kafla w mapie) animację levelu. Boby są tylko narzucane i czyszczone, gdyż nie trzeba zapamiętywać tła pod nimi.
[#17] Re: [C,asm] Boby, maski i przesunięcia

@c64portal, post #15

Ptaszki ćwierkają, że blity D=C mogą być ciut szybsze, zwłaszcza jak nie masz kilku podobnych do siebie pod rząd, bo nie musisz ustawiać afwm/alwm ani shifta od kanału A w bltcon0 czy tam 1. Moje testy tego jednoznacznie nie potwierdziły.

Ostatnia aktualizacja: 11.02.2024 11:15:26 przez teh_KaiN
[#18] Re: [C,asm] Boby, maski i przesunięcia

@teh_KaiN, post #17

Z tego co się orientuję kanał A jest za darmo, więc warto z niego korzystać. Jeżeli kanały C i D są włączone razem, podobno koszt rysowania rośnie.
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem