[#1] Przerwanie wygaszania pionowego
Piszę grę wymagającą szybkiej animacji obiektów ruchomych. Chciałbym użyć systemowej funkcji AddIntServer() do ustawienia własnej procedury tego przerwania (VBlank), aby uczynić animację obiektów ruchomych w pełni płynną - podczas przerwania będę używał w asemblerze Blittera poprzez _LVOOwnBlitter(). Do obiektów nieruchomych użyję po prostu BltBitMap(). Innym, gorszym rozwiązaniem jest użycie Blittera poprzez Coppera (nawet za pomocą systemowej własnej copper-listy). Czy ktoś ma doświadczenie na ten temat i może mi pomóc?



Ostatnia modyfikacja: 15.09.2008 16:52:05
[#2] Re: Przerwanie wygaszania pionowego

@Minniat, post #1

i będzie Ci to dzialać pod Twoją kartą graficzną ?

[#3] Re: Przerwanie wygaszania pionowego

@rzookol, post #2

Jaką kartą przecież miał pisać pod AGA
[#4] Re: Przerwanie wygaszania pionowego

@rzookol, post #2

Póki co planuję wersję AGA bo umiem na niej pisać :D. Jeśli chodzi o kartę graficzną to na pewno jest tam odpowiednik przerwania wygaszania pionowego (np. tzw. przerwanie zegarowe na PC). Poza tym karta graficzna dzięki swojej szybkości nie będzie wymagała stosowania takiego przerwania. Mam jednak marne pojęcie o programowaniu pod BVision.

Wracając do topicu chcę zastosować przerwanie VBlank by podczas jego trwania narysować ruchome obiekty, dzięki czemu będą one płynnie animowane. Testy wykazują, że to nie jest 100% konieczne, mogę spokojnie rysować do około 10-15 obiektów ruchomych i baardzo dużo obiektów nieruchomych, ale użycie przerwania uczyni animację jeszcze bardziej szybką i płynną. Czy ktoś ma doświadczenie w tej materii i może mi pomóc - może programista Team17 autor Super Froga? :D Mogę też zerknąć do opracowania gry Benefactor.

---
A tak na marginesie - Pomysł gry:
- 256 kolorów 320x256.
- tytuł "KOMANDOSI: POLE WALKI"
- a'la Quake "deathmatch" tylko, że platformowa 2D.
- Różne bronie m.in ShotGun, ChainGun, HyperBlaster, RailGun, apteczki, artefakty itp.
- Efekty graficzne w tym oświetleniowe itp.
- Dla 1 lub 2 graczy jednocześnie.
- Trailer zapowiadający
- Macie swoje pomysły?



Ostatnia modyfikacja: 16.09.2008 08:44:30
[#5] Re: Przerwanie wygaszania pionowego

@Minniat, post #4

> A tak na marginesie - Pomysł gry:
> - a'la Quake "deathmatch" tylko, że platformowa 2D.
> - Dla 1 lub 2 graczy jednocześnie.

DAMN! Co to w ogóle ma znaczyć? Kolega widział Quake w trybe DM? Z 1-2 graczami? W 2D, jeszcze pewnie w rzucie z boku? No nie wierzę


[#6] Re: Przerwanie wygaszania pionowego

@baderman, post #5

Grałem w Quake'a. To tylko taki pomysł, potrafię to sobie wyobrazić. Chodzi o to, że gra będzie w stylu starych gier bitmapowych. A teraz proszę więcej bez off-topiców. Wróćmy do programowania!

[#7] Re: Przerwanie wygaszania pionowego

@baderman, post #5

To nie ma byc Quake - tylko "cos jak Quake". Chodzi o sam pomysl. Dla mnie wydaje sie byc calkiem dobry. Taki AlienBreed Deathmatch.
[#8] Re: Przerwanie wygaszania pionowego

@Minniat, post #4

w bvision blitujesz po prostu bitmape na ekranie (jakim tam juz sposobem chcesz) i olewasz specjalne funkcje, zeby to działało porządnie po prostu w kodzie gry oddzielasz funkcje rysujące od engine gry. Wtedy przepisanie gry na cgx wymagałoby tylko przepisanie tylko jednego pliku *.c bez grzebania sie w pozostalych

ps. pamietaj, że to timingu służy timer.device i nic podadto

[#9] Re: Przerwanie wygaszania pionowego

@Minniat, post #4

Witam

Nie za bardzo rozumiem co napisałeś.
W przerwaniu VBlank będą rysowane tylko ruchome obiekty ?
Jesli odpowiedź jest na tak. To kiedy będziesz rysował nieruchome obiekty ?

Nie za bardzo rozumiem podział obiektów na ruchome i nieruchome. Przecież procedura rysującą nie powinno obchodzić jaki to typ obiekt ( ruchomy czy nie ). Ona ( ta procedura ) dostaje między innymi współrzędne i ma w głębokim poważaniu czy współrzędne się zmieniły czy nie. Jeżeli chcesz animować wszytkie obiekty to znaczy, że wszystkie je musisz narysować.

Pozdrawiam

[#10] Re: Przerwanie wygaszania pionowego

@Minniat, post #1

Minniat napisał(a):

> aby
> uczynić animację obiektów ruchomych w pełni płynną - podczas
> przerwania będę używał w asemblerze Blittera poprzez
> _LVOOwnBlitter().

Kilka komentarzy:
1. Funkcja OwnBlitter usypia proces, jesli blitter jest aktualnie zajety. Dlatego tez nie wolno uzywac tej funkcji w procedurze obslugujacej przerwanie
2. Rysowanie czegokolwiek w funkcji obslugujacej przerwanie to bardzo glupi pomysl. Wszystkie amigowe manuale trabia naokolo, ze procedury obslugi przerwan powinny byc tak krotkie i tak szybkie jak to tylko mozliwe. Zabijesz system (podczas obslugi twojego przerwania rysujacego obiekty, AmigaOS nie bedzie w stanie zrobic nic innego. Absolutnie nic.)
3. Znowu tworzysz dzielo, ktore jest na sile przywiazane do hardware. Nawet na amidze m68k z bvision nie zadziala.
4. Ktos juz Ci sugerowal oddzielenie logiki gry od kodu rysujacego
5. I tak pewnie zignorujesz moja wypowiedz (jak wiele innych), bo wiesz lepiej.

[#11] Re: Przerwanie wygaszania pionowego

@rzookol, post #8

Przede wszystkim dziękuję za odpowiedzi i okazaną pomoc.

@misOr

Dokładnie o to mi chodzi w moim pomyśle. Próbowałem już zakodować z widokiem z góry, gdzie bohater może obracać się o dowolny kąt i chodzić do przodu lub do tyłu ale grywalność była bardzo niska, więc zamierzam zrobić widok z boku. Ale napisanie tej gry zajmie mi wiele miesięcy.

@rzookol

Póki co robię wersję AGA i synchronizuję za pomocą VBlank by uzyskać 50 fps. Z tego też powodu nie używam timer.device. Timer.device mogę użyć do innych celów. OK. Napiszę również wersję, którą da się przeportować pod kartę graficzną, gdzie napiszę nakładki na funkcje rysujące.

@asman

Ruchome obiekty będę rysował za pomocą blittera dla maksymalnej szybkości, bo wymagają użycia 4 kanałów A, B, C i D (w tym maski), a nieruchome za pomocą BltBitMap(), który jest bardzo szybki (spójrzcie na Robbo - nawet nie używam podwójnego buforowania). Boby systemowe są po prostu śmieszne. BltMaskBitMapRastPort() jest za to zbyt wolny. Oprócz tego nieruchome obiekty nie wymagają użycia przerwania bo nie wymagają szybkiego i płynnego ruchu.

@szuler

ad.1) To prawda, że usypia, ale w przerwaniu można bez problemu używać rejestrów systemowych w tym blittera, więc również oczekiwanie na skończenie przez blittera pracę.
ad.2) Ależ do tego służy przerwanie, a szczególnie VERTB. Poza tym Blitter używa swojego DMA, więc nie spowolni systemu. Nadmienię też, że system umożliwia nawet stworzenie kolejki procedur, które chcą korzystać z przerwania.
ad.3) To prawda. Napiszę port dla karty graficznej.
ad.4) Tak jak w punkcie 3.
ad.5) Nie ignoruję wypowiedzi, mogę na niektóre po prostu nie odpisywać. Teraz musiałem odpowiedzieć aż na 4 listy.

Wszystkim polecam przykład z RKRM pod tytułem "vertb" z "Exec Libraries", który pokazuje użycie tego przerwania - zlicza on ilość ramek i w ogóle nie spowalnia systemu. Poćwiczę trochę z tym przerwaniem i rysowaniem obiektów. Jak napisałem w poprzednim poście umieszczenie kodu w przerwaniu nie jest w 100% konieczne, ale warto wypróbować.



Ostatnia modyfikacja: 16.09.2008 13:54:52
[#12] Re: Przerwanie wygaszania pionowego

@Minniat, post #11

Minniat napisał(a):

> ad.1) To prawda, że usypia, ale w przerwaniu można bez problemu
> używać rejestrów systemowych w tym blittera, więc również
> oczekiwanie na skończenie przez blittera pracę.

Ale nie za pomoca funkcji OwnBlitter(). Dokladnie z tych samych powodow dla ktorych nie wolno w kodzie obslugujacym przerwanie wywolywac np. funkcji Wait() z exec.library

> ad.2) Ależ do tego służy przerwanie, a szczególnie VERTB.

Przerwanie nie sluzy do rysowania. W kodzie przerwania mozesz np. wyslac sygnal (za pomoca exec.library/Signal) do zadania, ktore juz poza trybem supervisor zajmie sie rysowaniem.

> Poza
> tym Blitter używa swojego DMA, więc nie spowolni systemu.

Tak, a ty w handlerze przerwania bedziesz wywolywal np. funkcje WaitBlit, ktora aktywnie czeka na skonczenie przez blittera pracy. W tym samym czasie cala kolejka handlerow przerwania VERTB bedzie czekala az twoj kod laskawie skonczy rysowac.

> ad.3) To prawda. Napiszę port dla karty graficznej.

Nie prosciej byloby od razu napisac jedna wersje, ktora dziala zarowno na AGA jak i na karcie graficznej?

> ad.5) Nie ignoruję wypowiedzi, mogę na niektóre po prostu nie
> odpisywać. Teraz musiałem odpowiedzieć aż na 4 listy.

W momencie w ktorym probuje sie przekazac Ci jakakolwiek wiedze, ty odpowiadasz np. "Ależ do tego służy przerwanie, a szczególnie VERTB.". To sie nazywa ignorancja.

> Wszystkim polecam przykład z RKRM pod tytułem "vertb" z "Exec
> Libraries", który pokazuje użycie tego przerwania - zlicza on
> ilość ramek i w ogóle nie spowalnia systemu.

Uwazasz, ze rysowanie za pomoca blittera wielu obiektow na ekranie kosztuje tyle samo czasu, co inkrementacja jednej, 32-bitowej zmiennej?

[#13] Re: Przerwanie wygaszania pionowego

@Minniat, post #4

zrob cos na wzor soldata (www.soldat.pl <- jest to gra darmowa, wiec mozesz obadac na pc o co mi chodzi)

[#14] Re: Przerwanie wygaszania pionowego

@szuler, post #12

Jeśli nie OwnBlitter() to będę musiał wyłączyć multitasking, aby mieć ekskluzywny dostęp do Blittera. Po drugie Wait() w kodzie przerwania rzeczywiście jest niedozwolony.

Według mnie przerwanie może służyć do rysowania. Dowodem jest dokumentacja, która mówi, że można w przerwaniu używać rejestrów sprzętowych w tym Blittera ale ja już to napisałem w ad.1)! Jeśli uważasz, że nie to do czego to przerwanie w ogóle służy?

Póki co piszę dla AGA. CGX w niedalekiej przyszłości.

Jeszcze raz dziękuję szuler, za okazaną pomoc. Masz naprawdę dużą wiedzę nt. programowania na Amidze.

[#15] Re: Przerwanie wygaszania pionowego

@Minniat, post #14

Co innego zapisać przy obsłudze przerwania kilka rejestrów, a co innego przesuwać bloki pamięci (no chyba, że używasz spritów, no ale własnie wtedy piszesz po rejestrach).
Co do faktu, że blitter ma DMA, to nie zapominaj, że na czas transakcji DMA dostęp do chip ram ma wyłącznie blitter. Wszystko inne, z CPU i Agnus na czele, mają zablokowany dostęp do pamięci.
[#16] Re: Przerwanie wygaszania pionowego

@wali7, post #15

Co innego zapisać przy obsłudze przerwania kilka rejestrów, a co innego przesuwać bloki pamięci

Według mnie to jedno i to samo... Ty wpisujesz dane do rejestrów Blittera, a Blitter wykonuje pracę za Ciebie. :)

[#17] Re: Przerwanie wygaszania pionowego

@Minniat, post #16

Ale Ty nie rozumiesz chyba(?) że nie wystarczy wpisać dane do rejestrów Blittera, ale trzeba jeszcze poczekać aż skończy pracę przed ponownym blitem... I właśnie dlatego takie operacje na przerwaniu to zły pomysł...
Przerwanie można wykorzystać do synchronizacji, i wysyłania sygnałów do procesu który zajmuje się rysowaniem, że nastąpiło przerwanie...

[#18] Re: Przerwanie wygaszania pionowego

@MinisterQ, post #17

Oczywiście, że wiem, że trzeba wykonać WaitBlit() między blitami. Jeszcze nie ćwiczyłem z przerwaniami i wysyłałeniem sygnałów (co najwyżej odbierałem za pomocą Wait() - GetMsg()). Poćwiczę pracę z tym przerwaniem i wysyłaniem sygnałów i sam ocenię testy. Jeśli się nie powiodą zrezygnuję z rysowania w przerwaniu.

[#19] Re: Przerwanie wygaszania pionowego

@Minniat, post #18

1) W ogóle wspominam w tym temacie o przerwaniu VBlank tylko po to, że podczas tego przerwania obraz nie jest generowany, więc jest czas na rysowanie obiektów. Istnieje też przerwanie, które jest wykonywane gdy bllitter skończy pracę. Wiem, że można użyć podwójnego buforowania, stosowanego przeze mnie do tej pory!

2) 10-15 animowanych rychomych obiektów musi mi wystarczyć i chyba będzie. Większa liczba obiektów znacznie zmniejsza płynność animacji. Na przykład w mojej grze będzie kilka postaci komandosów, kilka ruchomych pocisków i wiele obiektów nieruchomych choć animowanych jak bronie, amunicja. No zobaczymy - może uda mi się stworzyć porządnie działającą grę - znacznie bardziej zaawansowaną niż Robbo jeśli chodzi o szybki i płynny ruch obiektów.

[#20] Re: Przerwanie wygaszania pionowego

@Minniat, post #19

Minniat napisał(a):

> 1) W ogóle wspominam w tym temacie o przerwaniu VBlank tylko po
> to, że podczas tego przerwania obraz nie jest generowany, więc
> jest czas na rysowanie obiektów.

Samo wygaszanie pionowe trwa 20 mikrosekund. Co zdazysz zrobic w tym czasie?

[#21] Re: Przerwanie wygaszania pionowego

@szuler, post #20

Jeśli używam pojedyńczego buforowania to ten czas musi wystarczyć na narysowanie obiektów inaczej może wystąpić "kaszana" na ekranie ponieważ obraz będzie wyświetlany podczas rysowania obiektów. W przypadku Robbo używam pojedyńczego buforowania i do synchronizacji używam funkcji WaitTOF(), która czeka na szczyt ramki, a nie na spód oraz bardzo szybkich BltBitMap(). WaitBOVP() jest zabugowany i używa busy-wait. Jest jeszcze VBeamPos(). Po drugie podwójne buforowanie jak wspomniałem jest tu jedynym rozwiązaniem przy dużej liczbie obiektów do animowania.

[#22] Re: Przerwanie wygaszania pionowego

@Minniat, post #19

Możesz zastosować potrójne buforowanie, w niektórych przypadkach może pomóc. I wtedy powalcz o 20-30 animowanych ruchomych obiektów.

[#23] Re: Przerwanie wygaszania pionowego

@asman, post #22

A jednak można używać Blittera poprzez przerwania. Być może nie będzie mi to konieczne ale warto spróbować. Znalazłem dwie funkcje systemowe, które mogą mi pomóc, są to: QBlit() oraz QBSBlit(), które ustawiają w kolejce moje blity. Druga z tych funkcji synchronizuje to z promieniem wizji. Przetestuję te funkcje.

Znalazłem to przy okazji czytania technik tworzenia gier na płytce Amiga Developer CD:

Q: I need to use the blitter in an interrupt driven manner instead of
polling it for completion. Aren't the QBlit routines too slow?

A: The QBlit/QBSBlit system was completely re-written for 3.0, and now
has quite low overhead.

6) Interrupts.
Set up interrupt servers with high priority. Your server will
then be the first called.


P.S. Co to jest potrójne buforowanie? Chyba podwójne wystarczy w zupełności.



Ostatnia modyfikacja: 19.09.2008 15:59:56
[#24] Re: Przerwanie wygaszania pionowego

@szuler, post #20

Samo wygaszanie pionowe trwa 20 mikrosekund.

Krócej niż linia? W systemie PAL wygaszanie pionowe trwa od 160 do 192 mikrosekund. Poza tym przerwanie VBLANK nie musi się zakończyć w trakcie sygnału wygaszania.



Ostatnia modyfikacja: 20.09.2008 07:47:00
[#25] Re: Przerwanie wygaszania pionowego

@Minniat, post #23

Kolego,
Czy Ty w ogole wiesz do czego sluza przerwania? Nie rysuje sie na przerwaniach,a juz szczegolnie nie na vertb. On sluzy,jak szuler napisal,
do rozglaszania ze takowe nastapilo. Mozna dzieki niemu latwo zsynchronizowac wysw. grafiki. Po drugie jestem ciekaw jak bedzie to dzialac na AGA + vga. Odpusc sobie grzebanie w bebechach bo nie masz (aktualnie) odpowiedniej wiedzy.Uzyj systemow cgx/gfx.lib i synchronizuj w normalny sposob timer.device albo podczep przerwanie ktore wysle sygnal do twojego tasku (renderujacego),ze pora odrysowac wszystko.Jest przyklad w aos sdk.

Jezeli koniecznie ci zalezy na napisanie w swoj sposob,uzyj amos-a

[#26] Re: Przerwanie wygaszania pionowego

@AmiChris, post #25

Nie przeczytałeś dokładnie mojego postu #23, na który odpowiadasz. Wspominam tam o funkcjach systemowych QBlit() oraz QBSBlit(), które to ustawiają w kolejce blity i ew. synchronizują je z promieniem wizji. Tak radzi dokumentacja technik tworzenia gier dla Amigi 1200 z Amiga Developer CD v2.1 dla systemu AmigaOS 3.5, jeśli chce się powiązać przerwania i Blitter. (Tak na marginesie to nawet Copper może czekać, aż Blitter skończy pracę). Ale już nie piszę, że będę rysował w przerwaniach. To nie jest "grzebanie w bebechach" ponieważ używam tylko funkcji systemowych oraz ew. Blittera bezpośrednio dla niezbędnej szybkości. "timer.device" może mieć rozdzielczość wygaszania pionowego VBLANK oraz dokładniejsze.

Nie będę pisał w AMOSie, bo chcę by moja gra była zgodna z systemem, na ekranie promowanym do VGA oraz w 256 kolorach.

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