• 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?

0 głosów
217 wizyt
pytanie zadane 10 sierpnia 2017 w C i C++ przez WireNess Stary wyjadacz (11,070 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 (171,380 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,070 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 (171,380 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,070 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,440 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,070 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,440 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 368 wizyt
pytanie zadane 26 maja 2016 w C i C++ przez Kyoya Początkujący (260 p.)
+4 głosów
3 odpowiedzi 983 wizyt
pytanie zadane 30 maja 2016 w C i C++ przez bazinga15 Maniak (54,580 p.)
–15 głosów
5 odpowiedzi 566 wizyt
pytanie zadane 7 września 2016 w C i C++ przez Emil Panecki Bywalec (2,100 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

66,475 zapytań

113,246 odpowiedzi

239,801 komentarzy

46,618 pasjonatów

Przeglądających: 242
Pasjonatów: 15 Gości: 227

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...