-
Notifications
You must be signed in to change notification settings - Fork 12
Description
Packaged build crashes during seamless travel when a Rive widget/state machine is active (UE 5.5.4). Disappear when Rive is excluded.
Environment
- Unreal Engine: 5.5.4 (Win64)
- Builds: Development + Shipping (Game target)
- RHI: DX12
- Project: C++
- Rive plugin:
0.3.10a-gh - OS: Windows 11
Summary
When performing seamless travel, packaged builds sometimes crash with various errors stemming from Rive widget/artboard/state machines.
If we disable/remove Rive, all crashes go away under the same flow.
We cannot reproduce any of the crashes in Editor/PIE.
It always happens on seamless travel transitions and appears related to async functions in the Rive widgets not being cleaned up appropriately.
Crash logs (representative)
A) Rive runtime while advancing state machine
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: === Critical error: ===
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0xffffffffffffffff
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff66fd8dd2e RadbotEngine.exe!rive::Path::buildPath() [C:\Development\Work\rive\packages\runtime\src\shapes\path.cpp:176]
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff66fd031d6 RadbotEngine.exe!rive::Artboard::updatePass() [C:\Development\Work\rive\packages\runtime\src\artboard.cpp:942]
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff66fd32027 RadbotEngine.exe!rive::StateMachineInstance::advanceAndApply() [C:\Development\Work\rive\packages\runtime\src\animation\state_machine_instance.cpp:1768]
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff67a9844fb RadbotEngine.exe!FRiveStateMachine::Advance() [C:\Git\RadbotEngine\Plugins\Rive\Source\Rive\Private\Rive\RiveStateMachine.cpp:113]
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff67a997111 RadbotEngine.exe!URiveArtboard::Tick_StateMachine() [C:\Git\RadbotEngine\Plugins\Rive\Source\Rive\Private\Rive\RiveArtboard.cpp:925]
[2025.09.28-09.21.51:871][ 59]LogWindows: Error: [Callstack] 0x00007ff67a996c7e RadbotEngine.exe!URiveTextureObject::Tick() [C:\Git\RadbotEngine\Plugins\Rive\Source\Rive\Private\Rive\RiveTextureObject.cpp:97]
B) DX12 descriptor allocator assert during transition
[2025.09.28-09.14.55:278][993]LogWindows: Error: appError called: Assertion failed: Range.Start < Range.End
[File:D:\build++UE5\Sync\Engine\Source\Runtime\D3D12RHI\Private\D3D12Descriptors.cpp] [Line: 419]
C) Async loader crash (packaged only)
[2025.09.28-09.19.01:969][949]LogThreadingWindows: Error: Runnable thread FAsyncLoadingThread crashed.
[2025.09.28-09.19.01:969][949]LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x00000270148c1ad0
[2025.09.28-09.19.01:969][949]LogWindows: Error: [Callstack] 0x00007ff778dd5a76 RadbotEngine.exe!TSet<UClass *>::TryReplaceExisting() []
[2025.09.28-09.19.01:970][949]LogWindows: Error: [Callstack] 0x00007ff778b43f52 RadbotEngine.exe!FAsyncPackage2::EventDrivenSerializeExport() []
[2025.09.28-09.19.01:970][949]LogWindows: Error: [Callstack] 0x00007ff778b7bdda RadbotEngine.exe!FAsyncLoadingThread2::Run() []
D) Bad cleanup / teardown (input bindings destroyed during GC)
[2025.09.28-09.12.15:020][369]LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0xffffffffffffffff
[2025.09.28-09.12.15:020][369]LogWindows: Error: [Callstack] 0x00007ff7806b58a3 RadbotEngine.exe!DestructItems<TUniquePtr<FEnhancedInputActionEventBinding,TDefaultDelete<FEnhancedInputActionEventBinding>>,int>() []
[2025.09.28-09.12.15:020][369]LogWindows: Error: [Callstack] 0x00007ff7806bf05a RadbotEngine.exe!UEnhancedInputComponent::`vector deleting destructor'() []
[2025.09.28-09.12.15:020][369]LogWindows: Error: [Callstack] 0x00007ff778c65df0 RadbotEngine.exe!FObjectPurge::DestroyObjects() []
Always packaged, never editor
- None of these reproduce in PIE/Editor.
- All disappear if we exclude Rive from the transition scene (no Rive widget/state machine tick).
Initialization Flow
-
Construction hook
OnInitializedfires for the widget instance (UMG lifecycle entry point). -
Ready callback registration
Bind the widget’sOnReadydelegate so post-asset initialization runs when the Rive backend reports readiness. -
Asset resolution
Query the Rive asset for the target Artboard, then resolve a ViewModel (prefer by name, fallback by index). This yields the authoring-time template, not a runtime instance. -
Validation gate
Guard withIsValid(ViewModel)to avoid instantiating a null/redirected resource. -
Instance creation
CallCreateDefaultInstance(ViewModel)to allocate the runtime StateMachine/Animation instance (mutable, tickable). -
Widget binding
Assign the authoring object viaSetViewModel(...)and the runtime instance viaSetViewModelInstance(...)so the widget renders/ticks the correct live object. -
Focus policy
SetIsFocusable = trueso the control participates in CommonUI/Slate focus and consumes input as needed.
Observations
- Crashes are timing-dependent and correlate with level travel while Rive is advancing/ticking.
- Given the
rive::Path::buildPathstack plus the DX12 assert, we suspect size/lifetime races (e.g., advancing while render resources/layout are 0-sized or being torn down).
What we tried
- Reinstalled the Rive plugin (
0.3.10a-gh). - Reproduces only in packaged builds; Editor never crashes.
- Completely removing the Rive widget/artboard from the transition scene stabilizes the build.
Requests / Questions
- Are there recommended initialization and teardown hooks to ensure async functionality is fully cleaned up (e.g., suspend on
PreLoadMap, resume afterPostLoadMapWithWorld)? - Any known pitfalls or required guards around state machine advance during seamless travel?
Happy to provide
- Small repro project (menu → transition scene with this widget → seamless travel)
- Symbolized crash dumps
Thanks for looking!