Short description from Licensee (attached UDN has more info):
When streaming a level in and/or out (out especially in World Partition due to the bRequireFullVisibilityToRender variable usage) there is a gap during which actors and components can have their ticks registered, but they won't tick due to Level->bVisible being false (checked in FTickTaskManager::StartFrame (FTickTaskManager::FillLevelList specifically)). The issue however is that if another actor (in another, visible, level) has an actor from one of these non-visible levels as a prereq it will still queue its tick that frame (as the logic to queue a prereq only checks that the tick is registered). Given the code I think this is unexpected, both in that stats about how many things are ticking will be wrong (since AllTickFunctions does NOT contain everything that will tick) and it will allow actors (again only if they are prereqs to actors in other levels) in the non-visible level to tick. Also, (going back to the crash) if the prereq function that is queued has a cooldown (non-zero tick interval) and you are using concurrent queuing (which is the default on the platform we are crashing on) this will actually crash as RescheduleForIntervalParallel will be called on an FTickTaskLevel that never had ReserveTickFunctionCooldowns called on it (so the ArrayMax is 0, causing the AddThreadsafe in RescheduleForIntervalParallel to throw 100% of the time as it requires the array is preallocated).

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-197643 in the post.

Login to Vote

CreatedOct 11, 2023
UpdatedFeb 13, 2024