Pyglet / OpenGL鼠标移动时图像闪烁

问题描述 投票:0回答:1

我在YouTube上遵循"Pyglet Python and OpenGL - part 01 - Hello Triangle"Attila Toth教程,用Pyglet绘制了三角形,因为我以前从未使用过Pyglet。据我所知,代码与视频中的代码相同,但是,当我移动鼠标时,图像会闪烁,但没有错误消息。

作为参考,我的计算机具有4 GB的RAM,i3 7020U和集成的图形,具有DirectX版本12。我使用的是Windows 10 build 18632。

代码:

import pyglet
from pyglet.gl import *
class Window(pyglet.window.Window):
    def __init__(self, *args,**kwargs):
        super().__init__(*args, **kwargs)
        self.set_minimum_size(400, 300)

        self.triangle = Triangle()

    def ondraw(self):
        self.triangle.vertices.draw(GL_TRIANGLES)

class Triangle():
    def __init__(self):
        self.vertices = pyglet.graphics.vertex_list(3, ('v3f', [-0.5,-0.5,0.0, 0.5,-0.5,0.0, 0.0,0.5,0.0]),
            ('c3B', [100,200,220, 200,110,100, 100,250,100]))

if __name__ == "__main__":
    window = Window(800, 600, "The Game", resizable=True)
    window.ondraw()
    pyglet.app.run()

python opengl pyglet
1个回答
0
投票

我无法重现该问题,我的机器上没有闪烁。 ((GTX 1070、6年前的i7和16GB的RAM,Windows 10等)>]

但是,您的代码存在一些小问题。例如,它是on_draw而不是ondraw,这将在以后变得很重要,因为它是pyglet.window.Window.on_draw函数的挂钩替代,在某些事件下会被调用。

这里的另一个重要功能是设置glViewport,否则屏幕上将不会显示任何内容。因此,您需要的最少代码是:

import pyglet
from pyglet.gl import *
class Window(pyglet.window.Window):
    def __init__(self, *args,**kwargs):
        super().__init__(*args, **kwargs)
        self.set_minimum_size(400, 300)

        self.triangle = Triangle()

    def on_draw(self):
        self.clear()
        self.triangle.vertices.draw(GL_TRIANGLES)

    def on_resize(self, width, height):
        glViewport(0, 0, width, height)

class Triangle():
    def __init__(self):
        self.vertices = pyglet.graphics.vertex_list(3, ('v3f', [-0.5,-0.5,0.0, 0.5,-0.5,0.0, 0.0,0.5,0.0]),
            ('c3B', [100,200,220, 200,110,100, 100,250,100]))

if __name__ == "__main__":
    window = Window(800, 600, "The Game", resizable=True)
    pyglet.app.run()

了解on_***事件是由Pyglet的内部机制触发的,而不是您应该手动调用的东西非常重要(就像您通过if __name__ ...window.ondraw()中所做的那样,这不是一个好主意。

相反,如果要强制draw事件,只需通过触发Pyglet事件来触发它,一些示例是:

  • 鼠标移动
  • 键盘输入(请按空格键)
  • 设置时钟/计时器以安排更新
  • 闪烁可能来自您的图形卡(或缺少适当的驱动程序),它根本无法满足您所要求的刷新率。尝试快速击打[[空格键

几次,这也可能导致闪烁。在这种情况下,您可能无法获得预期的性能。一种解决方法可能是:batched rendering可以大大缩短渲染时间,对于一个简单的三角形,您应该不会遇到问题。
© www.soinside.com 2019 - 2024. All rights reserved.