Pyglet.clock.schedule重要函数调用速度限制

时间:2018-11-12 02:51:15

标签: python pyglet

我在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?谢谢您的帮助。

PS clock.schedule_interval仅在其间隔大约大于1/30时才能被操纵。

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

1 个答案:

答案 0 :(得分:0)

尝试将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)