|
FPS a stała obiektywna szybkość |
| Autor |
Wiadomość |
sulge
Sierżant
 
Pomógł: 1 raz Posty: 125
3935 Prestiż
|
Wysłany: 14-11-2006, 16:21 FPS a stała obiektywna szybkość
|
|
|
Od pewnego czasu prubuję rozwiązać pewien problem jak spowodować, aby gra na punkty była odporna na działanie spowalniaczy. W przypadku gdy główną istotą gry jest szybkość reakcji.
Z tego co wywnioskowałem klasyczne rozwiązanie tego problemu jest takie, że jeżeli szybkość gry spada poniżej jakiejś określonej z góry ilości klatek/sekundę wynik nie jest zaliczany. Jest to rozwiązanie proste aczkolwiek niesatysfakcjonujące. Problem polega na tym, że osoby o słabych kompach po prostu nie mogą wysyłać swoich wyników.
Z moich doświadczeń wynika iż MMF nakłada limit górny na ilość klatek/sekundę wynoszący 50 klatek/na sekóndę o ile mnie pamięć nie myli, nie nakłada jednak limitu dolnego. Ma to swoje zalety, bo dzięki temu gry na słabych kompach nie "tną", a zwalniają. Limit klatek w MMF można wytłumaczyć następująco jeśli np. pozycję X jakiegoś obiektu bedziemy zmieniać w ten sposób, że w zdarzeniu zawsze>>pozycja X obiekt=pozycja X("obiek")+1 to po upływie 1 sekundy obiekt ten zmieni swoja pozycję o 50 pixeli (zakładając, że FPS=50, w ogólnym przypadku jeśli FPS="A" to obiekt w ciągu 1 sekundy zmieni swoje położenie o "A" pixeli).
Moje podejście do problemu jest następujące jeśli w grze naistotniejszą rzeczą sprawiającą graczowi problem jest szybkość obiektów to można by zrobić coś taiego skoro zakładana przez nas ilość klatek/na sekundę wynosi 50, a szybkość obiektu to np. 10, a wogólnym przypadku "Z" (zawsze>>pozycja("obiekt")=pozycja("obiekt")+10) to, aby przebyty dystans w określonym czasie zawsze był taki sam (i na szybkich maszynach bezproblemu wyciągających załozoną przez nas ilośc 50 fps) to szybkość można by uzależnić od fps.
Ostatecznie uwięczeniem moich rozważań jest taki oto wzorek:
szybkosc=50.0/A*Z, gdzie A-ilość fps na danej maszynie, Z-zakładana szybkość gdy A=50.
I tu moja prośba do Was o próbę analizy moich wypocin i potwierdzenia lub zanegowania ich. |
| Ostatnio zmieniony przez Minty 17-11-2006, 21:13, w całości zmieniany 1 raz |
|
|
|
 |
Slawo
Legenda
 
Główny edytor: 
Pojedynki: nie
Pomógł: 16 razy Posty: 706
25566 Prestiż
|
Wysłany: 14-11-2006, 16:29
|
|
|
Chyba wiem co kombinujesz, ale nie za bardzo rozumiem.
Czy chodzi o to, że na początku testujemy maszynę i FPS jakie ona wyciąga będzie tym maksymalnym dla tej maszyny ? I potem np. jeśli moja maszyna w grze wyciąga bez spowalniacza maks 40FPS to mój limit będzie 40 - np. 5FPS a komuś, komu wyciąga 49FPS będzie 49 - ok. 5 FPS ?
To by było genialne, tylko jak ustalić maksymalne FPS na danej maszynie ?
Przecież w momencie ustalania ktoś może np. ... dzielić sobie plik Totall Commanderem czy scalać i ... wyciagnie 10 FPS ....
Mi się wydaje, że nie da się ustalić w gzre ile bez spowalniacza wyciągnie w niej dana gra, bo to zależy od innych czynników, czyt. uruchomionych procesów na komputerze. |
_________________ http://pograjmy.webd.pl - gry z rankingami graczy i turniejami - miejsce również na Twoje gry klikowe
Ponad 150 gier wydanych
Od 2003 w klikach
Od 2001 w hiscoresach na www
http://pograjmy.webd.pl/typer/ (typuj wyniki Mundialu)
Czytam: http://kontrowersje.net |
|
|
|
 |
sulge
Sierżant
 
Pomógł: 1 raz Posty: 125
3935 Prestiż
|
Wysłany: 14-11-2006, 16:38
|
|
|
Slawo najbardziej ogólnie mówjąc chodzi mi oto że jeżeli w danej chwili (to jest z buforem jednosekundowym) twoja maszyna wyciąga 40 klatek (i ja zakładałem, żeby nie była zbyt trudna ani zbyt łatwa to na 40 klatkach ma mieć szybkość np. 5, czyt zawsze zwięk pozycję o 5 pixeli ) To jeżleli ktoś gra na spowalniaczu i gra wyciąga 20 fps to szybkość ta automatycznie rośnie do 10.
Co to daje??
A no to ze na obu maszynach obiek w ciągu 1s zmieni swoje położenie o 200 pixelów (czyli ma taksamo trudno ).
Zakładając że moje analizy i wnioski są słuszne. |
|
|
|
 |
Slawo
Legenda
 
Główny edytor: 
Pojedynki: nie
Pomógł: 16 razy Posty: 706
25566 Prestiż
|
Wysłany: 14-11-2006, 16:44
|
|
|
| sulge napisał/a: | | ... na 40 klatkach ma mieć szybkość np. 5, czyt zawsze zwięk pozycję o 5 pixeli ) To jeżleli ktoś gra na spowalniaczu i gra wyciąga 20 fps to szybkość ta automatycznie rośnie do 10. |
Ha, właśnie, tylko czy to na pewno da się opisać jakimś wzorem, mi się wydaje, że raczej trudno będzie.
Najlepiej wmontuj ten Twój wzór w grę i daj mi linka, pzretestuję ze spowalniaczem jak się gra wtedy |
_________________ http://pograjmy.webd.pl - gry z rankingami graczy i turniejami - miejsce również na Twoje gry klikowe
Ponad 150 gier wydanych
Od 2003 w klikach
Od 2001 w hiscoresach na www
http://pograjmy.webd.pl/typer/ (typuj wyniki Mundialu)
Czytam: http://kontrowersje.net |
|
|
|
 |
sulge
Sierżant
 
Pomógł: 1 raz Posty: 125
3935 Prestiż
|
Wysłany: 14-11-2006, 16:47
|
|
|
| Slawo napisał/a: | | Ha, właśnie, tylko czy to na pewno da się opisać jakimś wzorem, mi się wydaje, że raczej trudno będzie. |
Slawo pewnie się da tylko nie wiem czy takim prostym do jakiego doprowadziły mnie moje zawodne szare komórki. Stąd ten temat i próba wspólnego rozwiązania myślę ciekawego problemu.
Oki wiesz oczywiście że nie mam neta w domu więc oki oznacza jutro |
|
|
|
 |
BROO
Pupogłowy Wizard x-)

Główny edytor: 
Pojedynki: nie
Pomógł: 37 razy Posty: 502
31680 Prestiż
|
Wysłany: 14-11-2006, 17:02
|
|
|
Kod: | szybkość we wsp. x:
. dx
x = --
dt
szybkość we wsp. y:
. dy
y = --
dt
|
Zatem:
Kod: | przemieszczenie we wsp. x po czasie dt
.
dx = x * dt
przemieszczenie we wsp. y po czasie dt
.
dy = y * dt
|
Czyli tak jak mówisz: trzeba licznikami zliczać zmianę "timer" (timer to f-kcja pobierająca czas w 1/1000 sek jaki minął od początku): to jest dt. Na małym obciążeniu wynosi 20, 21, 30, 31 (z czego wartości 21, 30 i 31 zdarza się rzadko).
Prędkość x-owa i y-owa jest zadeklarowana i tylko należy ją przemnożyć przez zmianę czasu od ostatniej akcji. To rozwiązanie oczywiście nie uwzględnia ułamkowych przesunięć (ale w MMF c-h-y-b-a jest coś takiego jak pozycja x i y jako double).
do znawców oznaczeń: jeśli popełniłem błąd w zapisie proszę o jego sprostowanie |
|
|
|
 |
jarlfenrir
Generał brygady
 
Główny edytor: 
Drugi edytor: 
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 14-11-2006, 19:15
|
|
|
200:[aktualne FPS]
myślę, że coś takiego sprawi, iż w ciągu sekundy obiekt przesunie się zawsze o 4px. Im mniej FPS, tym mniejszy dzielnik i tym samym większe przesunięcie w jednej klatce.
Teraz nie jestem pewien, ale FPS chyba moze sprawdzać aktualna wartość w czasie gry? Bo jeżeli nie, to mój sposób odpada.
[ Dodano: 14-11-2006, 19:17 ]
Właśnie wymyśliłem coś genialnego: w preferencjach gry można wybrać: szybkość gry niezależna od procesora. To daje zblizoby efekt, ale jest niebezpieczne, bo jak sie gra przytnie na sekundę, to po jej upywie może sie okazać, iż już przegrałeś. |
|
|
|
 |
BROO
Pupogłowy Wizard x-)

Główny edytor: 
Pojedynki: nie
Pomógł: 37 razy Posty: 502
31680 Prestiż
|
Wysłany: 14-11-2006, 19:42
|
|
|
| Machine independent speed zwykł psuć gry wykorzystujące Fast Loop (a przynajmniej u mnie silnik platformowy wtedy nie sprawował się należycie). |
|
|
|
 |
Slawo
Legenda
 
Główny edytor: 
Pojedynki: nie
Pomógł: 16 razy Posty: 706
25566 Prestiż
|
Wysłany: 14-11-2006, 20:14
|
|
|
| Fenrir napisał/a: | | Właśnie wymyśliłem coś genialnego: w preferencjach gry można wybrać: szybkość gry niezależna od procesora. |
Był expert od wzorów BROO to ja jako expert od spowalniacza powiem, że independent speed wybrany z TGfa czy MMFa NIE DAJE NIC . Sprawdzone !!!
Propozycja z wzorem 200 : FPSaktualny nie jest głupia, ale dlaczego 200 ?
Tasmpolu, RX zastosował wykrywanie zbyt niskiego FPS w Świstaku Kurierze, ale ... po tygodniu odkryłem, że ono tam działa tylko kilkanaście sekund na starcie gry a potem włączony spowalniacz działą w najlepsze, do odkrycia wyniki były ok. 12tys. Teraz są ponad 20 i sam mogę takie zrobić jak się skoncentruję.
Otóż RX przekombinował z ilością wartości i nie działą wykrywanie stale.
Poprawiłem to i już w następnych grach (m.in. Tunel, Warp, Space Girl) działa bez pzrerwy.
A jak to zrobiłem i robię ?
zawsze ---> dodaj jeden do licznika X
co 1 sek. ---> zapisz aktualną wartość licznika X (czyli FPS) do Z
gdy w. Z < od np. 40 co 1 sekundę dodaj 1 do innego licznika Y
i np. gdy po 5 sekundach fps nadal jest poniżej normy (tu 40)
gdy w. Y > 4 --> pokazuj okno z informacją - "zbyt wolny komp lub spowalniacz " ---> zeruj wyniki.
Działa, ale gdy wahania fps w grze nie są zbyt duże (5-10) bo inaczej nie dałoby się grać.
W Tunelu minimum ustawiłem aż na 48 bo spowalniacz na 50% coś tam spowalniał a fps i tak mało spadało. |
_________________ http://pograjmy.webd.pl - gry z rankingami graczy i turniejami - miejsce również na Twoje gry klikowe
Ponad 150 gier wydanych
Od 2003 w klikach
Od 2001 w hiscoresach na www
http://pograjmy.webd.pl/typer/ (typuj wyniki Mundialu)
Czytam: http://kontrowersje.net |
|
|
|
 |
Minty
Stwórczyni omc dr fizyki
 
Główny edytor: 
Drugi edytor: 
Pojedynki: być może
Pomogła: 259 razy Posty: 3447
33795 Prestiż
|
Wysłany: 14-11-2006, 22:31
|
|
|
Otóż przesłałam Ci, Slawo, rozwiązanie, a to, że nie chcesz go implementować to już twoja sprawa.
Tak wygląda kod mojego rozwiązania (operacje na zmiennych obiektu aktywnego 'FPS'):
Kod: | + Zawsze
 Dodaj 1 do A
+ Co każdą 1 sekundę
 Ustaw B na A
 Ustaw A na 0
+ Czas: później niż 1 sekunda
+ B < 42 //to jest dolny limit FPS - można zmieniać
+ C = 0
 Ustaw C na 1500
+ B < 42
+ C ≥ 1000
+ C ≤ 1300 //user ma kilka sekund na zmniejszenie laga
 Ustaw C na 2000 //juz nie ma
+ C > 1000
+ C < 2000
 Odejmij 1 od C
+ Flaga 0 wyłączona //aby zdarzenie się nie powtarzało
+ C = 2000
 Włącz flagę 0
 Wyświetl komunikat o zablokowaniu wyników |
Oczywiście musi być też zdarzenie, które blokuje wyniki, gdy flaga 0 obiektu 'FPS' jest włączona (czyli user przesadził). Rozwiązanie jest skuteczne i daje użytkownikowi czas na np. wyłączenie programu, który spowodował laga. Po tym czasie, jeśli lag się utrzyma, wyniki są anulowane. |
|
|
|
 |
Slawo
Legenda
 
Główny edytor: 
Pojedynki: nie
Pomógł: 16 razy Posty: 706
25566 Prestiż
|
Wysłany: 14-11-2006, 23:05
|
|
|
| RomanX napisał/a: |
+ C = 0
Ustaw C na 1500
+ B < 42
+ C ≥ 1000
+ C ≤ 1300 //user ma kilka sekund na zmniejszenie laga
Ustaw C na 2000 //juz nie ma
+ C > 1000
+ C < 2000
Odejmij 1 od C
+ Flaga 0 wyłączona //aby zdarzenie się nie powtarzało
+ C = 2000. |
I właśnie RX przez to zbędne C, nie wiadomo czemu służące wykrywanie nie działało non stop a jedynie na starcie gry z pół minuty może.
Przecież tak jak ja napisałem, jeśli gracz ma laga to ma te 4-5 sekund czasu, jeśli po tych 5 sekundach nadal ma laga to niestety, ale ma spowalniacz lub słaby komp.
Zauważ, że w takim np. Tunelu rozgrywka może trwać od 3-10 sekund i wtedy trzeba laga traktować jako zerowanie wyników niestety, czyli skrócić czas "przymykania oka".
A to, że nie chcę wstawić tego dobrego kodu do Świstaka Kuriera to moja złota zasad - nie zmieniam gry w trakcie. Musiałbym anulować wyniki a to źle by świadczyło o serwisie .... |
_________________ http://pograjmy.webd.pl - gry z rankingami graczy i turniejami - miejsce również na Twoje gry klikowe
Ponad 150 gier wydanych
Od 2003 w klikach
Od 2001 w hiscoresach na www
http://pograjmy.webd.pl/typer/ (typuj wyniki Mundialu)
Czytam: http://kontrowersje.net |
|
|
|
 |
jarlfenrir
Generał brygady
 
Główny edytor: 
Drugi edytor: 
Pomógł: 82 razy Posty: 1731
37283 Prestiż
|
Wysłany: 15-11-2006, 18:37
|
|
|
| Slawo napisał/a: | | Fenrir napisał/a: | | Właśnie wymyśliłem coś genialnego: w preferencjach gry można wybrać: szybkość gry niezależna od procesora. |
Był expert od wzorów BROO to ja jako expert od spowalniacza powiem, że independent speed wybrany z TGfa czy MMFa NIE DAJE NIC . Sprawdzone !!!
|
Mi tam działa - niejednokrotnie miałem okazję to sprawdzić.
[ Dodano: 15-11-2006, 18:38 ]
[quote="Slawo"]
Propozycja z wzorem 200 : FPSaktualny nie jest głupia, ale dlaczego 200 ?
A czemu by nie? Każdy da tyle, ile mu się podoba! |
|
|
|
 |
sulge
Sierżant
 
Pomógł: 1 raz Posty: 125
3935 Prestiż
|
Wysłany: 17-11-2006, 12:57
|
|
|
Oki
Rozwiązałem problem okazało się że moje przemyślenia były słuszne. Pomysł został wdrożony w grę i przetestowany przy działaniu spowalniacza. Wszystko działa zgodnie z założeniami
Temay można zamknąć. |
|
|
|
 |
|
|