Python minecraft pyglet glClear()跳帧

时间:2016-08-01 12:51:56

标签: python opengl frame minecraft pyglet

我最近从https://github.com/fogleman/Craft下载了fogleman的优秀“Minecraft in 500 lines”演示。我使用了2to3工具并手动修正了一些细节,使其在python3下可以运行。我现在想知道在render方法中调用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专家,所以我很感谢每一个建议人员。 ;)

1 个答案:

答案 0 :(得分:1)

你的图表错了。嗯,至少它不是一个适合测量性能的图表。当你告诉它时,不要相信gl*函数执行,并且永远不要相信它能像你期望的那样快地执行。

大多数gl*函数不会立即执行,但它们不能执行。请记住,我们正在处理GPU,告诉它直接做东西很慢。因此,我们为GPU编写待办事项列表(命令队列),并在确实需要GPU输出内容时将其转储到VRAM中。这个“转储”是一个称为同步的过程的一部分,我们可以用glFlush触发一个。虽然,OpenGL是用户友好的(至少与Vulkan相比),因此它不依赖于我们显式刷新命令队列。许多gl*函数完全取决于您的图形驱动程序,它将隐式地同步CPU和GPU状态,其中包括刷新。

由于glClear通常会启动一个帧,因此您的驱动程序可能认为执行此类隐式同步是好的。正如您可能想象的那样,同步是一个非常缓慢的过程,会阻止CPU执行直到它完成。

这可能就是这里发生的事情。同步过程的一部分是执行内存事务(如glBufferDataglTexImage*),它们可能排队等待,直到用glClear调用刷新它们。这在你的例子中是有意义的;我们可以观察到的峰值可能是你上传了大量块数据后的帧。

但请记住,这只是纯粹的猜测,我也不是这方面的专家,所以不要相信我的具体细节。在这个问题上,OpenGL wiki上的This page是一个很好的资源。

虽然有一件事是肯定的,但您的glClear来电并不会像您的探查者所说的那样长。您应该使用专门用于分析图形的分析器。