Warsztat - Programowanie gier

Marzec 17, 2010, 00:05:53 *
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 561 razy)
Sendron
Newbie
*

wiadomości: 31


Zobacz profil
« : Styczeń 23, 2010, 14: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: 2902


Zobacz profil
« Odpowiedz #1 : Styczeń 23, 2010, 15: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

Mój mały szwedzki blog
Cytuj z: Kurak
Stary, md5 z twojej wypowiedzi byłoby mniej więcej tak samo zrozumiałe.
cybek
Hero Member
*****

wiadomości: 913


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

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

Reg
Member2000
*******

wiadomości: 3617



Zobacz profil WWW
« Odpowiedz #3 : Styczeń 24, 2010, 17: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
Hero Member
*****

wiadomości: 913


Zobacz profil WWW
« Odpowiedz #4 : Styczeń 24, 2010, 17: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