Apakah aman menggunakan Sleep () di loop game (di Windows)?


27

Apakah aman menggunakan fungsi Sleep () pada Windows di game loop (C ++)? Saya ingin memiliki frame rate yang tetap.


Anda perlu mengklarifikasi, apa yang Anda maksud dengan "aman". Tentu saja itu aman dan tidak akan merusak memori atau meledakkan pemain PC.
Kromster mengatakan mendukung Monica

Jawaban:


32

Tidak, tidak. Tidur hanya menjamin waktu minimum untuk tidur, tetapi sebenarnya mungkin tidur untuk jumlah waktu yang sewenang-wenang lebih dari itu. Resolusi penghitung waktu Anda (ditetapkan melalui timeBeginPeriod) juga penting untuknya, dan bahkan jika Anda menggunakan sesuatu yang lain (seperti QueryPerformanceCounter) untuk penghitung waktu Anda, Anda masih memerlukan waktuBeginPeriod untuk mengontrol Tidur.

Jadi dalam ringkasan:

  • Waktu untuk tidur hanya minimum yang dijamin dan waktu tidur yang sebenarnya mungkin lebih tinggi.
  • Peka terhadap nilai yang ditetapkan (atau tidak disetel) melalui timeBeginPeriod.

Satu-satunya kasus yang masuk akal untuk menggunakan Sleep adalah jika Anda ingin mengurangi penggunaan CPU untuk perangkat seluler misalnya. Bahkan kemudian Anda akan menggunakan Sleep (1); menggunakannya untuk mengontrol framerates bukanlah cara untuk pergi.

Memaksa vsync aktif mungkin merupakan salah satu cara umum untuk mendapatkan framerate tetap, tetapi meskipun begitu, perangkat keras yang berbeda akan berjalan pada kecepatan refresh yang berbeda dan Anda tidak akan dapat memiliki framerate tetap yang konsisten di mesin yang berbeda (ini tergantung pada jenis perangkat keras apa Anda menargetkan tentu saja).

Pada titik ini perlu menyebutkan artikel ini: Gaffer Pada Game - Perbaiki Timestep Anda! . Itu menjelaskan langkah-langkah yang Anda butuhkan untuk mendapatkan tanda waktu yang konsisten dalam simulasi Anda.


Terima kasih banyak untuk tautannya. Sampai sekarang, saya biasanya menggunakan pendekatan "variabel timestep" yang dijelaskan dalam artikel.
Ivan Vučica

Tidur juga berbahaya pada mesin yang mengaktifkan langkah-kecepatan Intel.
waterwizard11

"Tapi itu mungkin benar-benar tidur untuk jumlah waktu sewenang-wenang lebih dari itu." Yah, itu harus dibuktikan, saya kira ... Belum pernah melihat buktinya, jadi saya kira itu adalah salah satu 'definisi' itu. Meskipun jawaban yang bagus dan ya, Anda tidak bisa (bahkan jika itu, akurat) menggunakan jenis Tidur apa pun untuk mengatur framerate tetap (Anda bisa, tetapi Anda memerlukan timer presisi tinggi untuk melakukannya).
Valmond

2
Per MSDN - "Perhatikan bahwa utas siap tidak dijamin untuk segera berjalan. Akibatnya, utas tidak dapat berjalan hingga beberapa waktu setelah interval tidur berlalu". Benar, saya belum pernah melihat itu terjadi, tetapi pada saat yang sama jika didokumentasikan sebagai mungkin, saya pasti tidak akan bergantung pada itu tidak pernah terjadi.
Maximus Minimus

1
Layak disebutkan, saya pikir ini akan berhubungan dengan "... jika Anda ingin mengurangi penggunaan CPU ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- kode yang relevan dimulai pada 01224
user_123abc

16

Jawaban singkat: tidak, tidak.

Untuk memiliki frame rate tetap, Anda harus memanggil fungsi callback tertentu yang memaksa frame rate tertentu. Jelas, jika Anda tidak sekarang berapa lama satu iterasi dalam satu loop akan memakan waktu Anda tidak dapat mengatur waktu tidur yang tetap.

GLUT menyediakan glutTimerFunc () , yaitu, jika Anda memprogram di OpenGL, fungsi yang tepat yang Anda butuhkan. Lihatlah contoh ini , atau yang ini .


1
"Setelah setidaknya msec milidetik, OpenGLUT akan memanggil panggilan balik" - bagaimana bedanya Sleep?
Kromster mengatakan mendukung Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.