Warsztat » Forum

[Allegro] Koniec z timerami

Mar 7, 2009 | Sendron |
5 wypowiedzi na 1 stronach:
1
Sendron
Mar 7, 2009

Koniec z timerami

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

Odp: Koniec z timerami

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
}
cybek
Mar 9, 2009

Odp: Koniec z timerami

albo prościej tak:
Kod: 

int timer=aktualnyCzas();
..
// jakas petla
if(aktualnyCzas() >= timer+czasJakiMaMinac)
{
  ...
  timer=aktualnyCzas();
}
Regedit
Mar 16, 2009

Odp: Koniec z timerami

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.
cybek
Mar 16, 2009

Odp: Koniec z timerami

Cytat:

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 :)
Strony:
1