2010-01-18 85 views
3

WGL_EXT_swap_control擴展允許在Windows上執行此操作,但即使遠程執行跨平臺操作也無法找到任何內容,即同步緩衝區交換和屏幕刷新。我的應用程序使用GLEW,所以提供的東西將是可取的。需要Linux,Mac和Windows的跨平臺支持,但是如果無法設置同步(例如,用戶在他的圖形驅動程序中強制關閉),我的應用程序不會中斷。如何在OpenGL中啓用VSYNC

我將接受程序代碼在許多平臺上使用GLEW作爲有效答案。

+1

http://stackoverflow.com/questions/589064/how-to-enable-vertical-sync-in-opengl問同樣的問題,但沒有使用GLEW,也沒有找到解決方案。 – Tronic 2010-01-18 04:32:42

+0

SDL2提供了啓用vsync的功能。與GLEW相比,SDL2與更多的平臺兼容,並且在我看來,整體而言是更好的選擇。但是在創建OpenGL上下文後的SDL2中,您可以簡單地調用: 'SDL_GL_SetSwapInterval(1)' 並且它可以完成這項工作。 這裏的文檔,如果你有興趣:https://wiki.libsdl.org/SDL_GL_SetSwapInterval – pappix 2018-02-15 18:52:10

回答

0

這聽起來很討厭,讓你自己去計算在Mac OS X上打電話的情況,但this guy似乎有某種解決方案。

+1

這與GLEW原來並不完全一樣,但我想這可能會有幫助,當我找到更多的時間花在這個問題上。恭喜額外的代表:P – Tronic 2010-03-01 02:15:48

+4

鏈接現在已經死亡... – manylegged 2015-01-03 22:53:21

+1

...這就是爲什麼只有鏈接的答案是不好的。 – 2015-09-01 05:45:46

6

找到一個跨平臺的解決方案並不容易。該平臺最終擁有顯示器(和交換行爲)。所以它必然是平臺API的一部分(如果暴露)。實際上不可能有一個跨平臺的解決方案。當涉及到與平臺的交互時,甚至會有一些平臺特定的位。

現在你可以爭辯說所有的平臺都應該使用相同的API來處理它們的特定接口,但是我懷疑你會從它們那裏得到任何牽引力。

最後,並非所有的幀緩衝器都直接顯示。如果您碰巧使用的是窗口管理系統,它實際上將幀緩衝區像素混合到桌面上(就像Aero在運行時一樣),那麼無論如何您都無法控制交換行爲。

僅供參考,不同的API來做到這一點的主要平臺:

  • wglSwapIntervalEXT
  • glXSwapIntervalSGI
  • AGLSetInteger
+0

這個。 OpenGL中的「跨平臺」幾乎總是意味着多個代碼路徑。 Vsync在這種方式中並不是唯一的。 – Alan 2010-02-26 17:30:41

+1

在OSX上,您希望將Cocoa與DisplayLink用於vSync,而不是使用帶有碳的AGL。 – zezba9000 2012-02-20 21:12:32

0

對於OS X,請http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSOpenGLContext_Class/Reference/Reference.html

NSOpenGLCPSwapInterval

設置或獲取交換的時間間隔。交換 區間表示爲一個長。如果交換間隔設置爲0 (默認值),則儘快執行flushBuffer方法 ,而不考慮顯示器的垂直刷新率。如果 交換間隔設置爲1,則僅在顯示器的垂直回掃 期間交換緩衝區。稍後可用於Mac OS X v10.0和 。

在NSOpenGL.h中聲明。