Sleep () oyun döngüsünde (Windows'ta) güvenli midir?


27

Windows'ta Sleep () işlevini oyun döngüsünde (C ++) kullanmak güvenli midir? Sabit kare hızına sahip olmak istiyorum.


Netleştirmeniz gerekir, "güvenli" derken neyi kastediyorsunuz? Tabii ki güvenli ve hafızayı bozmayacak ya da oyuncuların bilgisayarını patlatamayacak.
Kromster, Monica

Yanıtlar:


32

Hayır değil. Uyku, sadece uyumak için minimum bir süreyi garanti eder , ancak gerçekte bunun üzerinde herhangi bir süre için uyuyabilir. Zamanlayıcı çözünürlüğünüz (timeBeginPeriod ile ayarlanır) bunun için de önemlidir ve zamanlayıcınız için başka bir şey (QueryPerformanceCounter gibi) kullanıyor olsanız bile, Uyku durumunu kontrol etmek için yine de timeBeginPeriod'a ihtiyacınız vardır.

Yani özet olarak:

  • Uyumak için süre yalnızca garantili bir minimumdur ve gerçek uyku süresi daha yüksek olabilir.
  • TimeBeginPeriod üzerinden değere duyarlı (veya ayarlanmamış).

Sleep kullanmak için makul olan tek şey, örneğin mobil cihazlar için CPU kullanımını azaltmak isteseniz olur. O zaman bile Sleep (1) kullanıyor olacaksınız; kare hızlarını kontrol etmek için kullanmak yol değildir.

Vsync'i zorlamak muhtemelen sabit bir kare hızı elde etmenin yaygın bir yoludur, ancak o zaman bile, farklı donanımlar farklı yenileme hızlarında çalışır ve farklı makineler arasında tutarlı bir sabit kare hızına sahip olamazsınız (bu ne tür bir donanıma bağlıdır) Elbette hedefliyorsunuz).

Şu anda bu makaleden bahsetmek gerekiyor: Gaffer On Games - Timestep'inizi düzeltin! . Bu, simülasyonunuzda tutarlı bir zaman aşımı elde etmek için gereken adımları açıklar.


Bağlantı için çok teşekkürler. Şimdiye kadar, genellikle makalede açıklanan "değişken timestep" yaklaşımını kullandım.
Ivan Vučica

Uyku, Intel hız adımının etkin olduğu makinelerde de tehlikelidir.
sihirbazı11

“ama aslında bunun üzerinde herhangi bir zaman için isteğe bağlı olarak uyuyabilir.” Eh, sanırım kanıtlanmış olmalı ... Daha önce hiç bir kanıt görmedim, bu yüzden sanırım bu 'tanımlardan' biri. Yine de iyi cevaplar ve evet, (doğru olmasına rağmen, doğru olsa bile) sabit bir kare hızı ayarlamak için herhangi bir Uyku türünü kullanamazsınız (bunu yapabilmeniz için bunu yapmak için yüksek hassasiyetli bir zamanlayıcıya ihtiyacınız vardır).
Valmond

2
MSDN Başına - "Hazır bir iş parçacığının derhal çalıştırılmasının garanti edilmediğine dikkat edin. Sonuç olarak, iş parçacığı uyku aralığının geçmesinden bir süre sonra çalışmayabilir" Doğru, bunun olduğunu hiç görmedim, ama aynı zamanda mümkün olduğu belgelenirse, kesinlikle asla buna güvenmem.
Maximus Minimus

1
Söylemeye değer, bunun "... CPU kullanımını azaltmak istiyorsanız ..." ile ilgili olacağını düşünüyorum: nanobit.net/doxy/quake3/win__main_8c-source.html <- ilgili kod 01224
user_123abc

16

Kısa cevap: hayır, öyle değil.

Sabit bir kare hızına sahip olmak için, belirli bir kare hızını zorlayan belirli bir geri arama işlevini çağırmanız gerekir. Açıkçası, şimdi bir döngüdeki tek bir yinelemenin ne kadar zaman alacağını bilmiyorsanız, sabit bir uyku süresi ayarlayamazsınız.

GLUT, OpenGL'de programlama yapıyorsanız, ihtiyacınız olan doğru işlevi sağlayan glutTimerFunc () işlevini sağlar. Bu örneğe veya buna bir göz atın .


1
" En az msn milisaniyeden sonra OpenGLUT geri çağırmayı çağırır" - bunun farkı Sleepnedir?
Kromster 4: 29'da Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.