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

VPS Starter Arubacloud
0 głosów
396 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 824 wizyt
pytanie zadane 26 maja 2016 w C i C++ przez Kyoya Początkujący (260 p.)
+4 głosów
3 odpowiedzi 1,778 wizyt
pytanie zadane 30 maja 2016 w C i C++ przez niezalogowany
–1 głos
1 odpowiedź 394 wizyt
pytanie zadane 25 czerwca 2020 w OpenGL, Unity przez jerk0 Użytkownik (540 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...