正如标题所说,我想在PyOpenGL中开启垂直同步,但是我该怎么做呢?进行了相当详尽的网络搜索,没有找到任何结果,但也许有人有聪明的解决方案?我使用的是OS X系统,不介意使用哪个包来创建窗口和应用程序循环。然而,出于下面讨论的原因,我宁愿避免开发一个完整的Cocoa应用程序。
我可以尝试使用pygame,看看这段代码是否可以与其配合使用,但我在网上找到了几份报告,称这段代码也会导致pygame崩溃,所以我猜想它曾经有效,但现在不再有效。
最后,我知道一个可行的解决方案是使用PyObjC构建Cocoa应用程序。然而,那里有一个相当大的学习曲线,并且我最终得到的东西与跨平台完全不相似。这段代码仅供我个人使用,但如果我在几年后在另一台机器上回来,我非常关心最大化再次使其工作的可能性。出于这些原因,我真的不认为构建Cocoa应用程序是我想要涉足的领域。
我研究了使用pyglet而不是PyOpenGL,但是运行在64位操作系统上的唯一版本是一个将近一年前的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应用程序。然而,那里有一个相当大的学习曲线,并且我最终得到的东西与跨平台完全不相似。这段代码仅供我个人使用,但如果我在几年后在另一台机器上回来,我非常关心最大化再次使其工作的可能性。出于这些原因,我真的不认为构建Cocoa应用程序是我想要涉足的领域。
CGLGetCurrentContext
之外,都会导致分段错误。 - N. Virgo