Visindigo::General::TickObject Class
class Visindigo::General::TickObjectTickObject提供了一个基于时间的更新机制,允许用户在每个Tick周期执行特定的逻辑. 详情...
| 头文件: | #include <TickObject> |
| 自以下版本: | Visindigo 0.16.0 |
公开类型
(自 Visindigo 0.16.0 引入) enum | PresetInterval { FPS_8, FPS_10, FPS_15, FPS_20, FPS_24, …, FPS_480 } |
(自 Visindigo 0.16.0 引入) enum | UpdateType { Update, FixUpdate } |
公开成员函数
(自 Visindigo 0.16.0 引入) | TickObject() |
(自 Visindigo 0.16.0 引入) virtual | ~TickObject() |
(自 Visindigo 0.16.0 引入) void | disableAndDelete() |
(自 Visindigo 0.16.0 引入) void | disableUpdate() |
(自 Visindigo 0.16.0 引入) void | enableUpdate(Visindigo::General::TickLoop *loop = nullptr) |
(自 Visindigo 0.16.0 引入) qint64 | getCurrentMillisecondsSinceEpoch() const |
(自 Visindigo 0.16.0 引入) double | getFixUpdateInterval() const |
(自 Visindigo 0.16.0 引入) Visindigo::General::TickObject::UpdateType | getUpdateType() const |
(自 Visindigo 0.16.0 引入) bool | isEnabled() const |
(自 Visindigo 0.16.0 引入) virtual void | onFixUpdate(double elapsedTime_ms) |
(自 Visindigo 0.16.0 引入) virtual void | onUpdate(double elapsedTime_ms) |
(自 Visindigo 0.16.0 引入) void | setFixUpdateInterval(Visindigo::General::TickObject::PresetInterval preset) |
(自 Visindigo 0.16.0 引入) void | setFixUpdateInterval(double interval) |
(自 Visindigo 0.16.0 引入) void | setUpdateType(Visindigo::General::TickObject::UpdateType type) |
详细说明
TickObject是一个抽象类,用户可以通过继承它来创建自己的Tick对象,通过重写onUpdate或onFixUpdate 方法来定义在每个Tick周期执行的逻辑。用户可以通过enable和disable方法来控制Tick对象的启用状态, 并通过setFixUpdateInterval方法来设置FixUpdate的时间间隔。
TickLoop会在每个Tick周期调用所有启用的TickObject的onUpdate或onFixUpdate方法,取决于UpdateType设置。 也就是说,一个TickObject在一次执行之内,只能是Update或FixeUpdate中的一种,不能同时是两者。当然可以 中途切换UpdateType设置,但通常不推荐这么做。
TickLoop寄生在Qt事件循环中,因此刻循环执行频率就是Qt事件循环的频率,如果不频繁处理大量耗时任务,速率甚至可以高达上千次每秒。
在FixUpdate模式下,TickLoop会根据设定的固定时间间隔(毫秒)来调用onFixUpdate方法。 在大部分情况下(当应用负载较低时),TickLoop调用onFixUpdate的频率理应基本接近设置预期。
但在某些情况下(如应用负载过高时),TickLoop可能无法按预期频率调用onFixUpdate方法。为此,TickLoop提供了 两种超时策略,请参见Visindigo::General::TickLoop的说明。
值得指出的是,TickObject的执行线程固定为执行enable方法时所在的线程,因此用户应当确保在正确的线程中启用TickObject。 需要跨线程启动TickObject时,应使用Qt信号槽机制的跨线程连接来调用enable方法,或者直接在目标线程中创建并启用TickObject。
Note: 这类替代旧版Visindigo中的VIAbstractBehavior、VIBasicBehavior和VITimedBehavior,提供更简明清晰的设计。
成员类型文档
[since Visindigo 0.16.0] enum TickObject::PresetInterval
预设的固定更新时间间隔的枚举,它不直接记录值,由内部实现转换为对应的毫秒数。
| Constant | Value | Description |
|---|---|---|
Visindigo::General::TickObject::FPS_8 | 0 | 125ms,部分FPS游戏主逻辑的经典帧率。 |
Visindigo::General::TickObject::FPS_10 | 1 | 100ms,游戏Minecraft的红石刻频率。 |
Visindigo::General::TickObject::FPS_15 | 2 | 66.6667ms,不常用。 |
Visindigo::General::TickObject::FPS_20 | 3 | 50ms,游戏Minecraft的主逻辑刻频率。 |
Visindigo::General::TickObject::FPS_24 | 4 | 41.6667ms,电影的经典帧率,即在人眼中形成动画的最低帧率。 |
Visindigo::General::TickObject::FPS_30 | 5 | 33.3333ms,现代显示器刷新率的(一般情况下)最低帧率。 |
Visindigo::General::TickObject::FPS_60 | 6 | 16.6667ms,现代显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_70 | 7 | 14.2857ms,现代显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_120 | 8 | 8.3333ms,一些高刷新率显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_144 | 9 | 6.9444ms,一些高刷新率显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_240 | 10 | 4.1667ms,一些高刷新率显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_360 | 11 | 2.7778ms,一些高刷新率显示器的常见刷新率。 |
Visindigo::General::TickObject::FPS_480 | 12 | 2.0833ms,不常用。 |
这个enum 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] enum TickObject::UpdateType
| Constant | Value | Description |
|---|---|---|
Visindigo::General::TickObject::Update | 0 | 每个Tick周期调用onUpdate方法。 |
Visindigo::General::TickObject::FixUpdate | 1 | 每个固定Tick周期调用onFixUpdate方法,频率由setFixUpdateInterval设置。 |
这个enum 从 Visindigo 0.16.0 开始支持。
成员函数文档
[since Visindigo 0.16.0] TickObject::TickObject()
构造函数
这个function 从 Visindigo 0.16.0 开始支持。
[virtual noexcept, since Visindigo 0.16.0] TickObject::~TickObject()
析构函数
Warning: 不要在任何场景delete一个启用状态的TickObject对象。要释放内存, 请使用disableAndDelete方法。或先调用disable方法,直到isEnabled的返回值 变为false后再delete对象。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::disableAndDelete()
禁用并删除TickObject。它会先调用disable方法来禁用对象,然后在所在的TickLoop的当前循环结束后才真正删除对象。
如果它当前未启用,则会直接删除对象。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::disableUpdate()
禁用TickObject,它会从当前TickLoop上卸载,使其停止接收更新调用。
它会在所在的TickLoop的当前循环结束后才真正停止调用,因此即使调用disable,也可能 在短时间内继续接收到更新调用,直到所在的TickLoop完成当前循环为止。
你不能在调用disable后立即重新调用enable,因此此时它仍处于激活状态,重新enable不产生任何效果。
你也不能在调用disble后立即销毁对象,要么手动判断在isEnabled为false时销毁,要么 改用disableAndDelete方法。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::enableUpdate(Visindigo::General::TickLoop *loop = nullptr)
loop 可选的TickLoop对象,如果为nullptr,则默认为当前线程的TickLoop。
启用TickObject,挂载到目标TickLoop上。如果你不设置loop参数,则默认挂载到当前线程自己的TickLoop上。
如果你需要挂载到其他线程的TickLoop上,请在目标线程中调用enable方法。
如果你要挂载到自己创建的TickLoop上,请直接传入该TickLoop的指针。
调用此函数后,isEnable会开始返回true,但它并不会立即参与到当前的事件循环中,只从下一次循环开始生效。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] qint64 TickObject::getCurrentMillisecondsSinceEpoch() const
return 当前时间戳,单位为毫秒。
如果TickObject处于启用状态,则返回所在的TickLoop的当前时间戳;否则返回系统当前时间戳。
请参见Visindigo::General::TickLoop::getCurrentMillisecondsSinceEpoch()以了解TickLoop的当前时间戳的定义和使用细节。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] double TickObject::getFixUpdateInterval() const
return FixUpdate的时间间隔,单位为毫秒。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] Visindigo::General::TickObject::UpdateType TickObject::getUpdateType() const
return 更新类型。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] bool TickObject::isEnabled() const
return 是否启用状态。
这个function 从 Visindigo 0.16.0 开始支持。
[virtual, since Visindigo 0.16.0] void TickObject::onFixUpdate(double elapsedTime_ms)
elapsedTime_ms 当前Tick周期的时间增量,单位为毫秒。
每个固定更新周期调用的函数,用户可以通过重写此函数来定义在每个固定Tick周期执行的逻辑。
值得指出的是,在FixUpdate模式下,elapsedTime_ms参数的值可能会根据TickLoop的FixTickTimeoutPolicy设置而有所不同。
你不能假定它一定等于你通过setFixUpdateInterval设置的固定时间间隔,如果你这么假定,则在某些情况下(如应用负载过高时)可能会导致逻辑错误。 如果你利用它进行某些物理计算,则这种错误假定必然影响物理计算的准确性(譬如某些应用会出现非常 经典的在不同帧率下摩擦效果/加速效果不一致的问题)。请参见Visindigo::General::TickLoop的说明以了解更多细节。
这个function 从 Visindigo 0.16.0 开始支持。
[virtual, since Visindigo 0.16.0] void TickObject::onUpdate(double elapsedTime_ms)
elapsedTime_ms 当前Tick周期的时间增量,单位为毫秒。
每个更新周期调用的函数,用户可以通过重写此函数来定义在每个Tick周期执行的逻辑。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::setFixUpdateInterval(Visindigo::General::TickObject::PresetInterval preset)
preset 预设的固定更新时间间隔。 设置FixUpdate的时间间隔,使用预设的固定更新时间间隔。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::setFixUpdateInterval(double interval)
interval 固定更新时间间隔,单位为毫秒。
设置FixUpdate的时间间隔。
这个function 从 Visindigo 0.16.0 开始支持。
[since Visindigo 0.16.0] void TickObject::setUpdateType(Visindigo::General::TickObject::UpdateType type)
type 更新类型。
设置更新类型,可以是Update或FixUpdate。
这个function 从 Visindigo 0.16.0 开始支持。