2013-04-29 3 views
9

glfwSwapInterval(1)は私のために働いていないようです。私がCCCでVSyncを強制するかSFMLでsetVerticalSyncEnabled(true)を強制すると、my fpsは60に落ちますが、GLFWは9000 fpsで動作し続けます。私は間違ったやり方をしているのですか?またはGLFWが盗んでいますか?GLFW VSyncが動作しない

+0

どのGPUを使用していますか? GLFW FAQ [何か](http://www.glfw.org/faq.html#33__why_doesnt_glfwswapinterval_work)について、 'glfwSwapInterval'が一部のATIドライバで動作しないことについて説明しています。私はGLFWを使ったことはありませんが、 '(PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress(" wglSwapIntervalEXT ")'を直接呼び出せますか? –

+0

@エドワードAはいATI。それはなぜSFMLで動作するのでしょうか? 'wglSwapIntervalEXT'は何らかの理由で動作します...だからGLFWは盗聴されていますか? – mwerschy

+0

「wglSwapIntervalEXT」が働いていても、GLFWと何か関係があります。あなたは[GLFWソース](http://www.glfw.org/download.html)をダウンロードし、それと一緒にプログラムをコンパイルし、ブレークポイント@ [行831 window.c](https:// github。 com/glfw/glfw-legacy/blob/master/lib/window.c#L831)と[1638 win32_window.c](https://github.com/glfw/glfw-legacy/blob/master/lib/win32 /win32_window.c#L1638)実際に何が起こっているか見ることができます。チェックがうまくいかない場合は、その1つになる可能性があります。 –

答えて

7

GLFWはデスクトップ合成を有効にするとVSyncをオンにしたくないようです。とにかくVSyncが必要な場合は、Windows上で動作します。

#ifdef _WIN32 
    // Turn on vertical screen sync under Windows. 
    // (I.e. it uses the WGL_EXT_swap_control extension) 
    typedef BOOL (WINAPI *PFNWGLSWAPINTERVALEXTPROC)(int interval); 
    PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL; 
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); 
    if(wglSwapIntervalEXT) 
     wglSwapIntervalEXT(1); 
#endif 

他のOSについては、Googleがお手伝いします。

+2

procアドレスが0だったので、この修正はIntel HD 4600では機能しませんでした。しかし、GLFW3を設定してGLFW_USE_DWM_SWAP_INTERVALを使用するようにしました。 – Bram

3

GLFW_USE_DWM_SWAP_INTERVALオプションを付けてGLFW3を再構築します。

glfw/src/config.h

GLFWのドキュメントは、ジッタの問題について警告するが、私はそれらを自分で表示されません。を参照してください。

+2

リリース3.1.2では、このフラグは削除されました。しかし、修正が入っているので、もう必要ありません:) – legends2k