python - 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 打印方法的出现不影响区间函数的阈值速度。
解决方案
尝试将 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)
推荐阅读
- javascript - 如何将文本字段更改为按钮
- python - 在方法中更改一行会产生我不明白的后果
- java - 如何使进度条上的进度号可见?
- google-bigquery - 如果可能,如何在 Google Bigquery 上为回测设置追踪止损
- php - “未定义的变量”虽然已定义
- python-3.x - 是否可以将字符串转换为列表,如下所示: "man1\nman2\nwoman\nman4" 在 PYTHON 中转换为 ["man1", "man2", "man4"]
- django - 片段不显示在 wagtail 管理页面中
- javascript - 如何根据 FireFox 中的月/日/年下拉菜单获取年龄
- ajax - 使用 Datatables AltEditor 请求未知参数
- c# - API GET 请求返回 HTML/Text 而不是 JSON