您现在的位置:首页 >> 家居资讯

硬核分析:Unreal Tick 构建

发布时间:2025/08/27 12:17    来源:裕安家居装修网

TickGroup(TG_PostPhysics)RunTickGroup(TG_PostUpdateWork)RunTickGroup(TG_LastDemotable)

Tick 两组

动力活动

TG_PrePhysics

帧的开始。

- Actor 将与力学取向(包括基于力学的附着物)进行时交互时适用的 tick 两组。如此,actor 的国家主义再进行时,并可被纳入力学三维状况。

- 此 tick 中所的力学三维数据集属于上相片 — 也就是上相片渲染到结果显示屏上的数据集。

TG_DuringPhysics

到达此步骤时,力学三维已开始。Tick 此两组时的至多时候,或所有两全体领导者已 tick 后,三维进行时并系统升级动力的力学数据集。

- 因它在力学三维的同时直通,无法确定此 tick 中所的力学数据集来自上相片或这两项帧。力学三维可在此 tick 两组中所的至多时候进行时,且一定就会结果显示接收者来表达出来此结果。

- 因为力学三维数据集可能来自这两项帧或上相片,此 tick 两组只推荐用做不对力学数据集或允许相片偏差的逻辑学。常见主要用途为系统升级件物品右边片段或小地图结果显示。此处力学数据集完全无关,或结果显示要求不准确,相片提前一定就会造成问题。

TG_PostPhysics

此步骤开始时力学三维已进行时,动力早就适用这两项帧的数据集。

- 此 tick 两组直通时,此帧的力学三维结果已进行时。

- 此两组可用做武器或国家主义追踪。渲染此帧时所有力学取向将位于它们的之后右方。这尤其适用做射击单人游戏中所的激光器上弹器。在此主因中所激光器束必须从枪的之后右方发出,即再显现相片提前也就会十分轻微。

n/a

处理隐藏操控、tick 世界时长Wayland、系统升级一台、系统升级关卡流送体积域和流送操控。

TG_PostUpdateWork

- 这在 TG_PostPhysics 之后直通。从以往来看,它的基变数是将最靠后的接收者送入粒子系统。

- TG_PostUpdateWork 在一台系统升级后发生。如特效必须获知一台紧贴的准确右方,可将控制这些特效的 actor 摆放于此。

- 这也可用做在帧中所绝对最靠后直通的单人游戏逻辑学,如解决格斗单人游戏中所两个片中在同相片中所尝试抓住对方的主因。

n/a

处理在此之后在帧中所创建的 actor 的提前聚合。进行时帧并渲染。

以一个单人游戏来举例说明如何适用以上列出的每种 tick 两组:在这个单人游戏中所玩家控制一个动画版 actor 进行时激光器上弹,在受到影响的点上摆放一个一般来说的上弹斜向 actor。只要激光器射向特定类型的目标静止,一个一般来说的条再就会开始填充。一个 HUD actor 将把此条结果显示在结果显示屏上。

玩家的动画版 actor 将在 TG_PrePhysics 中所快速移动和督导动画版。只能在力学在此之后进行时它的动画版设,使力学三维取向正常跟随并与之交互。

HUD 可在至多 tick 两组中所系统升级,但出于两大主因,TG_DuringPhysics 为应从。第一,TG_DuringPhysics 可要用,因为它不必要与单人游戏的力学三维激发交互或适用来自力学三维的数据集。第二,没主因一律力学三维等待 HUD 进行时系统升级,也没主因一律 HUD 等待力学三维进行时。注意到,HUD 为单人游戏后的相片。射向目标静止时,此帧一定就会反映到条中所,下相片才就会。

斜向 actor 在 TG_PostPhysics 中所系统升级。如此斜向再可获知其对一幕的追踪。因为它将在帧的再次渲染,所以它将正常显现在静止表面。它还将基于目标静止的正确右方调整条的计算。

