atarionline.pl
atarionline.pl Atari
Login:
Hasło:
Zapamiętaj mnie
Translate to RSS RSS
Wywiad z Krollem z 2018-09-18 10:29 (25)
Major Blink z 2018-09-15 01:22 (13)
Radar Rat Race, prosty klon Rally-X z 2018-09-09 22:33 (8)
Nowe przygody Laury z 2018-09-07 12:30 (15)
Riverwash 2018 – prace na Atari z 2018-09-02 23:27 (54)
Naciskamy IPN z 2018-08-31 06:57 (18)
"07 zgłoś się" egzotycznie z 2018-08-25 11:20 (13)
Scramble z 2018-08-12 23:13 (54)
KWAS 14 w Warszawie z 2018-08-11 13:23 (17)
I po Ironii... z 2018-08-05 23:28 (71)
Baby Berks z 2018-08-01 08:25 (14)
Silly Venture 2018 - invitka na Atari ST z 2018-07-30 09:44 (9)
Historia zniszczonego Atari z 2018-07-28 22:16 (5)
Ironia 2k18 już wkrótce! z 2018-07-23 00:02 (37)
Kolekcja muzyczek Jurgiego z 2018-07-21 22:25 (17)
Porty gry "Mercenary" z 2018-07-17 09:25 (17)
Kaz i Kroll o magazynach dyskowych z 2018-07-12 10:53 (31)
Wykład o magazynach dyskowych ST z 2018-07-10 14:28 (8)
Naprawa CA-2001 z 2018-07-04 16:16 (20)
Wywiad z Tadeuszem Trojakiem z 2018-07-01 16:23 (19)
«« nowszestarsze »»

Pomocnik/Helper
Gry/Games

Katalog gier

Opisy gier
Frogs opisał Xeen (0)
Choplifter! opisał Urborg (0)
Joust opisał Urborg (16)
Commando opisał Urborg (35)
Mario Bros opisał Urborg (13)
Xenophobe opisał Urborg (34)
Robbo Forever opisał tbxx (16)
Kolony 2106 opisał tbxx (0)
Archon II: Adept opisał Urborg/TDC (9)
Spitfire Ace/Hellcat Ace opisał Farscape (7)
Wyspa opisał Kaz (9)
Archon opisał Urborg/TDC (16)
The Last Starfighter opisał TDC (30)
Dwie Wieże opisał Muffy (17)
Basil The Great Mouse Detective opisał Charlie Cherry (122)
Inny Świat opisał Charlie Cherry (17)
Inspektor opisał Charlie Cherry (19)
Grand Prix Simulator opisał Charlie Cherry (16)
Rescue On Fractalus opisał Kaz (18)
Stranded opisał Kaz (10)
«« nowszestarsze »»

Wewnętrzne/Internals



   Nowinki tworzone dzięki CuteNews
Premiera "Amaurote+"
Jakub Husak napisał:

Amaurote to była jedna z gier, które śniły mi się po nocach. Uważałem ją za majstersztyk programistyczno-graficzny. Jednak w wyniku zbytniego spowolnienia, w przypadku dużej ilości owadów goniących Arachnusa, zniechęciłem się do niej zbyt (być może) szybko. Czas minął, rany dzieciństwa się zabliźniły, wspomnienia przyszarzały. Odżyły dopiero w wyniku dyskusji i tezy at0mica, że na Atari nie da się przyspieszyć tej gry!

Ta. No jasne!
Nie da się!
No ale no jak to?
Ja nie zrobię?


Wziąłem w dłonie stare, dobre "dis6502" i zacząłem analizować grę. Od razu rzucił mi się w oczy ogrom kodu, jaki w tej grze jest upchnięty. W trakcie analiz okazało się, że autorom szybciej było kod skopiować, niż napisać go w sposób uniwersalny. Dało to przyczynek do Wielkiego Skracania Kodu.



Kuriozum to procedury czyszczenia ekranu i swapowania (przepisywania) offscreenu na ekran główny. Zajmowały kilka kilobajtów i były to serie lda adr,x, sta adr2,x. I tak 32 razy w pętli, i tak 8 razy, aby przypadkiem nie spowolnił tego, chociaż troszkę, niepotrzebny skok. Te zoptymalizowane, długie kawałki kodu wykonywane były:
  • podczas chodzenia Arachnusa na ekranie wyboru miasta,
  • podczas animacji wzorków podczas czołówki oraz game over,
  • na początku gry oraz po wejściu do radio menu.

Powiem tyle: zastąpienie ich normalnymi pętlami nie spowolniło ani na jotę wizualnie gry, a uzyskałem tym ruchem kilka kB wolnego. W wyniku tych i jeszcze innych skracań udało mi się zmniejszyć kod i dane o około 8 kB, które następnie wypełniłem nowym kodem i nowymi danymi.

