【发布时间】:2016-08-01 12:51:55
【问题描述】:
我最近从https://github.com/fogleman/Craft 下载了fogleman 出色的“Minecraft in 500 lines”演示。我使用了 2to3 工具并手动修正了一些细节,使其可以在 python3 下运行。我现在想知道在渲染方法中调用self.clear() 的事情。这是我修改后的渲染方法,每帧都被 pyglet 调用:
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() 的执行时间和渲染方法的其余部分。 self.clear()的调用调用了pyglet的这个方法,可以在.../pyglet/window/__init__.py找到:
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()。
我在测试游戏时注意到一些帧丢失(60 FPS),所以我添加了上面的代码来测量命令的执行时间,尤其是glClear() 的执行时间。我发现渲染本身永远不会超过 10 毫秒。但是glClear() 的持续时间有点不同,这里是不同条件下 3 次测量的分布:
Duration of glClear() under different conditions.
洋红色线显示一帧的时间限制。所以第一行后面的所有内容都意味着有丢帧。
glClear() 的执行时间在第一帧到期后似乎有某种“回声”。你能解释一下为什么吗?我怎样才能更快地拨打电话?
不幸的是,我不是 OpenGL 专家,所以我很感谢大家的建议。 ;)
【问题讨论】:
-
可能是您的计时器分辨率仅为 16 毫秒,这可以解释“回声”。请参阅docs.python.org/2/library/time.html#time.time,其中说“并非所有系统都提供比 1 秒更好的精度。”。尝试不同的计时器,看看是否重要。
标签: python opengl frame minecraft pyglet