Pyglet 应用程序帧率似乎在每次重新启动时都会加快

Pyglet application framerate appears to speed up each time it is restarted

我正在 pyglet 中进行基本模拟,我需要重新 运行 并多次可视化。模拟会调整镜头的焦点 "f",直到它到达所需的位置(参见此处的 gif https://imgur.com/Ui06B1c)。我在 for 循环中放置了一个模拟实例,并在其中放置了一个 pyglet.app.run() 循环 运行ning,这样它就可以重置并 运行 10 集。

num_episodes=10
for i in range(num_episodes):
    update_rate=1/59
    simulation=PivotPointSimulation()
    pyglet.clock.schedule_interval(update, update_rate)
    pyglet.app.run()

我需要创建 "simulation" 的实例,以便 pyglet.app.run() 可以调用绘制和更新方法。通过在每个循环中创建一个新实例,我还可以在模拟再次开始时重置变量。当镜头的焦点 "f" 到达所需位置 pyglet.app.exit().

时,我终止模拟

问题是每次 for 循环迭代时,我的 pyglet 应用程序的帧速率都会加快(例如参见 gif https://imgur.com/Ui06B1c)。我已经检查了 update_rate 是否正在改变并且它保持不变。非常特别的是,当我使用 spyders 停止按钮停止代码,并使用 "play" 再次 运行 模拟时,每次我点击停止并播放时,模拟的帧率也会变得越来越快。

我想知道是否有一种方法可以正确终止应用程序,以便每次 运行s 再次完全重置?我不确定 pyglet.app.exit() 是否正确重置了所有内容。但我不确定应用程序是如何加速的,因为 pyglet.clock.schedule_interval(update, update_rate) 应该以恒定的更新速率更新。

我试过 Vsync 设置(设置从 falsetrue)但没有帮助。我也试过使用 pyglet.clock.set_fps_limit(60) 无济于事。所以我不确定这里发生了什么。

有没有人遇到过这个问题?

每次调用pyglet.clock.schedule_interval(update, update_rate),都会按速率添加回调。

因此在 10 次循环结束时,您安排了相同的回调十次。

防止这种情况的一种方法是在之前取消安排函数,这样它就不会被安排第二次:

num_episodes=10
for i in range(num_episodes):
    update_rate=1/59
    simulation=PivotPointSimulation()
    pyglet.clock.unschedule(update)   
    pyglet.clock.schedule_interval(update, update_rate)
    pyglet.app.run()