Warsztat - Programowanie gier

Wrzesień 03, 2010, 04:14:50 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Koniec z timerami  (Przeczytany 883 razy)
Sendron
Newbie
*

wiadomości: 30


Zobacz profil
« : Styczeń 23, 2010, 15:57:03 »

Chciałbym się zapytać czego lepiej używać zamiast timerów? Prosiłbym również o link gdzie jest dany sposób wytłumaczony ;]
Zapisane
Kos
Member2000
*******

wiadomości: 3487



Zobacz profil
« Odpowiedz #1 : Styczeń 23, 2010, 16:06:34 »

Sposób z akumulatorem generalnie jest bardzo wygodny.

Kod:
unsigned akumulator = 0;
mainloop {
   unsigned dt = czasOdOstatniejKlatki()

   // sekcja z logika
   akumulator += dt;
   while (akumulator > jakCzestoCosSieMaDziac) {
      akumulator -= jakCzestoCosSieMaDziac;
      zrobCos();
   }
   // ... takich akumulatorow i petli moze byc ile chcesz - jedno na cala logike, lub osobne na symulacje, AI, etc, z roznymi predkosciami

   // pod spodem np. rendering z wlaczonym vsync
}
Zapisane

Eclipse!
cybek
SuperHero Member
******

wiadomości: 1145


Zobacz profil WWW
« Odpowiedz #2 : Styczeń 23, 2010, 16:59:23 »

albo prościej tak:
Kod:
int timer=aktualnyCzas();
..
// jakas petla
if(aktualnyCzas() >= timer+czasJakiMaMinac)
{
  ...
  timer=aktualnyCzas();
}
Zapisane

Reg
Member2000
*******

wiadomości: 3839



Zobacz profil WWW
« Odpowiedz #3 : Styczeń 24, 2010, 18:43:01 »

To nie jest "prościej", bo wasze dwa przykłady różnią się dzianiem. Różnica jest subtelna, ale ważna. Kos proponuje metodę dokładną, w której wywołanie będzie faktycznie co określony czas, plus minus czas jednej klatki, ale średnio dokładnie taki. Z kolei cybek zaproponował rozwiązanie, w którym kod "..." wykonuje się nie częściej niż co czasJakiMaMinac, ale zazwyczaj rzadziej, jeśli dobrze myślę to średnio o jakieś średni_czas_klatki/2.

Ja znam i stosuję obydwa te rozwiązania, zależnie od tego co robię. Różnica będzie widoczna na przykład wtedy, kiedy gra się przytnie i jedna klatka potrwa 10x dłużej, niż klatki trwają zwykle. Jeśli w tym czasie miałoby się dane zdarzenie zdążyć wykonać 2 razy, wg metody Kos-a kod "odrobi straty" i wykona je 2 razy pod rząd. Z kolei wg metody cybek-a wykona je raz i jak gdyby nigdy nic zacznie liczyć czas od nowa.

Inne porównanie polegałoby na zmierzeniu, ile razy kod wykonał się w określonym, dłuższym czasie. Wg Kos-a wykona się dokładnie tyle ile trzeba (czas_pomiaru / jakCzestoCosSieMaDziac) +/- 1, a wg metody cybek-a tyle samo lub mniej razy.
Zapisane

cybek
SuperHero Member
******

wiadomości: 1145


Zobacz profil WWW
« Odpowiedz #4 : Styczeń 24, 2010, 18:50:47 »

To nie jest "prościej", bo wasze dwa przykłady różnią się dzianiem. Różnica jest subtelna, ale ważna. Kos proponuje metodę dokładną, w której wywołanie będzie faktycznie co określony czas, plus minus czas jednej klatki, ale średnio dokładnie taki. Z kolei cybek zaproponował rozwiązanie, w którym kod "..." wykonuje się nie częściej niż co czasJakiMaMinac, ale zazwyczaj rzadziej, jeśli dobrze myślę to średnio o jakieś średni_czas_klatki/2.

Ja znam i stosuję obydwa te rozwiązania, zależnie od tego co robię. Różnica będzie widoczna na przykład wtedy, kiedy gra się przytnie i jedna klatka potrwa 10x dłużej, niż klatki trwają zwykle. Jeśli w tym czasie miałoby się dane zdarzenie zdążyć wykonać 2 razy, wg metody Kos-a kod "odrobi straty" i wykona je 2 razy pod rząd. Z kolei wg metody cybek-a wykona je raz i jak gdyby nigdy nic zacznie liczyć czas od nowa.

Inne porównanie polegałoby na zmierzeniu, ile razy kod wykonał się w określonym, dłuższym czasie. Wg Kos-a wykona się dokładnie tyle ile trzeba (czas_pomiaru / jakCzestoCosSieMaDziac) +/- 1, a wg metody cybek-a tyle samo lub mniej razy.
Hm, masz rację, ale wtedy wystarczy zamienić if'a na while'a i zamiast
Kod:
timer=aktualnyCzas();
dać np. tak:
Kod:
timer+=czasJakiMaMinac;
Wyjdzie wg. mnie na to samo co u Kosa, a jakoś przejrzyściej wydaje mi sie wygląda mój kod.

PS: cybka, nie cybeka Smiley
Zapisane

Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC