Flat Leon Works

アプリやゲームを作ってます。

GLFWをMac環境で動かすとウインドウが表示されてないときのみCPU使用率が異様に高くなる場合がある

Mac環境でGLFWを使ったプログラムを書いていて気付いたのですが、ウインドウが表示されていないときのみCPU使用率が異様に高くなります。ちょっと調べてみたところ、glfwSwapBuffers でvsync(垂直同期)が発生しなくなってるのがわかりました。つまり、ウインドウが非表示になると垂直同期による「待ち」がなくなって、メインループがCPUの許す限り回りまくっていたわけです。まぁ、そもそもメインループでFPS管理をちゃんとしてないのが悪いのですが。

ウインドウが表示されていないときに垂直同期が発生しなくなる理由は、OS X Mavericks v10.9から導入された省電力機能のAppNapが関係してるようです(参考:https://github.com/glfw/glfw/issues/680)。非表示なんだから画面更新しない→垂直同期も不要って感じかと。メインループの実装方法に問題があったとはいえ、省電力機能で逆にCPU使用率があがるとは。

書いていたプログラムはメインループを垂直同期で回すのではなく、自分でFPS管理(時間計測でスリープ)することで対処しました。