In game sessions when the value for world time becomes large enough we start running into floating point precision issues. These issues can easily be seen in materials which do periodic animation based on View.Time. Also, things like UPrimitiveComponent::GetLastRenderTime() become imprecise also since they use floats, not doubles even though UWorld::GetTimeSeconds() returns a double.
The issues can be worse on some platforms that use -ffast-math and lower float precision (halfs) in shaders. In these cases the precision issues are usually noticeable after 3600+ seconds, but on most platforms the float precision is noticeable after 24+hrs
Resetting UWorld's time periodically is not really viable since there are patterns in the engine which assume it doesn't wrap.
For example:
float GetTimeRemaining(float WorldTime) const
{
float Duration = GetDuration();
return (Duration == FGameplayEffectConstants::INFINITE_DURATION ? -1.f : Duration - (WorldTime - StartWorldTime));
}
Workarounds include:
Steps to Reproduce
Leave a single game session running for a very long time
An example of the precision issue with WPO using the attached project (also see video):
[/Script/Engine.WorldSettings] MinUndilatedFrameTime=0.000001 MaxUndilatedFrameTime=0.4 MinGlobalTimeDilation=0.00001 MaxGlobalTimeDilation=10000.0
Expected
The animation doesn't stutter when the world time exceeds 24+ hours
Actual
The animation stutters due to float precision degrading over time
There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-373131 in the post.
| 0 |
| Component | UE - Rendering - Architecture - Materials |
|---|---|
| Affects Versions | 5.7 |
| Created | Apr 8, 2026 |
|---|---|
| Updated | Apr 13, 2026 |