Odkopmy ten temat, bo w końcu usiadłem do implementacji sterowania blitterem przy pomocy coppera. Przy okazji parę optymalizacji jakie wyszły po drodze. Trochę się pożalę, ale może ktoś mi coś podpowie.
W tej chwili mój kod wygląda tak, że najpierw wszystkie boby hurtem są zamalowywane zapamiętanym tłem na ich starej pozycji (D := A), potem tło na nowej pozycji jest zapamiętywane (D := A), potem rysowane z maską (D := AB + ~A C).
Robiąc ciche założenie że boby mają ten sam rozmiar, można zrobić wspólny bufor na zapamiętywanie tła. Dzięki temu w pierwszym kroku ustawia się raz bltpta i dla kolejnych bobów tylko zmienia się bltptd, w drugim kroku na odwrót. Dodatkowo większości rejestrów nie trzeba ponownie ustawiać, nieznaczna optymalizacja ale zawsze coś.
I to wszystko fajnie działa, tylko że wyłącznie gdy się ma podwójne buforowanie. Ja w swojej grze mam teraz pojedyncze i problem polega na tym, że operacje blitowania zajmują trochę czasu przez co na części ekranu nie mogą znajdować się boby bo inaczej jest ryzyko że nie zostaną narysowane. Rysunek poglądowy poniżej.
Więc myślę sobie dalej, że undraw/save/draw trzeba by rozdzielić i zrobić oddzielnie dla każdego boba - dojdzie trochę instrukcji coppera ale nie za dużo. Wtedy można wydzielić dla każdego z nich czas kiedy blit może nastąpić - przed wyświetleniem (ale nie tuż przed bo do końca się nie odmaluje) lub już za. Pomyślałem więc o kolejce priorytetowej (w oparciu o
kopiec), tak by przy tworzeniu copperlisty były zdejmowane boby w kolejności wyświetlania. I to by pewnie działało, gdyby nie problemy:
- boby mogą na siebie nachodzić - odrysowanie tła nachodzącego zamaże ten który jest pod nim
- jedne są rysowane wyżej niż inne (swobodnie obracalna wieżyczka czołgu wychodząca poza jego budę) - a więc trzeba zrobić sortowanie po wysokości warstwy ale nie tak że najpierw wszystko z z=0 a potem z=1 tylko żeby rysowanie szło możliwie najbardziej od góry do dołu ekranu
Wszystkie te problemy nie istnieją jak wprowadzę podwójne buforowanie, ale nie mogę tego zrobić bo moja mapa w grze ma 256x256 kafli o boku 32px, po Y mogę zawinąć bufor ale nadal jest to 256x8 kafli więc sporo czipu to wpierdziela. Scrolling trick po X dałoby radę zrobić i chyba to jest jedyne wyjście, ale wprowadzi mi to pewno kolejne źródło bugów w wyświetlaniu.
Jak żyć?