[#31] Re: UNIT_VBLANK

@docent, post #29

ChangeScreenBuffer jest funkcja z intuition.library a nie z graphics.library i nie wysyla zadnej wiadomosci, po prostu przelacza bitmape podanego w parametrach wejsciowych screenu na inna, podana w parametrach.

Przepraszam, rzeczywiście z intuition. Pomyliłem się, bo ta funkcja korzysta z ChangeVPBitMap() z biblioteki graphics.

Co do drugiej części to mam rację. Funkcja po wywołaniu wysyła te wiadomości. Należy wypełnić pola sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort oraz sb_DBufInfo->dbi_DispMessage.mn_ReplyPort. Wówczas po wywołaniu ChangeScreenBuffer() wysłane zostaną w odpowiednim czasie wiadomości pod podane porty komunikacyjne.

Szczegóły w opisie funkcji AllocDBufInfo().

Ostatnia aktualizacja: 28.07.2019 16:02:07 przez Hexmage960
[#32] Re: UNIT_VBLANK

@mschulz, post #30

Warto wspomniec ze strobe jest dostepne tylko w duzych amigach, A500/A1200 nie otrzymuje tego sygnalu z zasilacza. Z ciekawosci zajrzalem do schematow A2000 i faktycznie, jest! Sygnal TICK poprowadzony z zasilacza m.in. do jumpera J300 obok ukladu CIA. Za pomoca tego jumpera mozna wybrac zrodlo przerwan dla CIA-A, albo jest to wlasnie TICK (jumper na pozycji "normal"), albo VSYNC (jumper na pozycji "A500").


Uzupelnienie. Ze schematow ktore znalazlem wynika, ze zegar CIA-A mogl byc napedzany czestotliwoscia sieci w A1000, GB A1000 (jumper X16), A2000 (jumper J300) i A3000 (jumper J350). Amiga A4000 podzielila los "maluchow" i zegar CIA-A dziala z czestotliwoscia VSYNC. Przez schemat A1000 jeszcze sie nie przekopalem wiec nie wiem jak to tam jest zrobione. Troche szkoda tej A4000...

Ostatnia aktualizacja: 28.07.2019 16:50:50 przez mschulz
[#33] Re: UNIT_VBLANK

@mschulz, post #32

Co do A1000, to na plycie nie ma zadnego jumpera, ktory by to przelaczal - TICK jest pospiety na stale do cia.
A2000 ma, ale tylko w wersji B, wersja A zdaje sie ze nie ma tego jumpera. Aha, jeszcze A3000T tez ma taki jumper.
Zasilacze pc nie maja wyprowadzonego odpowiedniego sygnalu, wiec wymagane byly specjalnie budowane (czyli drozsze) zasilacze, a jak wiadomo Commodore ostro zaczal oszczedzac w tym czasie. W efekcie w A4000 skonczylo sie na tanszym, bardziej standardowym zasilaczu i spieciu na stale cia z vsync.
[#34] Re: UNIT_VBLANK

@docent, post #33

Co do A1000, to na plycie nie ma zadnego jumpera, ktory by to przelaczal - TICK jest pospiety na stale do cia.


Tego nie bylem pewien. Znalazlem tylko jeden schemat, ale nie wiem ile ma wspolnego z A1000: link. Strona 3, Jumper J2 pozwala wybrac miedzy VSYNC a TICK50 z zasilacza. W przypadku A2000 znalazlem tylko schemat wersji R6, link. A3000T nie wymienilem bo to bylo raczej oczywiste :)

Zasilacze pc nie maja wyprowadzonego odpowiedniego sygnalu, wiec wymagane byly specjalnie budowane (czyli drozsze) zasilacze, a jak wiadomo Commodore ostro zaczal oszczedzac w tym czasie.

Ano. W szkoda troche bo to dosc prosta i tania zmiana w zasilaczu. No, ale wiadomo - ciecie kosztow, kazdy cent sie liczyl...
[#35] Re: UNIT_VBLANK

@mschulz, post #34

To mi wyglada na schemat od GBA1000. W A1000 J2 to oznaczenie gniazda rf.
[#36] Re: UNIT_VBLANK

@Korni, post #20

Hm, przecież jak rysujesz openglem, to pod morphosem tinygl ma domyślnie ustawiony sync na 1 (env TGLSYNC). Softwarowo (glowo też) dać najlepiej opcję ustawiająca max FPS.

Słuszna uwaga. OK Faktycznie nie ma się co przejmować częstotliwością rysowania. Ale to tylko rysowanie. Całego liczenia, logiki też nie chcę aktualizować częściej niż jest rysowany ekran, bo to nie ma sensu. Dlatego zawsze to synchronizuję z częstotliwością odświeżania ekranu.

Ale spoko, poradzę sobie. Będzie dobrze.
[#37] Re: UNIT_VBLANK

@MDW, post #36

Będzie pan zadowolony?
[#38] Re: UNIT_VBLANK

@recedent, post #37

Taaa. Uznałem, że nie ma sensu z tym walczyć skoro w innych trybach niż PAL/NTSC VBLANK to nie jest VBLANK i zapis z dokumentacji to jest po prostu zaszłość historyczna.
[#39] Re: UNIT_VBLANK

@MDW, post #38

Nie rozumiem z czym kolega miał problem.

Co chciał kolega wpisać do pól struktury timerequest?

Przecież podaje się tam czas w mikrosekundach i sekundach.

TimerIO->tr_node.io_Command = TR_ADDREQUEST;
TimerIO->tr_time.tv_secs  = 60;        /* Delay a minute */
TimerIO->tr_time.tv_micro = 500000;    /* and a half     */
DoIO(TimerIO);

Nie da się tam wpisać "czekaj jedną ramkę". Trzeba konkretnie podać np. 0,02 sekundy.

Nie używa się timer.device do czekania na ramkę. Z timer.device można ładnie zsynchronizować program z prawdziwym czasem niezależnym od prędkości komputera.

Rozumiem, że Amiga klasyczna posiada inne "liczniki" aniżeli sprzęt pod systemy NG. W Amidze klasycznej UNIT_VBLANK sprawdza czy upłynął żądany czas co ramkę.

Najnowszy RKRM jest poświęcony systemowi w wersji 2.04 więc nie dziwota że nie znalazły się tam informacje dot. nowszych wersji.

Dokumentacja programistyczna do systemów NG jest chyba niekompletna. Jak ktoś zadaje takie pytanie jak kolega, często nie dostaje jednoznacznej i szczegółowej odpowiedzi.

Do takiej synchronizacji ja ostatnio używam ChangeScreenBuffer() i jestem całkiem zadowolony. Nawet kolega Kiero z tego co się orientuję używa tej funkcji w swoich demach, które działają i na Amidze i na MorphOSie.

Z relacji wiem, że moja gra też jakoś sobie radzi na systemach NG w tym Amiga OS4 i MorphOS. A piszę ją na Amidze 1200 z AGA nie mając innych sprzętów do testowania.

Po prostu stosuję natywne API Amiga OS. Bardzo to zresztą lubię. Gdyby systemy NG rozszerzyły możliwości datatypów o odtwarzanie muzyki (np. poprzez moduły w formacie IFF SMUS) byłoby bardzo wygodnie adaptować gry.

Ostatnia aktualizacja: 29.07.2019 17:43:38 przez Hexmage960
[#40] Re: UNIT_VBLANK

@Hexmage960, post #39

Co chciał kolega wpisać do pól struktury timerequest?
Przecież podaje się tam czas w mikrosekundach i sekundach.

Tak właśnie chciałem wpisać. Chciałem podać czas mikrosekundach jaki mija między jednym a drugim odświeżaniem ekranu. W czasach monitorów LCD to prawie zawsze jest 1/60 sekundy. Ale nie lubię ustawiania na stałe takich wartości. To ma być wartość pobrana z systemu, bo istnieje szansa, że ktoś będzie miał jednak inaczej. A nie chcę robić obliczeń (których mam sporo) częściej niż ekran jest wyświetlany. Ani też rzadziej żeby sztucznie nie "skakało".

Oczywiście mogę zrobić tak jak cały dzisiejszy świat "poważnego" gamedevu, czyli ustawić sobie jakąś maksymalną częstotliwość odświeżania i mieć w nosie wszystko co działa szybciej. Ale nie lubię takich prymitywnych rozwiązań. Zresztą w źródłach SDL też widzę podobne "lamerskie" rozwiązanie, jakieś stałe MAX_FPS=200 i MIN_FPS=1. Okropieństwo. Tak to sobie można robić w pracy, a nie w poważnym hobby.

Gdyby systemy NG rozszerzyły możliwości datatypów o odtwarzanie muzyki (np. poprzez moduły w formacie IFF SMUS) byłoby bardzo wygodnie adaptować gry.

A co, nie ma dźwiękowych datatypów? Ja w SYS:Devs/Datatypes mam np. Protracker i w SYS:Classes/Datatypes mam protracker.datatype. A w analogicznych katalogach MOSSYS: mam datatypy: 8SVX, 16SV, MP3, AIFF. Poza tym MorphOS znacznie rozszerzył możliwości w tym zakresie przez Raggae, które jest integralną częścią systemu.

Ostatnia aktualizacja: 02.08.2019 11:33:25 przez MDW
[#41] Re: UNIT_VBLANK

@MDW, post #40

W Reggae masz także player do modułów Digiboostera. Jak klikniesz na dbm to ci nawet Ambient odegra.
[#42] Re: UNIT_VBLANK

@michal_zukowski, post #41

No właśnie, choćby nawet sam Ambient odgrywa różne dźwiękowe formaty. Chociaż akurat o DBM nie wiedziałem. szeroki uśmiech
[#43] Re: UNIT_VBLANK

@MDW, post #42

No to fajowo. Z DigiBooster to jest myśl - wszak jest i na Amiga OS 3. A co do datatypów 8SVX czy Protrackera - to czy istnieje gdzieś dokumentacja opisująca metody tych datatypów?

P.S. Sorki za off-topic.

Ostatnia aktualizacja: 02.08.2019 13:35:42 przez Hexmage960
[#44] Re: UNIT_VBLANK

@MDW, post #40

Zatem podaj czas 1/60 sekundy w tym UNIT_CPU, albo UNIT_MICROHZ i powinno być git.

Ale skoro UNIT_VBLANK u Ciebie działa w 1/50 sekundy to chyba nie jest tak źle? Przynajmniej masz unormowany ten czas.

Na Amidze klasycznej ja bym zrobił przerwanie VBlank albo software'owe przez timer.device, ew. przerwanie Coppera żeby uzyskać taki efekt (oprócz podanego wcześniej ChangeScreenBuffer()).

Ostatnia aktualizacja: 02.08.2019 13:58:34 przez Hexmage960
[#45] Re: UNIT_VBLANK

@Hexmage960, post #44

Prawdę mówiąc nie chcę mieć unormowanego i wymyślonego czasu tylko taki jaki faktycznie jest w danym trybie graficznym. Jeżeli ktoś podłączy monitor CRT i tam na przykład użyje trybu z odświeżaniem 100Hz to bez sensu wszystko będzie przeliczane 60 razy na sekundę, a mogłoby 100 razy na sekundę. Wszystko ma działać w dowolnym deltaTime, także zmiennym. Na takich stałych to się robiło w czasach komputerów 8-bitowych. Oczywiście

Cały czas mówię o obliczeniach, nie wyświetlaniu/rysowaniu (które będzie robione tyle razy ile trzeba w danym trybie). Obliczenia to sprawa odrębna od rysowania ale jednak fajnie gdy każda rysowana klatka ma aktualne wartości, a jednocześnie te obliczenia nie wykonują się częściej niż jest przerysowywany ekran, bo szkoda grzać maszynę.

Ale spoko, już mam to ogarnięte. Dzięki poradzie na MorphZone mam częstotliwość odświeżania ekranu dla dowolnego wybranego ScreenModeID. Sposób nieco pokręcony ale okazuje się, że tak to się robiło w wielu programach, które potrzebowały tej wartości do jakiegoś celu. szeroki uśmiech
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