2013-06-13 5 views
4

제목이 실제로 말한대로. PyOpenGL에서 수직 동기화를 켜고 싶습니다만 어떻게 할 수 있습니까? 상당히 철저한 웹 검색으로 아무 것도 나오지 않았지만 어쩌면 누군가가 영리한 해결책을 가지고 있을까요? 나는 OS X에 있고 어떤 패키지가 윈도우와 어플리케이션 루프를 만드는데 사용되는지는 신경 쓰지 않는다. 그러나, 차라리 아래에 설명 된 이유 때문에 본격적인 코코아 응용 프로그램을 개발하는 것을 멀리 할 것입니다.PyOpengl에서 vsync를 활성화하는 방법은 무엇입니까?

PyOpenGL보다는 pyglet을 사용했지만 64 비트 OS에서 실행되는 pyglet의 유일한 버전은 거의 1 년이 지난 알파 릴리스이므로 두려워서 사용하지 않으려합니다. 포기할 수 있습니다. 실제로 PyOpenGL보다 훨씬 좋았 기 때문에 수치 스럽습니다.

this page에서 다음 코드를 발견했습니다. 페이지에 파이 게임이 있다고하지만 과 같이 보입니다.은 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" 

내가 대신 파이 게임을 시도하고이 코드가 작동하는지 확인하지만이 코드뿐만 아니라 파이 게임과 충돌이 있음을 온라인으로 몇 가지 보고서를 발견, 그래서 그것을 작동하는 데 사용 뭔가 추측하지만 지금하고있어 수 하지 않습니다.

마지막으로 나는 PyObjC로 코코아 앱을 만드는 것이 효과적이라는 것을 알고 있습니다. 그러나 거기에 꽤 큰 학습 곡선이 있으며, 나는 심지어 크로스 플랫폼에 가깝지 않은 무언가로 끝날 것입니다. 이 코드는 제 개인적인 용도로만 사용됩니다. 그러나 다른 컴퓨터에서 몇 년 만에 다시 돌아 오면 다시 작동하게 될 확률을 극대화하는 데 많은 관심이 있습니다. 이러한 이유로 나는 코코아 애플리케이션을 구축하는 것이 내가 들어가기를 원하는 것이라고 생각하지 않는다.

+0

'CGLGetCurrentContext'가 아닌 ctypes를 통해 CGL 메소드를 사용하면 세그먼트 오류가 발생하는 것으로 보입니다. – Nathaniel

답변

0

저는 지금 pyglet을 사용하여이를 해결했습니다. 오랫동안 점검 된 코드는 없지만 주요 개발자가 참여하는 활발한 커뮤니티가있는 것 같습니다. 그것은 크로스 플랫폼이고 매우 쉽게 갈 수있었습니다. 난 단지 창을 관리하기 위해 pyglet을 사용하고 OpenGL에 PyOpenGL을 사용하고있다. 나중에 필요하다면 pyglet의 더 빠르지 만 낮은 레벨의 OpenGL 바인딩을 사용할 수 있으며, pyglet이 제공하는 다양한 추가 기능을 이용할 수 있습니다.

그러나 OS X Mountain Lion (내가 최신 소스에서 설치 한)에서 작동하는 공식 릴리스가 없기 때문에 상황이 다소 불안정한 것으로 느껴지고 코드가 한 두 개 작동하지 않을 수도 있습니다. 더 많은 주요 OS X 업그레이드. 그래서 누군가 pyglet을 사용하지 않고 작동하는 해결책을 가지고 있다면 나는 아직도 그것을 정말로 고맙게 여길 것입니다.

0

WinDLL을 사용하여 OpenGL DLL을로드하고 CGL을 GL 또는 gl (둘 중 빠른 것)으로 바꾸어보십시오. 그런 다음 OGL = ctypes.windll.LoadLibrary (ctypes.util.find_library ("OpenGL을")) 당신의 기능 : 예를 들어

3

[GL, GL (권장)] GetCurrentContext()는 내가 해결하기 위해 관리 당신의 세그멘테이션 오류. 다음은 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() 함수를 호출

.

관련 문제