WGL_EXT_swap_control擴展允許在Windows上執行此操作,但即使遠程執行跨平臺操作也無法找到任何內容,即同步緩衝區交換和屏幕刷新。我的應用程序使用GLEW,所以提供的東西將是可取的。需要Linux,Mac和Windows的跨平臺支持,但是如果無法設置同步(例如,用戶在他的圖形驅動程序中強制關閉),我的應用程序不會中斷。如何在OpenGL中啓用VSYNC
我將接受程序代碼在許多平臺上使用GLEW作爲有效答案。
WGL_EXT_swap_control擴展允許在Windows上執行此操作,但即使遠程執行跨平臺操作也無法找到任何內容,即同步緩衝區交換和屏幕刷新。我的應用程序使用GLEW,所以提供的東西將是可取的。需要Linux,Mac和Windows的跨平臺支持,但是如果無法設置同步(例如,用戶在他的圖形驅動程序中強制關閉),我的應用程序不會中斷。如何在OpenGL中啓用VSYNC
我將接受程序代碼在許多平臺上使用GLEW作爲有效答案。
這聽起來很討厭,讓你自己去計算在Mac OS X上打電話的情況,但this guy似乎有某種解決方案。
這與GLEW原來並不完全一樣,但我想這可能會有幫助,當我找到更多的時間花在這個問題上。恭喜額外的代表:P – Tronic 2010-03-01 02:15:48
鏈接現在已經死亡... – manylegged 2015-01-03 22:53:21
...這就是爲什麼只有鏈接的答案是不好的。 – 2015-09-01 05:45:46
找到一個跨平臺的解決方案並不容易。該平臺最終擁有顯示器(和交換行爲)。所以它必然是平臺API的一部分(如果暴露)。實際上不可能有一個跨平臺的解決方案。當涉及到與平臺的交互時,甚至會有一些平臺特定的位。
現在你可以爭辯說所有的平臺都應該使用相同的API來處理它們的特定接口,但是我懷疑你會從它們那裏得到任何牽引力。
最後,並非所有的幀緩衝器都直接顯示。如果您碰巧使用的是窗口管理系統,它實際上將幀緩衝區像素混合到桌面上(就像Aero在運行時一樣),那麼無論如何您都無法控制交換行爲。
僅供參考,不同的API來做到這一點的主要平臺:
從http://www.opengl.org/wiki/Swap_Interval (間接http://www.opengl.org/registry/specs/SGI/swap_control.txt):
在Linux中,事情要簡單得多。如果
GLX_SGI_swap_control
存在於由glGetString(GL_EXTENSIONS)
返回的 字符串,那麼您 可以使用glXSwapIntervalSGI(0)
到 禁用VSYNC或可以使用glXSwapIntervalSGI(1)
使VSYNC (又名垂直同步)。
NSOpenGLCPSwapInterval
設置或獲取交換的時間間隔。交換 區間表示爲一個長。如果交換間隔設置爲0 (默認值),則儘快執行flushBuffer方法 ,而不考慮顯示器的垂直刷新率。如果 交換間隔設置爲1,則僅在顯示器的垂直回掃 期間交換緩衝區。稍後可用於Mac OS X v10.0和 。
在NSOpenGL.h中聲明。
http://stackoverflow.com/questions/589064/how-to-enable-vertical-sync-in-opengl問同樣的問題,但沒有使用GLEW,也沒有找到解決方案。 – Tronic 2010-01-18 04:32:42
SDL2提供了啓用vsync的功能。與GLEW相比,SDL2與更多的平臺兼容,並且在我看來,整體而言是更好的選擇。但是在創建OpenGL上下文後的SDL2中,您可以簡單地調用: 'SDL_GL_SetSwapInterval(1)' 並且它可以完成這項工作。 這裏的文檔,如果你有興趣:https://wiki.libsdl.org/SDL_GL_SetSwapInterval – pappix 2018-02-15 18:52:10