xxl napisał/a:ja bym sprobowal, wolna strona zerowa, zajetej pamieci na duchy o polowe mniej, wada to "tylko" 13 duchow... moze warto?
Aktualnie jest wystarczajaco wolnej strony zerowej, tak naprawde zysk byłby z tego taki że zamiast 15 klatek animacji duch mógłby skladac sie z 30 klatek i tych duchow byloby mniej
Dodatkowo zostałoby wprowadzone poważne ograniczenie dotyczące masek dla operacji AND, aktualne maski wyliczane są na podstawie pixli grafiki i nie są idealne ale na potrzeby testów wystarczające, czyli jeśli jest jakiś pixel to twórz pixel maski, a co jeśli pixlem grafiki jest kolor %00 ktory domyslnie traktowany jest jako tło a nie kolor grafiki? a co jeśli chcesz aby duch miał czarną obwódkę jak jest to zrealizowane w przeszkadzajkach z Dynablaster. Ogólnie musze stworzyć bardziej skomplikowana procedure generującą maski aby uwzględniać czarne pixle wewnątrz ducha i wtedy tablica 256 bajtow dla maski ducha nic nie pomoże.
Trzeba pamietac że aktualnie nie ma wogóle detekcji kolizji, jest tylko jeden program obsługi duchów ktory losuje wartosci i dodaje do pozycji X,Y, brak muzyki dla ktorej player zająłby jakiś czas na przerwaniu VBL. Program obsługi ducha wywoływany jest zaraz po jego wygenerowaniu i ma za zadanie sterować duchem, podejmować decyzje odnośnie jego zachowania itp, itd. to właśnie te krótkie programiki obsługi ducha będą determinować o końcowej szybkości całego silnika.
W prawdziwej grze na pewno stracimy jeszcze kilka dodatkowych duchow, wiec ideą przewodnią jest stworzenie jak najszybszego silnika generującego duchy.
vega napisał/a:Mam jeszcze takie pytanie: te 17duchów/na 3 ramki to przy jakiej szerokośći ekranu? 32 znaki? Jeżeli tak to ile ich będzie przy szerokości 40 i 48 znaków?
ekran 32 bajty: 17 duchow / 3 ramki
ekran 40 bajtów: 15 duchow / 3 ramki
ekran 48 bajtów: brak wyniku, ekran rozpierniczony, śmieci, tryb GTIA, trzeba przyjrzec sie temu blizej
ogolnie caly silnik synchronizuje sie do zadanej liczby ramek (domyslnie 3) tak ze jesli na ekranie bedzie mniej duchow to nadal przelaczanie obrazow bedzie odbywalo sie raz na 3 ramki, czyli nie bedzie przyspieszenia akcji ze wzgledu na mala ilosc obliczen, podobnie jesli zostanie odpalony na dopalce Pasia F7 to tez zachowa zadane tempo 3 ramek
xxl napisał/a:i jeszcze jedno bo to mi nie daje spokoju:
mowisz o 13 duchach na raz ruszonych (w 3 ramkach) a co jest jesli wyswietliles wczesniej np. 20 duchow ale 7 stoi w miejscu i sie nie animuje ?
zostana skasowane, wszystkie duchy sa nakładane na dany bufor za kazdym razem, bo wszystkie duchy wykorzystuja ta sama strone zerowa i za kazdym razem dla kazdego ducha z osobna musi ona zostac zaincjowana nowymi watrtosciami
sa dwa bufory (animacja przez przelaczanie obrazow), kazdy z tych buforow ma swoja pamiec obrazu i swoje 4 zestawy znakowe, dodatkowo istnieje bufor główny ktory przechowuje tylko pamiec obrazu z polem gry
cała pętla działa w dwóch właściwie krokach, krok1: wyświetl bufor 3, zacznij modyfikować bufor 2, krok2: wyświetl bufor 2, zacznij modyfikować bufor 3, skok do kroku 1.
modyfikacja bufora polega na przepisaniu pamieci obrazu z bufora glownego (bufor 1) do danego bufora i nalozenie duchow, bufor glowny sluzy tylko do odczytu, mozna go modyfikowac jesli chce sie uzyskac jakas dodatkowa akcje w polu gry, tyle ze trzeba zrobic to w odpowiednim miejscu
p.s.
można zrobić jeszcze inaczej, silnik będzie odpalany przez skok JSR pod odpowiedni adres (za kazdym wywołaniem zostanie przelaczony obraz na inny bufor), po powrocie z silnika robimy swoje niewiadomo jak długo
i znowu wywolujemy silnik, w ten sposób całość będzie nierównomiernie działała i będą skoki szybkości, ogólnie chaos chyba że będziemy mieli pare duchów tak aby wszystko mieściło się w granicy 1 ramki