其他分享
首页 > 其他分享> > 如何在PyOpengl中启用vsync?

如何在PyOpengl中启用vsync?

作者:互联网

正如标题所说的那样.我想在PyOpenGL中启用垂直同步,但我该怎么做呢?一个相当详尽的网络搜索没有发现任何东西,但也许有人有一个聪明的解决方案?我在OS X上,我不介意使用哪个包来创建窗口和应用程序循环.但是,由于下面讨论的原因,我宁愿远离开发一个完整的Cocoa应用程序.

我研究了使用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应用程序.然而,那里有一个非常大的学习曲线,我最终会得到一些甚至不接近跨平台的东西.这段代码仅供我个人使用,但如果我在几年后在另一台机器上重新使用它,我非常关心最大化它再次运行的可能性.出于这些原因,我真的不认为构建Cocoa应用程序是我想要进入的.

解决方法:

我设法解决了您的细分问题.以下是在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()函数即可.

标签:python,macos,glut,pyglet,pyopengl
来源: https://codeday.me/bug/20190625/1283897.html