최근 fogleman의 우수한 "Minecraft in 500 lines"데모를 https://github.com/fogleman/Craft에서 다운로드했습니다. 필자는 2to3 도구를 사용하여 손으로 일부 세부 사항을 수정하여 python3에서 실행되도록했습니다. 나는 이제 render 메서드에서 self.clear()
이라는 호출을 가진 것에 대해 궁금해합니다. 당신이 볼 수 있듯이Python minecraft pyglet glClear() 프레임 건너 뛰기
def on_draw(self):
""" Called by pyglet to draw the canvas.
"""
frameStart = time.time()
self.clear()
clearTime = time.time()
self.set_3d()
glColor3d(1, 1, 1)
self.model.batch.draw()
self.draw_focused_block()
self.set_2d()
self.draw_label()
self.draw_reticle()
renderTime = time.time()
self.clearBuffer.append(str(clearTime - frameStart))
self.renderBuffer.append(str(renderTime - clearTime))
, 나는 self.clear()
의 실행 시간을 가져다가 렌더링 방식의 나머지 부분이 내 수정 렌더링 pyglet에 의해 매 프레임마다 호출 방법이다. .../pyglet/창/__ init__.py에서 찾을 수 있습니다 self.clear()
전화 pyglet의이 메소드의 호출 :
def clear(self):
'''Clear the window.
This is a convenience method for clearing the color and depth
buffer. The window must be the active context (see `switch_to`).
'''
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
그래서 나는 기본적으로 glClear()
로 전화를 걸 않습니다.
게임을 테스트하는 동안 (60FPS에서) 일부 프레임이 떨어지는 것을 보았습니다. 위의 코드를 추가하여 명령의 실행 시간을 측정하고 특히 glClear()
중 하나를 측정했습니다. 렌더링 자체가 10 밀리 초보다 오래 걸리지 않는다는 것을 알게되었습니다. 그러나 glClear()
의 기간은 다른 이야기의 비트가 여기에 서로 다른 조건에서 3 개 측정 분포입니다 :
Duration of glClear() under different conditions.
마젠타 라인은 프레임의 시간 제한을 보여줍니다. 그래서 첫 줄 뒤에있는 모든 것은 프레임이 떨어지는 것을 의미합니다.
glClear()의 실행 시간은 첫 번째 프레임이 만료 된 후 일종의 "echo"처럼 보입니다. 왜 나 한테 설명 할 수 있니? 그리고 어떻게 전화를 더 빨리 할 수 있습니까?
불행히도 저는 OpenGL 전문가가 아니므로 모든 조언자에게 감사드립니다. ;)
타이머 해상도는 단순히 "에코"를 설명하는 16ms 일 수 있습니다. https://docs.python.org/2/library/time.html#time.time에서 "모든 시스템이 1 초보다 우수한 정밀도로 시간을 제공하지는 않습니다."를 참조하십시오. 다른 타이머를 사용해보고 중요한지 확인하십시오. – TWT