【问题标题】:Pyglet- Screen FlickeringPyglet-屏幕闪烁
【发布时间】:2021-01-31 16:45:58
【问题描述】:

我正在尝试使用 Python 和 Pyglet 制作 Langton 的 ant 程序。在 350 x 250 的网格中重绘所有 62500 个图块需要很长时间,所以我所做的是每当我迭代 Langton 的 Ant 部分时,我将更新的图块添加到列表中,当调用 on_draw() 时,我绘制更新矩形并清除列表。

@window.event
def on_draw():
    Ant.batch.draw() # Draw the grid spaces that were changed
    Ant.buffer = [] # Clear the updated grid space buffer

def update(dt):
    my_ant.iterate(1) # Run one iteration of Langton's Ant
   
pyglet.clock.schedule_interval(update, 1/1000)
pyglet.app.run()

但是,这会导致输出闪烁、颜色混合以及模拟运行的速度几乎没有尽可能快。我还尝试不将on_draw() 绑定到window.event 循环中,而是每秒调用60 次,但它导致了同样的闪烁和速度问题。

def draw(): # Don't tie drawing the screen into the event loop
    Ant.batch.draw() # Draw the grid spaces that were changed
    Ant.buffer = [] # Clear the updated grid space buffer

def update(dt):
    my_ant.iterate(1) # Run one iteration of Langton's Ant
   
pyglet.clock.schedule_interval(update, 1/1000)
pyglet.clock.schedule_interval(draw, 1/60) # Update the screen 60 times a second

pyglet.app.run()

我真的很喜欢第二种方法对帧时间和模拟的控制,所以如果有任何方法可以保持相同的通用方法但修复闪烁,那就太好了。 我是 python/pyglet 的新手,所以如果有任何方法可以在不编写自定义事件循环的情况下做我想做的事,那也很好。

Here 是所有代码的链接,它只需要安装 pyglet。提前致谢!

编辑:添加链接

【问题讨论】:

    标签: python pyglet


    【解决方案1】:

    您应该使用on_draw 窗口事件,而不是安排您自己的绘图功能。您还需要在绘制之前清除窗口。

    @window.event
    def on_draw():
        window.clear()
        Ant.batch.draw()
        Ant.buffer = []
    

    【讨论】:

    • 感谢您的回复。但是batch列表只存储了上一次显示周期更新过的方格,所以当你调用window.clear再绘制batch时,它只绘制更新后的方格,因为每次重绘太慢了正方形每一帧。有没有办法解决这个问题?
    • 在您的示例中,您仅显示更新的正方形。你想显示所有的方块还是只显示更新的方块?我很困惑。根据我提出的建议,我可以在没有任何闪烁的情况下使用您的代码获得最大 FPS。你还有什么想要完成的吗?
    • 我应该在我的原帖中说清楚,我不想清除屏幕的原因是我不能每帧重绘每个正方形,所以我只重绘更新的帧,但想要以前的绘制的正方形(来自以前的迭代)留在屏幕上。
    • 啊,我明白了。在这种情况下,您需要稍微重做您的实现。我的建议是在开始时创建整个矩形网格。所有 250x250 矩形。您不需要使用此方法跟踪更新的矩形以及所有这些,因为批处理可以处理它。然后每次你的蚂蚁移动到一个正方形,改变它的颜色。您的实现缓慢的原因是因为您每秒创建 10k 个矩形。 (1/1000 秒 * 10 次迭代)
    • pastebin.com/V3HhHdXe 这是一个基于您的代码的示例。
    【解决方案2】:

    我想问题来自于部门:(

    在 Python 中:

    1/60 = 0 
    

    这是一个整数除法,因为 1 和 60 是整数,你应该改写:

    1.0/60

    1.0/60 = 0.016666667 
    

    如果你想要一个浮点除法,你必须明确地将其中一个数字写为浮点数:1.0

    【讨论】:

    • 这对我不起作用。我在 Python 3 上,所以 3/4 == 3.0/4.0 == .75
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2015-11-05
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多