[#1] odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy
cześć,
w pętli głownej odczytuje stan joystika za pomocą funkcji z lowlevel.library
ale ewidentnie zarówno na winuae jak i na A1200 z v1200
fps zmniejsza się ok. 1.5 klatki.
Bez tego kodu fps wzrasta z powrotem o ok. 1.5
Podczas testu wyłączam WaitTOF() zeby nieczekać i policzyć max fps, może to jest przyczyną?
1.5 fps, to sporo, jak na taką funkcyjkę...

ULONG joy_port_state = ReadJoyPort(1);

ENGINE_io__input.joy_left       = joy_port_state & JPF_JOY_LEFT;
ENGINE_io__input.joy_right      = joy_port_state & JPF_JOY_RIGHT;
ENGINE_io__input.joy_up         = joy_port_state & JPF_JOY_UP;
ENGINE_io__input.joy_down       = joy_port_state & JPF_JOY_DOWN;
ENGINE_io__input.joy_button_1   = joy_port_state & JPF_BUTTON_RED;
ENGINE_io__input.joy_button_2   = joy_port_state & JPF_BUTTON_BLUE;



W jaki sposób odczytać stan joya, kierunki, fire 1 i fire 2 samemu z rejestrów?
bo troche to namieszane, w C najlepiej. Tylko tu znonu nie wiem czy to dobry pomysl,
bo czy na amigo-podobnych systemach to zadziała w porowniau do funkcji systemowej.

Ps.
Oprócz tej funkcji jest też jakis gameport device tez do obsługi Joya, jest jakaś różnica?


Ostatnia aktualizacja: 15.09.2025 23:12:02 przez mateusz_s

Ostatnia aktualizacja: 15.09.2025 23:41:54 przez mateusz_s
[wyróżniony] [#2] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #1

Co do odczytu stanu joya mozna skozystac ze gameport.device.
W tym przypadku moge Cie odeslac do artykulow Asmana: "Jak napisac wlsana gre".

Mozna tez jechac po rejestrach: dla kierunkow z 0x00DFF00C.
Wartosc z tego rejestru nalezy potraktowac ANDem z 0x0303
I jesli wyniki sa nastepujace:

0x0300 - w lewo
0x0003 - w prawo
0x0100 - do przodu
0x0001 - do tylu

A dla fire z: 0x00BFE001.
Jesli 7 bit jest == 0 to wcisnieto Fire 1.
[wyróżniony] [#3] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #1

Co do lowlevel to jak pamiętam The Lost Vikings w wersji CD32 używa tej biblioteki i jakoś nie chcę mi się wierzyć że przy odczycie by mu zeszło 1 ramkę. Może to kwestia ustawienia /SetJoyPortAttrs. Ale trzeba wziąć pod uawgę że jednak jak piszą w notce ReadJoyPort

This is a low level single threaded function that does not fit the normal Amgia multitasking model. Only one process can be executing this routine at any time. All others will return immediately with JP_TYPE_NOTAVAIL.



A Zważywszy na założenia, ja bym spróbował z gameport.device.
Odsyłam do tego kursiku co napisałem. Inna sprawa że przydałoby się go odświeżyć / poprawic / zmienić.
[#4] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@asman, post #3

dzieki za informacje.. OK

poratujecie linkiem? wiem ze kiedys to wiedzialem ale nie moge znaleźć,
powinno byc chyba w artykułach, ale nie widze..

zerkne na gameport.device, nie korzystalem z niej jeszcze..
wiem że BSzili uzywa jej w swoich portach,
ale chyba glownie daltego zeby skorzystać z pada PSX,
jak nie znajdzie pada psx to korzysta z lowlevel.. ale nie analizowalem tak szczegolowo




Ostatnia aktualizacja: 16.09.2025 13:14:37 przez mateusz_s
[#5] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #4

Ok,
wymieniłem ReadJoyPort() na obsługę gameport.device,
co prawda jest trochę więcej roboty i pisania,
ale jest szybciej i fps wrócił do normy o te ~1.5 fps

Stan aktualizuje w głównej pętli taki sposób,
zastanawiam się tutaj czy sprwdzać tylko jeden GetMsg czy dać go w while() zeby cała kolejke rozpakować

Zrobiłem tak jak u BSziliego, czyli zamiast rozpakowac cała kolejke w pętli while jest tylko pobranie jednej wiadomosci -> If (GetMsg...
i wysłanie kolejnego requestu SendIO tylko jak odczytano coś

if (GetMsg(system__gameport_mp) != NULL)
{
   switch(system__gameport_ie.ie_Code)
   {
      case IECODE_LBUTTON:
         ENGINE_io__input.joy_button_1   = 1;
         break;

       case (IECODE_LBUTTON | IECODE_UP_PREFIX):
          ENGINE_io__input.joy_button_1 = 0;
          break;

        default:
            break;
     }

       // Send read request
           system__gameport_io->io_Command = GPD_READEVENT;                // to read events
           system__gameport_io->io_Length = sizeof (struct InputEvent);
           system__gameport_io->io_Data = (APTR)&system__gameport_ie;      // put results into system__gameport_ie
            SendIO((struct IORequest *)system__gameport_io);                // asynchronous      
}


W Amigowym przykładzie na AmigaWiki zamiast if dali while żeby odczytac wszytkie komunikaty w kolejce
w dodatku wysyłają żądanie co klatkę: https://wiki.amigaos.net/wiki/Gameport_Device
[#6] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #5

Ja bym dał while, bo uważam że if to błąd, bo kto potem odbierze te smutne komunikaty ? Zostaną same aż do resetu :)
1
[#7] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@asman, post #6

UPDATE:
niestety okazało się że jestem DEBILEM

Miałem błąd podczas liczenia FPS-ów,
który mi zaniżał i zaburzał średnią.

Po naprawieniu, nie widze już różnicy
pomiędzy korzystaniem z gameport.device,
lowlewvel czy jak nie ma ich wcale..

Raczej zostane teaz przy ReadJoyPort()
z lowlevel..

dzieki wszytkim za rady i pomoc szeroki uśmiech


Ostatnia aktualizacja: 17.09.2025 12:20:25 przez mateusz_s
[#8] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #7

UPDATE 2:
oc#ujam zaraz..

zacząłem jeszcze raz to mierzyć żeby mieć pewność.
CPU juz rysował konkretne rzeczy na ekranie i pracował,
tak zeby nie generował pustych klatek.

Okazało się teraz, ze tylko na WinUAE
wystarczy wrzucić tą funkcje ReadJoyPort() do głównej petli
i jest ewidentny spadek ok. 1-1.5 fps
nawet nie musze pobierać z niej danych.
Na Amidze 1200 z v1200 jest bez roznicy.

W każdym razie, na WinUAE - usunięcie jej i zastąpienie obslugą gameport.device
nie powoduje żadnego spadku, czyli jednak potwierdzam to co wczesniej zauważyłem..

Ale to raczej cos z WinUAE chyba, jesli na normlaniej Amidze jest bez różnicy teraz,

masakra jakaś normlanie..
ale znowu nie wiem teraz ktore rozwiazanie rozstawić
może jednak ten gameport.device..


-----------------------------------------------winuae		v1200
-------------------------------------------------------------------------------

bez rysowania, samo c2p				
i bez czytania stanu joysticka 
i obsługi wejścia				63/64 (OK!)	~70 (OK!)
-------------------------------------------------------------------------------

rysowanie (manager+bg+player+osd)
bez czytania stanu joystika			58.3		65/66
-------------------------------------------------------------------------------

rysowanie (manager+bg+player+osd)
joystik ReadJoyPort()				57.3 (!!!)	65/66
-------------------------------------------------------------------------------

rysowanie (manager+bg+player+osd)
joystik gameport.device				58.3 (OK!)	65/66
[#9] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #8

Musisz miec wyniki od kogos kto ma Amige z 68040 lub 68060
68080 to specjalny procesor, mocno zoptymalizowany przez Gunnara-a jesli chodzi o rozne timingi.
Pamietam, jak jakas procedure kopiujaca testowales na 68080 i wyniki byly takie same niezaleznie jak dobra lub slaba byla ta procedura kopiujaca.
Wiec 68080 nie jest dobrym procesorem do testow, czy dana procedura jest dobra czy slaba.
Musisz 68040 lub 68060 uzywac do tego.
WinUAE tez jest slabe do takich testow, oprocz testow szybkosci dla 68000.
[#10] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@Don_Adan, post #9

no niestety z "normalnych" to mam tylko 030 / 38mhz,
ale to znowu by trzeba przekładać za każdym razem karte,
Kolega nieraz testuje na 060..
[#11] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@mateusz_s, post #10

To popros na PPA.
Dobrze jest miec wyniki z 68040/68060/68080.
Wtedy bedziesz wiedzial co wybrac.
[#12] Re: odczyt stanu joysticka - funkcja ReadJoyPort() zżera fpsy

@Don_Adan, post #11

Albo na EAB, tam jest najwiecej testerow.
Przygotuj pare wersji, i wrzuc do Zone.
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