Pyglet屏幕闪烁

2024-09-29 06:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python和Pyglet制作一个Langton的ant程序。在350×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即可。提前谢谢

编辑:添加链接


Tags: the方法eventondefbufferupdategrid
2条回答

我想问题来自部门:(

在Python中:

1/60 = 0 

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

1.0/60

1.0/60 = 0.016666667 

如果需要浮点除法,则必须将其中一个数字显式写入浮点:1.0

您应该使用on_draw窗口事件,而不是调度自己的绘图函数。您还需要在绘制之前清除窗口

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

相关问题 更多 >