pyglet.clock
精确的帧速率计算功能调度。
这个 clock
模块允许您安排函数定期运行,或在将来一次性执行。Piglet的默认事件循环 (run()
)保存一个 Clock
,它是自动勾选的。
备注
一些内部模块会在时钟上安排项目。如果您使用的是自定义事件循环,请始终记住 tick 时钟!
排程
您可以计划在每次时钟滴答时调用的函数::
def callback(dt):
print(f"{dt} seconds since last callback")
clock.schedule(callback)
这个 schedule_interval 方法导致每隔“n”秒调用一次函数::
clock.schedule_interval(callback, 0.5) # called twice a second
这个 schedule_once 方法会导致函数在未来的“n”秒内被调用一次::
clock.schedule_once(callback, 5) # called in 5 seconds
所有的 schedule 方法将您指定的任何其他参数或关键字参数传递给回调函数::
def move(dt, velocity, sprite):
sprite.position += dt * velocity
clock.schedule(move, velocity=5.0, sprite=alien)
您可以使用以下任一方法取消安排的活动 unschedule **
clock.unschedule(move)
使用多个时钟
时钟函数都被传递给 Clock
它是用模块初始化的。您可以让此实例直接使用::
clk = pyglet.clock.get_default()
您也可以用您自己的时钟替换默认时钟:
Myclk=pyglet.clock.Clock()pyglet.clock.set_default(Myclk)
每个时钟维护自己的一组预定功能和频率测量。每一个时钟都必须单独“滴答”。
多个和派生的时钟潜在地允许您将“游戏时间”和“挂钟时间”分开,或者使您的时钟与音频或视频流而不是系统时钟同步。
- class Clock
- __init__(
- time_function: ~typing.Callable = <built-in function perf_counter>,
初始化时钟,具有可选的自定义时间功能。
您可以提供自定义时间函数来返回应用程序的经过时间(以秒为单位)。默认为
time.perf_counter
,但可以更换,以实现轻松的时间膨胀效果或游戏暂停。
- call_scheduled_functions(dt: float) bool
调用上一次运行的调度函数 update_time 。
时钟滴答作响时自动调用此方法(请参阅
tick()
),所以在大多数情况下您不需要自己称呼它。返回:
True
如果调用了任何函数,否则False
。
- get_frequency() float
获取最近历史记录的平均时钟更新频率。
结果是最后“n”个更新的滑动窗口的平均值,其中“n”是设计用于覆盖大约1秒的某个数字。这是时钟频率, not 窗口重绘率(fps)。
- 返回类型:
- get_sleep_time(sleep_idle: bool) float | None
获取下一个项目安排之前的时间(如果有的话)。
应用程序可以选择在空闲时间(没有调度任何功能)期间以最大帧速率继续接收更新,或者它们可以在空闲时间休眠,并允许CPU切换到其他进程或在低功率模式下运行。
如果
sleep_idle
是True
选择后一种行为,并且None
如果没有计划的项目,将返回。否则,如果
sleep_idle
是False
,或者如果存在任何计划项,则返回值0。
- schedule( ) None
计划每个节拍都要调用的函数。
调度函数应该具有一个原型,该原型包括
dt
作为第一个参数,它给出了自上一个时钟滴答开始经过的时间(秒)。提供给此方法的任何附加参数或kwarg都将传递给回调::def callback(dt, *args, **kwargs): pass
- 返回类型:
备注
使用此方法调度的函数将被默认的pyglet事件循环调用,这可能会导致较高的CPU使用率。通常情况下,使用
schedule_interval()
除非这是我们想要的。
- schedule_interval( ) None
计划每隔一段时间调用一个函数
interval
几秒钟。要安排以60 Hz(60帧/秒)调用函数,您需要使用
1/60
对于间隔等等。如果pyglet无法按时调用该函数,则会跳过(而不是累积)该计划。如果主线程过载或发生其他硬阻止调用,可能会发生这种情况。The callback function prototype is the same as for
schedule()
. :rtype:None
备注
时间间隔
0
将防止该函数再次被调用。如果您想安排尽可能频繁地调用函数,请参阅schedule()
。
- schedule_interval_for_duration( ) None
临时安排每隔一段时间调用的函数
interval
几秒钟。此方法将安排一个函数,以便每隔一段时间调用
interval
秒(请参见schedule_interval()
),但会在之后自动取消计划duration
几秒钟。回调函数原型与的相同
schedule()
。- Args:
- 功能:
计时器超时时要调用的函数。
- 间隔:
每次呼叫之间等待的秒数。
- 持续时间:
计划函数的秒数。
- 返回类型:
- schedule_interval_soft( ) None
安排大约每隔一年调用一个功能
interval
几秒钟。此方法类似于
schedule_interval()
除了时钟会将间隔与其他调度功能异相移动,以便更均匀地分配CPU负载。这对于需要定期调用但与初始启动时间无关的函数很有用。
pyglet.media
这样做是为了计划音频缓冲区更新,这需要定期进行--如果同时计划所有音频更新(例如,混合几个曲目的乐谱,或者同时播放多个视频),那么在这些间隔内,CPU上的负载会很大,但在外面却是空闲的。采用软间隔调度,使负载分布更加均匀。软间隔调度也可以用作调度异相图形动画的一种简单方法;例如,多个旗帜在风中飘扬。
- 返回类型:
- schedule_once( ) None
将函数安排为在之后调用一次
delay
几秒钟。回调函数原型与的相同
schedule()
。- 返回类型: