Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

FPS czyli klatki na sekundę w grze RPG

Ostatnio zmodyfikowano 2023-08-15 12:18
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
FPS czyli klatki na sekundę w grze RPG
» 2023-08-09 22:12:06
Cześć!
Piszę grę 2D. Jako, że chcę ją porządnie napisać i przy okazji nie palić sprzętu, postanowiłem dodać ograniczenie klatek na sekundę.

Jak na razie wpadłem na pomysł, by zrealizować swój plan poprzez prosty warunek:
C/C++
if( currentTime > prevTime + sec / FPS )
{
   
... execute game functs;
}

Ale potem uświadomiłem sobie, że łączny czas wyświetlania tych 30 klatek będzie dłuższy (ponieważ te wszystkie funkcje też potrzebują czasu na wykonanie).

No więc, jak zrobić porządny ogranicznik FPS lub chociaż taki prosty ale.. dokładniejszy, może zliczać czas wykonania programu?
P-180249
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-09 22:27:41
C/C++
if( currentTime > prevTime +( sec / FPS ) - tProgramExecutable )
{
   
//.. execute game functs;
}
P-180250
pekfos
» 2023-08-10 17:30:35
C/C++
while( .... )
{
   
const auto nextTime = prevTime + 1 / FPS;
   
const auto currentTime = getCurrentTime();
   
   
if( currentTime >= nextTime )
   
{
       
prevTime = nextTime;
       
... execute game functs;
   
}
   
else
       
 sleep( nextTime - currentTime );
   
}
Dla łatwości niech gra ma 1 FPS. Wtedy próbujesz wykonywać logikę gry w t=0s, 1s, 2s, ... Sleep będzie wprowadzać jakiś niewielki dodatni błąd, ale nie będzie się kumulować.
P-180252
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-13 20:11:40
Napisałem taki oto programik moim sposobem i jednak działa. Czy to dobre rozwiązanie, czy jednak sleep jest ważne?

C/C++
#include<iostream>
#include<time.h>
using namespace std;


time_t timeStartMainLoop;
time_t timeEndMainLoop;
float gettedTime, FPS;
double timeOfExecuteMainLoop;
int frames, sec;

int main()
{
   
FPS = 1;
   
timeOfExecuteMainLoop = 0.f;
   
gettedTime = 0.f;
   
sec = 0;
   
frames = 1;
   
   
while( true )
   
{
       
if( clock() > gettedTime + CLOCKS_PER_SEC / FPS - timeOfExecuteMainLoop )
       
{
           
gettedTime = clock();
           
time( & timeStartMainLoop );
           
           
// .. get events ..
            // .. manage of program ..
            // .. render ..
           
           
if( int( clock() / CLOCKS_PER_SEC ) > sec )
           
{ sec += 1; frames = 1; }
           
else frames += 1;
           
           
cout << "program dziala: " << clock() / CLOCKS_PER_SEC << " sekund, a w tej sekundzie wyswietlono " << frames << " klatek\n";
           
           
time( & timeEndMainLoop );
           
timeOfExecuteMainLoop = difftime( timeEndMainLoop, timeStartMainLoop );
       
}
    }
   
return 0;
}
P-180265
pekfos
» 2023-08-14 19:50:48
Jeśli warunek nie jest spełniony, natychmiastowo sprawdzasz go znowu, co klasyfikuje się jako "palenie sprzętu". Wywołując clock() wielokrotnie wprowadzasz błąd do obliczeń. Sama dokładność tego zegara jest zależna od implementacji i np u mnie wynosi 1ms, więc CLOCKS_PER_SEC / FPS jest zaniżone o 1% dla 30 FPS. Z kolei time() ma dokładność 1s i jednostka to też 1s, więc te obliczenia nie mają sensu.
P-180267
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-14 20:12:31
U mnie po odpaleniu tego kodu mam na starcie 51-52 klatki później ok. 58-60 klatek na sekundę
P-180268
pekfos
» 2023-08-14 21:22:49
A ile miało być? W kodzie napisałeś 1 FPS.
P-180270
tBane
Temat założony przez niniejszego użytkownika
» 2023-08-14 21:39:34
Mój błąd, zarówno ten kod dla 1 FPS (zamieszczony tutaj) jak i napisany dla 60FPS (w moim programie) działa.

PS. Czy da się zmieniać rozmiary grafiki w postach?

tajemnicza gra
tajemnicza gra
P-180272
« 1 » 2
  Strona 1 z 2 Następna strona