跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

Visindigo::General::TickObject Class

class Visindigo::General::TickObject

TickObject提供了一个基于时间的更新机制,允许用户在每个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对象,通过重写onUpdateonFixUpdate 方法来定义在每个Tick周期执行的逻辑。用户可以通过enable和disable方法来控制Tick对象的启用状态, 并通过setFixUpdateInterval方法来设置FixUpdate的时间间隔。

TickLoop会在每个Tick周期调用所有启用的TickObject的onUpdateonFixUpdate方法,取决于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

预设的固定更新时间间隔的枚举,它不直接记录值,由内部实现转换为对应的毫秒数。

ConstantValueDescription
Visindigo::General::TickObject::FPS_80125ms,部分FPS游戏主逻辑的经典帧率。
Visindigo::General::TickObject::FPS_101100ms,游戏Minecraft的红石刻频率。
Visindigo::General::TickObject::FPS_15266.6667ms,不常用。
Visindigo::General::TickObject::FPS_20350ms,游戏Minecraft的主逻辑刻频率。
Visindigo::General::TickObject::FPS_24441.6667ms,电影的经典帧率,即在人眼中形成动画的最低帧率。
Visindigo::General::TickObject::FPS_30533.3333ms,现代显示器刷新率的(一般情况下)最低帧率。
Visindigo::General::TickObject::FPS_60616.6667ms,现代显示器的常见刷新率。
Visindigo::General::TickObject::FPS_70714.2857ms,现代显示器的常见刷新率。
Visindigo::General::TickObject::FPS_12088.3333ms,一些高刷新率显示器的常见刷新率。
Visindigo::General::TickObject::FPS_14496.9444ms,一些高刷新率显示器的常见刷新率。
Visindigo::General::TickObject::FPS_240104.1667ms,一些高刷新率显示器的常见刷新率。
Visindigo::General::TickObject::FPS_360112.7778ms,一些高刷新率显示器的常见刷新率。
Visindigo::General::TickObject::FPS_480122.0833ms,不常用。

这个enum 从 Visindigo 0.16.0 开始支持。

[since Visindigo 0.16.0] enum TickObject::UpdateType

ConstantValueDescription
Visindigo::General::TickObject::Update0每个Tick周期调用onUpdate方法。
Visindigo::General::TickObject::FixUpdate1每个固定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 开始支持。