如何在PyOpengl中启用vsync?

正如标题所说的那样。我想在PyOpenGL中打开垂直同步,但是我该怎么做呢?相当详尽的网络搜索没有显示任何内容,但也许有人有一个聪明的解决方案?我在OS X上,我不介意使用哪个程序包创建窗口和应用程序循环。但是,出于以下原因,我宁愿开发一款功能完善的Cocoa应用程序。


我考虑使用pyglet而不是PyOpenGL,但是在64位OS上运行的pyglet的唯一版本是将近一年的alpha版本,所以我不想使用它,因为恐怕它可能已经废弃了。真可惜,因为它看上去比PyOpenGL好得多。


在此页面上,我找到了以下代码。该页面说它适用于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应用程序。


慕标5832272
浏览 285回答 3
3回答

POPMUISE

我设法解决了您的细分错误。以下是在Mac上启用vsync的工作代码:-import sysdef 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()函数即可。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python