首页 > 解决方案 > Pyglet.clock.schedule 显着函数调用速度限制

问题描述

我在调用函数时遇到了 Pyglet 的 pyglet.clock.schedule 和 pyglet.clock.schedule_interval(interval 参数低于某个值)的速度存在一定的不一致。

这两个命令似乎都显示了它们可以调用函数的间隔的一些共同阈值。如果阈值速度不是那么低 - 最大值,它可能与硬件性能限制有关。每秒大约调用 30 个函数。

测试代码和结果如下:

import pyglet
from time import time

window = pyglet.window.Window()

last_update = time()

def update(dt):
    global last_update
    print("dt: ", dt)
    print('Measured dt: ', time()-last_update)
    last_update = time()

@window.event
def on_draw():
    dt = pyglet.clock.tick()
    print('Last clock tick: ', dt, "\n")

pyglet.clock.schedule(update)
pyglet.app.run()

样本结果:

dt:  0.030516604423768356
Measured dt:  0.03125262260437012
dt:  0.0007512663764779326
Measured dt:  0.0
Last clock tick:  0.0007512663764779326 

尽管dt = pyglet.clock.tick()诱导调用update(dt)其 dt 值状态与预期clock.tick()返回值一致的函数,但第一次调用几乎总是返回相同的、固定的 dt 值,这表明Pyglet 的间隔函数调用回调函数的最大频率约为 30-32每秒次。

我不确定是什么影响了如此低的频率,但我猜这种性能可能是某种故障的影响。证据似乎至少是在出版商的示例程序中使用了更高的帧速率(例如 120 FPS)。

它工作如此缓慢的原因是什么,pyglet的间隔函数是否可以以某种方式修复,以相应的给定频率更新回调函数,不限于每秒约30次?提前感谢您的帮助。

PSclock.schedule_interval只有当它的间隔大约在 1/30 以上时才能被操纵。

PPS 打印方法的出现不影响区间函数的阈值速度。

标签: pythonpyglet

解决方案


尝试将 FPS 限制设置为更高的值:

pyglet.clock.set_fps_limit(60)

看起来 pyglet 在某些情况下默认将此限制设置为非常低的值:FPS with Pyglet half of monitor refresh rate

它还可以帮助将 vsync 设置为 false:

class Window(pyglet.window.Window):
    def __init__(self, refreshrate):
        super(Window, self).__init__(vsync = False)

编辑:正如评论中指出的那样,不推荐使用 set_fps_limit 。schedule_interval 的解决方案看起来像:

pyglet.clock.schedule_interval(self.on_draw, 1.0/60.0)

推荐阅读