再次,在 TG_PostUpdateWork 中所,激光器粒子特性将系统升级到上弹 actor 和斜向的再次右方

Actor Ticking 两接口引介 FTickFunction是 Actor Ticking 分派的基本单元 , 作为领导者codice_传输在 Actor / Actor Component 中所 class AActor { UPROPERTY(EditDefaultsOnly, Category=Tick) struct FActorTickFunction PrimaryActorTick}class UActorComponent { UPROPERTY(EditDefaultsOnly, Category=BrownquotComponentTick") struct FActorComponentTickFunction PrimaryComponentTick} FTickTaskLevel负责管理 Level 内所有 Tick 的单元. SetActorTickEnable / SetComponentTickEnabled 时, 就就会**将 FTickFunction 申请人到所在 Level 的 FTickTaskLevel **中所. void AActor::BeginPlay { // 省去跳转, 之后所在 Level 对应 FTickTaskLevel 将 TickFunction 添加 FTickTaskLevel* Level = TickTaskLevelForLevel(InLevel) Level-BrowngtAddTickFunction(TickFunction)}class FTickTaskLevel { // 包含这两项 Level 的所有 Tick 单元. TSetBrownltFTickFunction*> AllEnabledTickFunctions FCoolingDownTickFunctionList AllCoolingDownTickFunctions TSetBrownltFTickFunction*> AllDisabledTickFunctions TArrayWithThreadsafeAddBrownltFTickScheduleDetails> TickFunctionsToReschedule TSetBrownltFTickFunction*> NewlySpawnedTickFunctions} FTickTaskManager负责管理所有 FTickTaskLevel, 是 Tick 的负责管理单例类. class FTickTaskManager { // 负责管理所有 FTickTaskLevel TArrayBrownltFTickTaskLevel*> LevelList} Actor Ticking 分派流程 // ;大变数驱动从层级亲密关系GuardedMain(const wchar_t * CmdLine) EngineTick FEngineLoop::Tick UGameEngine::Tick(float DeltaSeconds, bool bIdleMode) UWorld::Tick(ELevelTick TickType, float DeltaSeconds) for (int32 i = 0 i < LevelCollections.Num ++i) { RunTickGroup(TG_PrePhysics) RunTickGroup(TG_StartPhysics) RunTickGroup(TG_DuringPhysics, false) RunTickGroup(TG_EndPhysics) RunTickGroup(TG_PostPhysics) RunTickGroup(TG_PostUpdateWork) RunTickGroup(TG_LastDemotable) }

UWorld 逐 Level驱动, 按照 Tick 两组顺序线程对应 Actor / Actor Component, 即 RunTickGroup(ETickingGroup Group).

Cooldown 前提

顾及不同的 Actor / Actor Component 业务一幕各不相同, 有些两接口一定就会每帧Tick, 而是可能是几秒钟或者几分钟才就会 Tick 一次, 因此 Unreal 设计了 Cooldown 前提来满足此种一幕:

基元所有 Tick 一般来说任务(O(n)), 如果时长较宽大于 0(假定并非每帧都就会线程), 就就会放到 CoolingDown 表头. 根据 Tick 较宽对临时表头排序(O(mlogm)), 基元临时表头断定到达 Tick 时长的申请加入就绪表头. 督导处于就绪表头中所的 Tick 一般来说任务. 督导结束后, 将督导完的一般来说任务更进一步放终 CoolingDown表头.

Timer Ticking

Timer Ticking 作为 Unreal 的须要器分派前提, 增值取向为 Delegate.

适用原理

线程 TimerManager 的 SetTimer 原理, 的传播只能须要督导的 Delegate 和自定义值.

/** * Sets a timer to call the given native function at a set interval. If a timer is already set * for this handle, it will replace the current timer. * * @param InOutHandle If the passed-in handle refers to an existing timer, it will be cleared before the new timer is added. A new handle to the new timer is returned in either case. * @param InObj Object to call the timer function on. * @param InTimerMethod Method to call when timer fires. * @param InRate The amount of time (in seconds) between set and firing. If FORCEINLINE void SetTimer(FTimerHandleBrown InOutHandle, UserClass* InObj, typename FTimerDelegate::TUObjectMethodDelegate::FMethodPtr InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)GetWorldTimerManager.SetTimer(SelectActorTickHandle, this, BrownampUGameplayDebuggerLocalController::OnSelectActorTick, 0.01f, bLooping) Timer Ticking 借助于前提

Timer Ticking 须要器基于瓦砾借助于, TimerManager 在每次 Tick 时从检查瓦砾顶成分, 如果到了督导时长就取出并督导, 直到条件不满足中断本次 Tick.

void FTimerManager::Tick(float DeltaTime) { while (ActiveTimerHeap.Num> 0) { // 瓦砾定须要一般来说任务到达督导时长 if (InternalTime> Top-BrowngtExpireTime) { // 督导须要一般来说任务 ActiveTimerHeap.HeapPop(CurrentlyExecutingTimer, FTimerHeapOrder(Timers), /*bAllowShrinking=*/ false) Top-BrowngtTimerDelegate.Execute } }}

