web-dev-qa-db-ja.com

GLFWで60fpsのキャップを削除する方法はありますか?

私はC++でOGL/GLFWを使ってゲームを書いています。

私のゲームは常に60fpsで実行されており、画面が裂けることはありません。調査を行った結果、glfwSwapInterval()関数はV-syncまたは60fpsの上限を有効/無効にできるはずです。

ただし、関数に渡した値に関係なく、フレームレートは60にロックされたままであり、ティアリングはまったくありません。 Linuxとnvidiaパネルのコンポジター設定も確認しましたが、効果がありません。

これは私が推測する一般的なことですが、このfpsキャップを回避する方法はありますか?

6
Manu

GLFWで60fpsのキャップを削除する方法はありますか?

最も簡単な方法は、ダブルバッファリングの代わりにシングルバッファリングを使用することです。シングルバッファリングでは常に同じバッファを使用するため、バッファスワップや「vsync」はありません。

glfwWindowHint を使用して、ダブルバッファリングを無効にします。

glfwWindowHint( GLFW_DOUBLEBUFFER, GL_FALSE );
GLFWwindow *wnd = glfwCreateWindow( w, h, "OGL window", nullptr, nullptr );

単一のバッファリングを使用する場合は、バッファスワップの代わりに、( glFlush )によってGLコマンドの強制実行を明示する必要があることに注意してください( glfwSwapBuffers )。


もう1つの可能性は、バッファを0にスワップする前に glfwSwapBuffers が呼び出されたときから待機する画面更新の数を設定することです。これは glfwSwapInterval 、OpenGLコンテキストを最新にした後( glfwMakeContextCurrent ):

glfwMakeContextCurrent( wnd );
glfwSwapInterval( 0 );

ただし、このソリューションが機能するかどうかは、ハードウェアとドライバーによって異なる場合があることに注意してください。

7
Rabbid76