2013-06-13 99 views
4

正如標題所說。我想在PyOpenGL中打開垂直同步,但我該怎麼做?一個相當詳盡的網絡搜索沒有任何東西,但也許有人有一個聰明的解決方案?我在OS X上,我不介意使用哪個軟件包來創建窗口和應用程序循環。不過,由於下面討論的原因,我寧願遠離開發一個成熟的Cocoa應用程序。如何在PyOpengl中啓用vsync?

我使用pyglet而不是PyOpenGL進行了研究,但是在64位操作系統上運行的pyglet的唯一版本是一個近一年的alpha版本,所以我不想使用它,因爲我害怕它可能是放棄的。這太遺憾了,因爲它實際上比PyOpenGL好看得多。

this page我發現下面的代碼。該頁面表示它是用於pygame的,但它看起來像應該也適用於Glut。但是,當我運行它(在創建上下文之後)它只會導致分段錯誤。如果任何人都能夠洞察爲什麼會發生這種情況,那就太好了,因爲這樣的事情就是我正在尋找的東西。

import sys 

def enable_vsync(): 
    if sys.platform != 'darwin': 
     return 
    try: 
     import ctypes 
     import ctypes.util 
     ogl = ctypes.cdll.LoadLibrary(ctypes.util.find_library("OpenGL")) 
     # set v to 1 to enable vsync, 0 to disable vsync 
     v = ctypes.c_int(1) 
     ogl.CGLSetParameter(ogl.CGLGetCurrentContext(), ctypes.c_int(222), ctypes.pointer(v)) 
    except: 
     print "Unable to set vsync mode, using driver defaults" 

我可以嘗試pygame的替代,看看該代碼可以使用,但我發現了幾個網絡版上報告,該代碼與pygame的崩潰一樣,所以我猜它的東西,用來工作,但現在沒有。

最後,我知道一個可行的解決方案是用PyObjC構建一個Cocoa應用程序。但是,這裏有一個非常大的學習曲線,而且我最終會發現一些甚至不能接近跨平臺的東西。此代碼僅供我個人使用,但我非常關心如果在幾年後在不同的機器上重新使用該代碼,我最大限度地提高再次工作的可能性。由於這些原因,我真的不認爲構建一個可可應用程序是我想要的。

+0

看起來,除CGLGetCurrentContext之外,通過ctypes使用任何CGL方法都會導致分段錯誤。 – Nathaniel

回答

0

我已經通過使用pyglet解決了這個問題。儘管很長時間沒有檢查代碼,但似乎仍有一個活躍的社區,主要開發人員參與其中。它是跨平臺的,而且很容易開展。我只是使用pyglet來管理窗口,而我正在使用PyOpenGL作爲OpenGL的東西。稍後,如果需要,我可以使用pyglet的更快但低級別的OpenGL綁定,並且我可以利用pyglet提供的各種額外功能。

但是,這種情況感覺有些不穩定,因爲沒有官方版本可用於OS X Mountain Lion(我從最新源代碼安裝),並且恐怕我的代碼可能會在一兩次後停止工作更多主要的OS X升級。因此,如果任何人有一個解決方案,而不使用pyglet我仍然真的很感激它。

0

嘗試使用WinDLL加載OpenGL DLL並用函數名稱中的GL或gl替換CGL(無論哪種方式)。 例如: OGL = ctypes.windll.LoadLibrary(ctypes.util.find_library( 「OpenGL的」)) 然後,你的功能: [GL,GL(推薦)] GetCurrentContext()

3

我設法解決您分段故障。以下是在Mac上啓用vsync的工作代碼: -

import sys 

def enable_vsync(): 
    if sys.platform != 'darwin': 
     return 
    try: 
     import ctypes 
     import ctypes.util 
     ogl = ctypes.cdll.LoadLibrary(ctypes.util.find_library("OpenGL")) 
     v = ctypes.c_int(1) 

     ogl.CGLGetCurrentContext.argtypes = [] 
     ogl.CGLGetCurrentContext.restype = ctypes.c_void_p 

     ogl.CGLSetParameter.argtypes = [ctypes.c_void_p, ctypes.c_int, ctypes.c_void_p] 
     ogl.CGLSetParameter.restype = ctypes.c_int 

     context = ogl.CGLGetCurrentContext() 

     ogl.CGLSetParameter(context, 222, ctypes.pointer(v)) 
    except Exception as e: 
     print("Unable to set vsync mode, using driver defaults: {}".format(e)) 

在創建並設置上下文後,只需調用此enable_vsync()函數即可。