Zostało wolne jakieś 300 bajtów. Pamięć na początku (poniżej $1000) jest wykorzystywana na bufory sprajtów (a dokładnie tego, co pod nimi), a na końcu na mapę miasta (4 kB pod $C000). Gra w ogóle przewiduje mnóstwo miejsca na bufory. Około 2 kB na początku pamięci na sprajty, a właściwie ich tło, 4 kB na miasto, 4 kB na offscreen, 6 kb na pamięć ekranu. Pamięć ekranu i offscreen są umiejętnie wykorzystane i efektownie przepisywane (efekt mozaiki). Ten efekt jednak na Atari jest znacznie wolniejszy niż na ZX Spectrum, z którego gra pierwotnie pochodzi. Mimo chęci nie za bardzo udało mi się przyspieszyć tej części, ale udało mi się ją skrócić o jakiś kilobajt. Na moje szczęście nie jest ona dla gry kluczowa.



W wyniku wprowadzenia poniższych poprawek gra przyspieszyła od 50% (gdy sam Arachnus chodzi po ekranie) do ponad dwukrotnie albo i lepiej - w przypadku nawału pszczółek. Teraz, gdy jest ich 5-6 na ekranie, spokojnie można grać, poprzednio gra stawała. Z ciekawostek należy jeszcze wspomnieć, że gra zajmuje całą dostępną pamięć i wyłącza system operacyjny.

Rzeczy, które zostały zmienione (wielkie i małe):

  • zmiana organizacji offscreenu na 32 bajty/linię z 28 bajtów/linię (to było chore: co prawda kilobajt zaoszczędzony, ale prędkość gry sporo niższa). Próbowałem też zamiany na tryb tekstowy. To nawet działało i to znacznie szybciej. Jednak przerosło mnie rysowanie Arachnusa i innych sprajtów z pionową rozdzielczością 1 linii w trybie tekstowym. Ponieważ nie znałem dobrze kodu, mógłbym się nieźle wpuścić w ślepą uliczkę, więc wykonałem nawrót. Analizując procki przepisywania sprajtów na ekran stwierdziłem, że działałyby szybciej, jeśli offscreen będzie miał 32 bajty szerokości. Aby tak się stało, trzeba było przeorganizować (zmienić adres) ekranu, offscreenu i bufora na deskę rozdzielczą, czyli zmienione położenie pamięci ekranu, offscreenu i tablicy rozdzielczej oraz związane z tym optymalizacje rysowania sprajtów i transfery danych offscreen - screen;
  • zmieniony kod generowania napisów - teraz mają położenie co do 0.5 znaku (jednego bajta) w poziomie i można je opuścić o 1-7 linii w dół, znacznie profesjonalniej to wygląda. Na to wpadłem analizując kod, że łatwo jest to wprowadzić, a te napisy niewycentrowane strasznie mnie denerwowały;
  • dodanych kilka znaków, :+-';
    zoptymalizowana procedura rysowania sześciokątnej ramki, zarówno pod względem szybkości jak i zajętości pamięci. Jest to podzielone na dwa etapy: nie rysuj nic, gdzie nie trzeba; kopiuj, gdzie trzeba, a w pozostałych przypadkach standard lda and ora sta. Działa 1/3 czasu, a zajmowała 1/3 czasu jednego obrotu pętli animacji;
  • dodane pionowe (no, zygzakowate) krawędzie 1-punktowe, oddzielające pole gry od ramki - to spowodowane było niekonsekwencją - na ZX tak jest, a na Atari nie było...;
  • wyrzucony cały kod odwracania sprajtów (wszystkie pszczółki i Arachnus były odbijane symetrycznie w locie)- teraz siedzą odwrócone w pamięci (przegięcie, gdy odwracało się kulkę :)).