Tickable Ticking

Tickable Ticking 增值取向为 C++ 类, 让位自 FTickableGameObject嵌套, 获得 Tick 控制能力.

适用原理

C++类让位FTickableGameObject, 重载 Tick 和 GetStatId 虚变数.

// 1. 让位 FTickableGameObject 嵌套classs TickableClass : public FTickableGameObject// 2. 借助于变数 Tick(float DeltaTime) 和 GetStatId// Tick 确切逻辑学virtual void Tick(float DeltaTime) override// stats 机动性统计分析埋点, 如果不希望被统计分析, return TStatId即可virtual TStatId GetStatId const override { RETURN_QUICK_DECLARE_CYCLE_STAT(TickableClass, STATGROUP_Tickables)} Tickable Ticking 借助于前提

原先 Tickable 取向调用后就会添加到单例 FTickableStatics 集合中所, FTickableGameObject 单例在每次 Tick 后基元 FTickableStatics 集合中所的所有 Tickable 取向并督导, 因此 Tickable 取向就会在每相片督导, 不能设 Tick 的时长较宽.

void FTickableGameObject::TickObjects(UWorld* World, const int32 InTickType, const bool bIsPaused, const float DeltaSeconds) { for (const FTickableObjectEntryBrown TickableEntry : Statics.TickableObjects) { TickableObject-BrowngtTick(DeltaSeconds) }} 总结

横向比较 Unreal Tick 中所 Actor Ticking / Timer Ticking / Tickable Ticking 三种借助于前提:

Actor Ticking

Timer Ticking

Tickable Ticking

借助于前提

Cooldown 前提, 以 Tick 较宽维护有序表头

以 Tick 较宽维护小顶瓦砾

无序数两组

抽出复杂度

O(1)

O(logn)

O(1)

删除复杂度

O(n)

O(n)

O(n)

Tick 复杂度

O(nlogn)

O(nlogn)

O(n)

增值取向

Actor / Actor Component

Delegate

C++类

设 Tick 时长较宽

可以

可以

不可以

特点

1. 通过设 Tick 两组, 确定 Tick 被线程的及早.

2. 可以设 Tick 之间的前驱依赖性亲密关系.

1. 组织内细化为 Delegate.

1. 每帧线程, 不能设 Tick 时长较宽.

驻马店妇科医院哪家正规
青岛妇科检查哪些项目
南京牛皮癣检查
重庆妇科医院哪家好点
泉州看白癜风哪里比较好
流鼻血
咽喉肿
皮肤性病
宝宝积食
肿瘤科

上一篇: 现在是做传统电商吃香?还是抖音杂货店无货源?两大王者如何抉择?

下一篇: 【沙发大姐】健身软件合集:大屏减肥更有效

友情链接