• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak działa pętla stałokrokowa?

Object Storage Arubacloud
0 głosów
401 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)

Cześć!

Mam pytanie odnośnie pętli stałokrokowej w grze. Otóż próbuje zrozumieć jej działanie od dłuższego czasu i nie mogę tego pojąć :/

Mam nadzieję, że pomożecie w jakikolwiek sposób: wytłumaczenie, artykuły - cokolwiek!

Znalazłem jeszcze taki przykład:

void Game::run() 
    {     
        sf::Clock clock;     
        sf::Time timeSinceLastUpdate = sf::Time::Zero;    
        while (mWindow.isOpen())  
            {         
                processEvents();        
                timeSinceLastUpdate += clock.restart();     
                while (timeSinceLastUpdate > TimePerFrame)        
                {          
                    timeSinceLastUpdate -= TimePerFrame;            
                    processEvents();             
                    update(TimePerFrame);      
                 }         render();     
          } 
    }

Ale gdy tworzę zmienną TimePerFrame jako:

float deltaTime = clock.restart().asSeconds();

Przykład nie działa ;/

Nie ma prawa działać, bo odejmujemy float od sf::Time.

 

A więc proszę o wytłumaczenie i z góry dziękuję :)

2 odpowiedzi

+1 głos
odpowiedź 10 sierpnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 10 sierpnia 2017 przez WireNess
 
Najlepsza

Ale gdy tworzę zmienną TimePerFrame jako:
float deltaTime = clock.restart().asSeconds();

Wkleiłeś nie tą linie kodu? Bo szczerze mówiąc nie widze związku między zdaniem powyżej i fragmentem kodu.

 Nie ma prawa działać, bo odejmujemy float od sf::Time.

To odejmuj float of float. Od tego masz metody asSeconds() itd., żeby "przekonwertować" obiekt Time na pewną wartość.


Wracając do twojego pytania:
Chodzi o zapewnienie updejtowania stanu gry w stałych odstępach czasu. W taki sposób może się okazać, że w jednej klatce update nie nastąpi ani razu (czas renderowania był tak krótki), albo raz lub więcej razy (w przypadku "więcej razy" oznacza to, że czas renderowania był kilka razy dłuższy od naszej stałej TimePerFrame). Uniezależniamy w ten sposób update stanu gry od renderowania.
Wydaje mi się, że najwięcej dzięki temu zyskuje sprawdzanie kolizji. Załóżmy, że wyrenderowanie klatki zabrało wyjątkowo dużo czasu. Załóżmy też, że w twojej grze jakiś obiekt porusza się w strone ściany przez którą nie powinien przelecieć. Zauważ, że jeśli byśmy po prostu przesunęli nasz obiekt adekwatnie do czasu dt (delta time - czas pomiędzy klatkami - w dużej częsci jest to czas renderowania), to w tym przypadku mógłby się po prostu pojawić za ścianą. Kolizja ze ścianą nigdy nawet nie została by wykryta. Uniezależniając nasz delta time od czasu renderowania, mamy pewność, że taka sytuacja, się nie zdarzy.
Teraz mam nadzieje, że kod wydaje się mieć więcej sensu :) Jak coś jest nadal niejasne, to pytaj.

Polecam ten artykuł: https://gafferongames.com/post/fix_your_timestep/

PS: wydaje mi się, że processEvents() powinieneś wyrzucić z wewnętrznej pętli. (rozumiem, że processEvents realizuje przechwytywanie inputu?)

komentarz 10 sierpnia 2017 przez WireNess Stary wyjadacz (11,240 p.)
Czyli jaką wartość powinna mieć TimePerFrame?

 

PS: Odpowiedziałbym Ci na twoje pytania odnośnie związku deltaTime etc. Ale nie mam teraz zbyt wiele czasu, więc muszę tego zaprzestać :D
komentarz 10 sierpnia 2017 przez criss Mędrzec (172,590 p.)

Czyli jaką wartość powinna mieć TimePerFrame?

Jakąkolwiek. To jest stała określająca co jaki czas* stan gry ma być updejtowany. Dla przykładu: jeśli chcesz 60 razy na sekunde, to powinna mieć wartość 1./60.

* - oczywiście nie oznacza to konkretnie, że update będzie się dział co tą stałą wartość czasu. Oznacza, to, że jeśli np. twoja stała wynosi 0.2, a czas między klatkami wyniósł 1 sekunda, to update wykona się 5 razy. To też w uproszczeniu, bo jakieś cząstki czasu (mniejsze od stałej) mogą pozostawać w timeSinceLastUpdate i razem z czasem kolejnej klatki będą tworzyć czas który "konsumuje" nasz update w kolejnej klatce.
Jeśli nie rozumiesz, to przeczytaj powoli i dokładnie podlinkowany artykuł jeszcze raz.

komentarz 10 sierpnia 2017 przez WireNess Stary wyjadacz (11,240 p.)
Terac już wszystko rozumiem :D

Dzięki za poświęcony czas!
0 głosów
odpowiedź 10 sierpnia 2017 przez CzikaCarry Szeryf (75,340 p.)
Bardzo podobne pytanie było kiedyś na forum...

https://forum.pasja-informatyki.pl/146066/petla-stalokrokowa-gry
komentarz 10 sierpnia 2017 przez WireNess Stary wyjadacz (11,240 p.)
Nie odpowiadasz na moje pytanie, a tylko zwracasz mi pewną uwagę, więc przenieś proszę swoją wypowiedz do seksji komentarzy odnośnie pytania ;)

A co to twojej wypowiedzi: byłem i tam i na wielu innych stronach, ale nadal noe rozumiem tego na tyle, aby napisać projekt wykorzystujący tą iż umiejętność.

Miłego dnia ;)
komentarz 10 sierpnia 2017 przez CzikaCarry Szeryf (75,340 p.)

Odpowiadam na Twoje pytanie, prosiłeś przecież o jakieś wytłumaczenie / artykuły. 

Mam nadzieję, że pomożecie w jakikolwiek sposób: wytłumaczenie, artykuły - cokolwiek!

Tam jest wytłumaczone bardzo wiele rzeczy, nawet sam autor tematu tłumaczy tam bardzo dużo rzeczy, już nie mówiąc o odpowiedziach tam występujących. Pozdrawiam:) 

Podobne pytania

+1 głos
2 odpowiedzi 827 wizyt
pytanie zadane 26 maja 2016 w C i C++ przez Kyoya Początkujący (260 p.)
+4 głosów
3 odpowiedzi 1,785 wizyt
pytanie zadane 30 maja 2016 w C i C++ przez niezalogowany
–1 głos
1 odpowiedź 404 wizyt
pytanie zadane 25 czerwca 2020 w OpenGL, Unity przez jerk0 Użytkownik (540 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...