Po tych optymalizacjach niestety sporo wrosły wymagania pamięciowe. Niemniej optymalizacje w kodzie zwolniły trochę miejsca oraz umożliwiły:

  • wprowadzenie klatek animacji pszczółek latających, których wbrew pozorom wcześniej nie było! - na prośbę Kaza;
  • zoptymalizowane rozmieszczenie sprajtów w pamięci (uzyskany 1 kB miejsca). To było ciekawe. Większość sprajtów nie zajmuje całej wysokości. W związku z tym zorganizowałem sprajty tak, że się "nakładają" na siebie - jeśli mają wspólne marginesy na górze i na dole - to te linijki są wycięte...;
  • zoptymalizowana tablica rozdzielcza, widać to w detalu "uszkodzenie Arachnusa %", oraz w długości kodu powstałego przy pomocy copy-paste, który został wyrzucony: kod 0.5 kb krótszy;
  • zoptymalizowane na długość (czy krótkość) operacje przepisywania ekranu. Znowu przy zmianie organizacji ofscreenu na 32 bajty odpadło jedno dwubajtowe dodawanie na każdą linijkę ekranu;
  • usunięty bug: pierwsza linia ekranu nie jest uaktualniana grafiką (jest jednolinijkową kratką od góry). To mi spać nie dawało, od kiedy to zauważyłem;
  • usunięty bug: ostatnia kolumna ekranu nie jest uaktualniana w animacji. Tego sporo czasu szukałem - ale znalazło się!
  • usunięty bug/ficzer, gdy muchy mrygają, gdy stoją. Kaz sugerował, że tak może też jest w porządku, bo je lepiej widać, ale teraz mogą się przyczaić :). W każdym razie na ZX nie mrugają i u nas już też nie;
  • gdzieś po drodze wkradł się bug: miasta były nieco inne - różniły się drobiazgami :) Tutaj wprzągłem TRACE do roboty i odkryłem, że przyczyną było NIECZYSZCZENIE PAMIĘCI po moich tymczasowych operacjach.
  • wyzwaniem też było dokładanie nowych faz animacji. Niby wszystko w listach, tablicach, a Arachnus po poprawkach rzucał płytami chodnikowymi :D
    Okazało się, że nie wszystko można wyedytować tablicami, część jest w ifach w głównej procce rysowania sprajta.
  • niespodzianka: Arachnus na naprawę, teleport oraz na początku rozgrywki jest opuszczany na pole gry, a nie pojawia się na dole od razu jak to było dotychczas;
  • zoptymalizowane strzałki kompasu - teraz ich jasność jest proporcjonalna do odległości (w znacznym przybliżeniu) oraz są znacznie przyspieszone i lżejsze pamięciowo. Aby wszystko było tak, jak sobie wymyśliłem, musiałem je opuścić o linię w dół, wtedy wystarczy skopiować 22 bajty na strzałkę (czyli 44 razem). A przedtem było hoho: lda and ora sta!
  • rozszerzone napisy początkowe o creditsy + dodany tytuł, którego w oryginale nie ma :P
  • podkolorowane sprajtami wskaźniki bomb i supabomb, a także strzałki;
  • zlikwidowany bug przeskakiwania toru Arachnusa na "o połowę pola". Okazało się, że ten błąd był znany piszącym kod, bo w jednym miejscu go poprawili, ale w pozostałych nie. W związku z tym poprawiam współrzędne Arachnusa i obiektów co przejście przez pełne pole.
  • and last but not least - super intro z grafiką Kaza, stylizowane na stary telewizor. Długo miałem zagwozdkę, co zrobić w ramach intra. Pierwotnie miała być umieszczona grafika Kaza 32 bajty szerokości. Potem wpadłem na efekt "interlace" (jak ze starego TV). Jednak Kazowi się to nie podobało (wcale mu się nie dziwię), bo wygląd rysunku bardzo ucierpiał, szczegóły hi-resu były ledwo widoczne. Potem pomyślałem sobie - przecież te telewizory często zrywały synchronizację, a na A8 takie coś jest trywialne. Napisałem prockę zrywania synchronizacji, ALE nie zmieściła się w jednej linii o kilka cykli. A musi być wywołana w każdej linii ekranu... No to jest w dwóch. Za to działa 50 Hz. Ale obrazek 32 bajty szerokości - dobry na grę - dziwnie wyglądał przy zrywaniu synchronizacji. W związku z tym poprosiłem Kaza o szerszy obrazek. Marudził :), że szerokość jest dopasowana do pola gry, ale dorysował. Ja go jeszcze poszerzyłem (do pełnych 48 bajtów, a właściwie wraz z impulsem synchronizacji poziomej do 64 bajtów). Tak więc obrazek zajmuje 16 kB (256 linii x 64 bajty). Potem jeszcze dopisałem tak zwany scenariusz, włączenie TV oraz wyłączenie - i efekt jest chyba całkiem fajny.
    A na pewno oryginalny :);
  • a! - i jeszcze planowałem samplowane dźwięki, a są syntetyczne :), to znaczy generowane w locie sterowaniem bitu 4 w AUDC.
  • na koniec spakowałem wszystko exomizerem. Intro rozpakowuje się 2 sekundy, a gra po intrze 4 sekundy.


Plik "Amautore+" można sobie ściągnąć tutaj. Owocnego debugowania!



Kaz napisał:

Ode mnie tylko kilka słów komentarza: obrazek tytułowy to przetworzona grafika z gry na ZX Spectrum, w klimatach czarno-białych, moim zdaniem bardziej pasujących do gry. Prace nad wersją plus można było śledzić w tym wątku i tym na forum. Jak ktos nie wie, jak grać, tutaj jest mój opis wersji oryginalnej na Atari. Wersja Kuby dla gracza różni się tym, że:
  • Arachnus i pszczoły żwawiej się ruszają,
  • strzałki pokazują nam przybliżoną odległość do wybranego celu,
  • mamy podświetlane wskaźniki bomb, co ułatwia orientację,
  • nie ma błędu chodzenia po połówkach, co czasami bardzo utrudniało poruszanie się.


Dodam jeszcze, że czas premiery jest podwójnie nieprzypadkowy. Po pierwsze wszyscy będą mogli pobawić się przyspieszonym Arachnusem w czasie Świąt, a do tego jest to niespodzianka urodzinowa - dzisiaj urodziny Kuby Husaka! Sto lat, sto lat... :)

2012-04-06 20:39 by Jakub Husak
komentarzy: 0
nickname
e-mail / website (opcjonalnie)
Aktualne tematy
Speed Ace (26)
ostatni: 20-09-2018 13:50, solo/ng
STAR RAIDERS II LEVEL 3 TAKTYKA? (4)
ostatni: 20-09-2018 00:08, RetroBorsuk
RetroKomp 2018 (14)
ostatni: 19-09-2018 20:59, sachy
Retro Na Gazie (200)
ostatni: 19-09-2018 19:23, hospes
Komputer Cobra 1 (20)
ostatni: 19-09-2018 14:33, rj1307
Fatal Game (30)
ostatni: 19-09-2018 10:36, Mq
Laura - zrób sobie własną... Kase... (68)
ostatni: 18-09-2018 22:14, ccwrc
[S] Tanie PCty pod emulator (14)
ostatni: 18-09-2018 17:46, IRATA4
Silly Venture 2k18 - 10th Celebra... (86)
ostatni: 18-09-2018 15:21, greymsb
SV2k18 - rejestracja, koszulki it... (6)
ostatni: 18-09-2018 15:18, greymsb
Poszukiwany tłumacz do gry dla ST... (1)
ostatni: 18-09-2018 13:08, Kaz
Kariera filmowa KAZa (5)
ostatni: 18-09-2018 12:37, QTZ
Bezprzewodowe Atari 8-bit (7)
ostatni: 17-09-2018 23:41, gorgh
23.09.2018 BYŁO GRANE - retromeet... (7)
ostatni: 17-09-2018 18:45, gorgh
Atari800 dla Raspberry Pi (33)
ostatni: 17-09-2018 00:38, Xuio

Kategorie Forum Atarum

Użytkowników: 1882
Ostatnio zarejestrowany: yamahalodz
Postów ostatniej doby: 12

Społeczność/Community

Najbliższe imprezy

Stragan
Atari USBJoy Adapter oferuje Jakub Husak (0)
Programy: Kolony 2106 oferuje Kaz (6)
Sprzęt: rozszerzenia oferuje Lotharek (18)
Gadżety: naklejki, pocztówki oferuje Sikor (11)
Sprzęt: cartridge RAM-CART oferuje Zenon (4)
Miejsce na drobne ogłoszenia kupna/sprzedaży oferuje Kaz (51)
Sprzęt: interfejs SIO2IDE oferuje Piguła (0)
Sprzęt: interfejs SIO2SD oferuje Piguła (22)

Użytki/Utils
Sprzęt/Hardware

Wynalazki
Atari i Bluetooth napisał Kaz (32)
SIO2PC-USB napisał Larek (45)
Nowe SIO2SD napisał Larek (0)
SIO2SD w CA12 napisał Urborg (9)
Ratowanie ATMEL-ów napisał Yoohaas (12)
Projektowanie cartów napisał Zenon (12)
Joystick do Atari napisał Larek (54)
Tygrys Turbo napisał Kaz (8)
Testowałem "Simple Stereo" napisał Zaxon (3)
Rozszerzenie 1MB napisał Asal (20)
Joystick trzyprzyciskowy napisał Sikor (18)
Moje MyIDE oraz SIO2PC na USB napisał Zaxon (16)
Jak wykonać płytkę drukowaną? napisał Zaxon (26)
Rozszerzenie 576kB napisał Asal (36)
Soczyste kolory napisał scalak (29)
XEGS Box napisał Zaxon (13)
Atari w różnych rolach napisał Różyk (8)
SIO2IDE w pudełku napisał Kaz (5)
Atari steruje tokarką napisał Kaz (14)
DarkMouse napisał Kaz (7)
«« nowszestarsze »»