Komentarze do artykułu: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

[#1] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3
Ponieważ nic tu jeszcze nie ma, to chciałbym podziękować za ten kurs. Jestem programistą zawodowo, ale dotychczas nie próbowałem retro-programmingu. Każdą nową technologię najłatwiej mi się poznaje właśnie z takich samouczków, a ten przedstawia podstawy jasno i daje punkty zaczepienia. Szczegóły funkcji i struktur można już doczytać z dokumentacji i eksperymentować samemu.

Dzięki temu samouczkowi udało mi się zaimplementować grę w węża (GitHub). Wiadomo, nic szczególnego, ale jest audio, jest grafika, jest joystick i to działa. szeroki uśmiech

Niemniej, nie udało mi się doszukać jednej rzeczy. Przyzwyczajony do mocy dzisiejszych komputerów moim domyślnym podejściem do rysowania nowej klatki jest wyczyszczenie całego ekranu i narysowanie wszystkiego od nowa. Tutaj też to zadziałało, ale tylko w WinUAE ustawionym pod maksymalną prędkość. Po uruchomieniu gry na A1200 lub na WinUAE ustawionym na cycle-exact, caly ekran gry zaczął błyskać. Ostatecznie zaleczyłem ten problem przez selektywne czyszczenie kafelka z którego zszedł wąż poprzez prostackie zamalowanie je czarnym kwadratem (tło też jest czarne, więc jakoś to ujdzie). Nie podoba mi się to rozwiązanie. Amigowe gry są w jakiś sposób w stanie przerysować duże części ekranu bez błyskania.

Nie próbowałem jeszcze double-bufferingu z podmianą struktury BitMap w RastPorcie ekranu. Widziałem takie podejście w przykładzie Commodore'a do animacji. Może rozwiązałoby to problem? A może na tej platformie "tak się tego nie robi", tj. nie czyścimy całego ekranu, bo jest to zbyt wolne? A może zamiast przechodzić przez Intuition powinienem bezpośrednio komunikować się ze sprzętem?

Chętnie bym też postudiował kod innych gier napisanych w C, ale dotychczas natrafiłem głównie na paczki źródeł Assemblera, albo na gry oparte na bibliotece SDL.
[#2] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@Zalewa, post #1

Hej, jeśli mogę coś doradzić - błyskanie wynika z tego, że komputer (wiązka obrazu) cały czas wyświetla modyfikowaną część pamięci graficznej. Rozwiązania są na to dwa:

1. Wykorzystać wspomniane przez Ciebie podwójne buforowanie. Wtedy obraz nie będzie błyskać, bo wyświetlony jest jeden bufor w pamięci graficznej, podczas gdy Ty rysujesz w drugi. Przełączanie buforów nie zajmuje w ogóle czasu żadnego z procesorów Amigi. Tak samo przeskakiwanie w pamięci graficznej Amigi (np. scrolling) jest całkowicie darmowy, jeśli chodzi o czas operacji. Po prostu wiązka obrazu odczytuje z innego miejsca w pamięci graficznej.

2. Czyścić ekran tam, gdzie w tej chwili nie jest wyświetlany. Wymaga to synchronizacji z wiązką obrazu. Da się to zrobić wykorzystując np. przerwanie Coppera. Copper to jeden z dwóch koprocesorów odpowiedzialnych za wideo Amigi. Ustawiasz przerwanie na interesującą Cię linijkę obrazu i będzie on wywoływany wówczas, gdy wiązka obrazu osiągnie wyznaczony punkt. Wtedy wszystko powyżej jest w danym momencie bezpieczne do rysowania. Możesz wówczas np. wyczyścić ten obszar za pomocą procesora.

Można również czyścić lub rysować za pomocą Blittera na wyświetlanej pamięci graficznej w synchronizacji z wiązką obrazu w analogiczny sposób, tutaj najlepiej umieścić ustawianie rejestrów wewnątrz tej Copperlisty. Tylko pamiętaj, by opatrzyć tę Copperlistę instrukcją WAIT ze zgaszonym (wyzerowanym) bitem BFD (Blitter-Finish-Disable), ponieważ Copper będzie musiał poczekać jak Blitter skończy pracę (oczywiście jeśli jest zajęty jakąkolwiek pracą). Pamiętaj również, że Copper dostaje dostęp do rejestrów Blittera dopiero, gdy procesor ustawi bit 1 w rejestrze COPCON (Copper-Control). Jest to potrzebne, gdyż procesor przecież też może sterować Blitterem.

Generalnie jak Ci się uda zdążyć z czyszczeniem i rysowaniem podczas gdy generowany jest obraz komputera (a pamiętajmy że to niewielkie czasy, gdyż prędkość piksela w niskiej rozdzielczości 320x256 to 140 nanosekund), to jest dobrze. Używając tych metod nie uświadczysz wówczas błyskania, gdyż komputer będzie rysował w miejsca, które nie są aktualnie wyświetlane przez wiązkę obrazu, co pozwoli na płynną animację w 50/60Hz. Nawet na procesorze MC68020/14MHz.

Amiga CD32 pozwala dodatkowo nanosić grafikę w formacie chunky w ten sposób, dzięki sprzętowej konwersji.

Amiga CD32 (system Amiga OS 3.1) pozwala również w wygodny sposób wyłączać systemowe przerwania za pomocą funkcji bibliotecznej.

Ostatnia aktualizacja: 06.11.2018 02:58:18 przez Hexmage960
[#3] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@Hexmage960, post #2

Dzięki za podpowiedzi. Podejście z dbufferingiem wydaje się dla mnie najprostsze, chociaż pewnie mniej wydajne od podejścia z synchronizacją (przez podwójne zużycie pamięci). Niemniej wypróbuję je w wolnej chwili i poobserwuję efekty. Widzę że na swoim GitHubie masz trochę kodu. Przejrzę go przy najbliższej okazji, pewnie się czegoś nauczę.

Swoją drogą - nie mogłem nigdzie na całej tej stronie znaleźć żadnego powiadomienia o tym, że pod tym artykułem pojawił się komentarz. Pokazywarka nowych postów na forum nie pokazuje tego. Skąd wiedziałeś, że coś w ogóle się tu pojawiło?

Ostatnia aktualizacja: 06.11.2018 07:43:47 przez Zalewa
[#4] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@Zalewa, post #3

Swoją drogą - nie mogłem nigdzie na całej tej stronie znaleźć żadnego powiadomienia o tym, że pod tym artykułem pojawił się komentarz. Pokazywarka nowych postów na forum nie pokazuje tego. Skąd wiedziałeś, że coś w ogóle się tu pojawiło?

Na stronie głównej PPA na samym dole są najnowsze komentarze do artykułów.
[#5] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@Zalewa, post #1

main.c w linii 61:
g_timer_io->tr_time = (struct timeval)g_timeval;

chyba jest błąd rzutowania, bez niego kompilacja przebiega prawidłowo (pod VBCC).



Gdyby ktoś chciał potestować:
snek.lha

Chętnie bym też postudiował kod innych gier napisanych w C

https://www.ppa.pl/aktualnosci/magazyn-zapowiedz.html
AMIner, openFire, amiMelee
http://aminet.net/package/game/jump/JetSetBilly
[#6] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@forge, post #5

main.c w linii 61:
g_timer_io->tr_time = (struct timeval)g_timeval;

chyba jest błąd rzutowania, bez niego kompilacja przebiega prawidłowo (pod VBCC).

Pogryzło się z tym?
http://pubs.opengroup.org/onlinepubs/7908799/xsh/systime.h.html

GCC nie przeszkadza to rzutowanie, ale faktycznie jest niepotrzebne i je usunąłem.

Jak widać gra jest grubym kilofem ciosana i w sumie można ją zobaczyć, a potem szybko zamknąć. Moim głównym celem jest rozpoznanie platformy, poznanie API i praktyk Dzięki za linki, przydadzą się.
[#7] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@Zalewa, post #1

W kursie jeśli chodzi o audio to jest błąd - od razu przepraszam za to. na forum znajdziesz poprawiony link. Wypadałoby zaktualizować artek dotyczący audio - niestety bardzo krucho u mnie z czasem + teraz mam zawirowania z pracą.
[#8] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@asman, post #7

Na bazie artka mógłbyś książkę przygotować, rozbudować itd. W naszym światku jesteśmy poniekąd skazani na "C".
[#9] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@KM, post #8

Książka to ogromne wyzwanie dla mnie, ja mam problem by napisać jeden odcinek. Ciekawe ile osób byłoby chętnych ?
[#10] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@asman, post #9

Nie będę robił listy jak w wielu wątkach ostatnio stało się to modne, ale możesz zagadać z A. Mierzwą jak on to rozwiązał, gdy pisał swoją lub ankietę wrzucić jak te znikną. Koniecznie obrazki najlepiej kolorowe. Wiesz może być pdf, choć wolę papier.
[#11] Re: Nasza pierwsza gra - kurs programowania AmigaOS i C - część 3

@KM, post #10

Dzięki za sugestie, doceniam to. Na razie muszę spasować z pisaniem czegoś większego. Skupię się na małych formach, dzięki temu ulepszę warsztat i na pewno coś z tego się urodzi. Teraz najważniejsze to zrobić aktualizację odcinka z audio. Jeszcze raz dzięki.
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