Pyglet- 屏幕闪烁

时间:2021-01-11 23:23:15

标签: python pyglet

我正在尝试使用 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。提前致谢!

编辑:添加链接

2 个答案:

答案 0 :(得分:0)

我想问题来自于部门:(

在 Python 中:

1/60 = 0 

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

1.0/60

1.0/60 = 0.016666667 

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

答案 1 :(得分:0)

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

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