Czy używanie Sleep () w pętli gier (w systemie Windows) jest bezpieczne?

27

Czy korzystanie z funkcji Sleep () w systemie Windows w pętli gier (C ++) jest bezpieczne? Chcę mieć stałą liczbę klatek na sekundę.

hemogoblin
źródło
Musisz wyjaśnić, co rozumiesz przez „bezpieczny”. Oczywiście jest to bezpieczne i nie uszkodzi pamięci ani nie zniszczy komputera graczy.
Kromster mówi o wsparciu Moniki

Odpowiedzi:

32

Nie, nie jest. Sen gwarantuje jedynie minimalny czas do spania, ale w rzeczywistości może spać przez dowolną ilość czasu. Twoja rozdzielczość timera (ustawiona przez timeBeginPeriod) jest również ważna dla niego, a nawet jeśli używasz czegoś innego (np. QueryPerformanceCounter) dla swojego timera, nadal potrzebujesz timeBeginPeriod do kontrolowania snu.

Podsumowując:

  • Czas na sen to tylko gwarantowane minimum, a faktyczny czas snu może być dłuższy.
  • Wrażliwe na wartość ustawioną (lub nie ustawioną) przez timeBeginPeriod.

Jedynym uzasadnionym przypadkiem użycia trybu uśpienia byłoby zmniejszenie zużycia procesora przez np. Urządzenia mobilne. Nawet wtedy będziesz używać Sleep (1); używanie go do kontrolowania liczby klatek na sekundę nie jest dobrym rozwiązaniem.

Wymuszanie włączenia vsync jest prawdopodobnie jednym z powszechnych sposobów uzyskania stałej liczby klatek na sekundę, ale nawet wtedy inny sprzęt będzie działał z różnymi częstotliwościami odświeżania i nie będziesz w stanie uzyskać stałej stałej liczby klatek na różnych komputerach (zależy to od rodzaju sprzętu oczywiście celujesz).

W tym momencie należy wspomnieć o tym artykule: Gaffer On Games - Fix Your Timestep! . Opisuje kroki potrzebne do uzyskania spójnego pomiaru czasu w symulacji.

Maximus Minimus
źródło
Ogromne dzięki za link. Do tej pory zwykle korzystałem z podejścia „zmiennego timestep” opisanego w artykule.
Ivan Vučica
Uśpienie jest również niebezpieczne na komputerach z włączoną funkcją Intel Speed-Step.
waterwizard11,
„ale w rzeczywistości może spać przez dowolną ilość czasu”. Cóż, chyba trzeba to udowodnić ... Nigdy nie widziałem na to żadnego dowodu, więc chyba jest to jedna z tych „definicji”. Dobra odpowiedź i tak, nie możesz (nawet jeśli jest, dokładnie tak, jak to jest), użyć dowolnego rodzaju uśpienia, aby ustawić stałą szybkość klatek (cóż, możesz, ale potrzebujesz precyzyjnego timera, aby to zrobić).
Valmond
2
Według MSDN - „Pamiętaj, że nie można zagwarantować, że gotowy wątek uruchomi się natychmiast. W związku z tym wątek może działać dopiero po upływie określonego czasu”. To prawda, że ​​nigdy tego nie widziałem, ale jednocześnie, jeśli jest to udokumentowane jako możliwe, zdecydowanie nie polegałbym na tym, że to się nigdy nie wydarzy.
Maximus Minimus
1
Warto wspomnieć, myślę, że odnosi się to do „... jeśli chcesz zmniejszyć użycie procesora ...”: nanobit.net/doxy/quake3/win__main_8c-source.html <- odpowiedni kod zaczyna się od
01224
16

Krótka odpowiedź: nie, nie jest.

Aby mieć stałą liczbę klatek na sekundę, musisz wywołać określoną funkcję zwrotną, która wymusza określoną liczbę klatek na sekundę. Oczywiście, jeśli nie wiesz, ile czasu zajmie pojedyncza iteracja w pętli, nie możesz ustawić ustalonego czasu uśpienia.

GLUT zapewnia glutTimerFunc () , co oznacza, że ​​jeśli programujesz w OpenGL, potrzebujesz odpowiedniej funkcji. Spójrz na ten przykład lub ten .

Dan
źródło
1
„Po co najmniej milisekundach OpenGLUT wywoła oddzwonienie” - czym to się różni Sleep?
Kromster mówi o wsparciu Moniki