Saya sedang mengerjakan permainan sederhana di OpenGL, menggunakan SDL untuk inisialisasi tampilan dan input, dan ini muncul dalam hal waktu saya memiliki dua opsi yang tersedia untuk saya. Nomor satu yang hanya tidur untuk optimalTimePerFrame - theTimeTakenToRender, ketika optimalTimePerFrame dalam hitungan detik = 1 / theFramerateCap. (Saya tidak sepenuhnya yakin apakah ini perlu, karena ini setara dengan menggunakan vsync, yang mungkin lebih akurat. Jika asumsi saya benar maka tolong katakan padaku apakah SDL + OpenGL memiliki vsync secara default, dan jika tidak seberapa untuk mengaktifkannya.) Yang lain adalah untuk mengukur waktu sejak frame terakhir diberikan, dan hanya menyesuaikan gerakan yang sesuai. (Semakin pendek waktu yang dibutuhkan untuk membuat bingkai, entitas yang kurang jauh bergerak dalam bingkai itu). Dalam hal kinerja, dan penurunan flicker dll, apa kelebihan dan kekurangan dari kedua metode ini?
sumber
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
Anda akan berakhir menggunakan CPU jauh lebih sedikit (multi tasker akan berterima kasih) dan orang-orang di perangkat seluler akan menghargai ini juga.
sumber
Anda seharusnya tidak pernah, pernah, pernah, pernah, menggunakan Sleep untuk mengontrol framerate .
Ini sudah berlalu sebelumnya dan saya akan merujuk Anda ke pertanyaan lain untuk diskusi tentang alasan mengapa. Satu hal yang tidak disebutkan di sana adalah bahwa pada kecepatan refresh modern 60Hz yang khas, dan dengan granularity panggilan Sleep 1 milidetik, sebenarnya tidak mungkin untuk Sleep untuk jumlah waktu yang tepat antara frame.
Saya tidak mengatakan bahwa menghasilkan CPU jika tidak ada yang dilakukan adalah hal yang buruk; jauh dari itu. Tapi itu tidak sama dengan mengendalikan framerate dan Sleep adalah solusi yang sesuai untuk yang pertama tetapi tidak yang terakhir.
Alih-alih memeriksa waktu yang telah berlalu, dan jika sudah waktunya untuk menjalankan sebuah bingkai, maka lakukanlah, jika tidak - dan jika Anda ingin menghasilkan CPU - Tidurlah untuk waktu minimum - 1 milidetik. Juga pastikan pengatur waktu tidur Anda diatur dengan tepat untuk platform Anda sehingga memberi Anda resolusi yang baik; yaitu bahwa ketika Anda mengeluarkan "Tidur (1)" panggilan Anda benar-benar memiliki kesempatan untuk benar-benar Tidur selama 1 milidetik, daripada sesuatu seperti 15, 20 atau 30 (yang akan terjadi sebaliknya). Saya percaya bahwa SDL akan melakukan ini secara otomatis untuk Anda.
Anda juga dapat membuat beberapa kelonggaran di dalamnya, sehingga jika semakin dekat waktu untuk menjalankan bingkai, Anda berhenti Tidur dan mulai berlari datar hingga bingkai berjalan, yang dapat membantu Anda menekan interval bingkai yang Anda inginkan dengan lebih akurat.
Apa yang akhirnya tampak adalah sejumlah panggilan Sleep (1) diselingi dengan frame sesekali, dan tidak apa-apa. Anda masih melepaskan CPU saat tidak membutuhkannya, tetapi frame Anda masih dapat berjalan tepat waktu.
sumber
Mungkin manfaat terpenting dari pembatasan frame rate adalah dapat membantu mencegah kerusakan fisik pada mesin. Mereka lupa melakukan ini di Starcraft II, yang ternyata sangat bermasalah (dan mahal) untuk beberapa pengguna sampai mereka menambalnya.
sumber
Seperti yang disebutkan sebelumnya, ini menurunkan penggunaan CPU. Di flipside, dan semakin penting, itu juga menguras masa pakai baterai. Sebagai contoh yang baik, FTL beroperasi pada hampir 100% CPU pada MBA saya. Akibatnya, baterai terkuras dalam> 2 jam dan berjalan sangat panas. (Sebagai hasil yang lebih langsung, saya mencopot pemasangan dan tidak lagi memutarnya ...). Tutup bingkai akan mencegah ini.
Keuntungan lain yang tidak disebutkan adalah, jika ini adalah permainan multipemain, Anda juga menyamakan kedudukan dengan memberikan pengalaman yang sama kepada semua orang.
sumber