sideeffects / HoudiniEngineForUnreal-v2

Houdini Engine Plugin for Unreal Engine 4 - Version 2
http://www.sidefx.com/unreal
Other
295 stars 76 forks source link

Fetal in load soft object by Houdini when GC is working #127

Closed mi2think closed 3 years ago

mi2think commented 3 years ago

In my scene, we have HoudiniAssetActor,when switch to other maps, then fetal. Fetal message is Illegal call to StaticFindObject() while collecting garbage!

The callstack as below:

UE4Editor-CoreUObject.dll!StaticFindObject(UClass ObjectClass, UObject InObjectPackage, const wchar_t OrigInName, bool ExactClass) [Inline Frame] UE4Editor-CoreUObject.dll!FindObject(UObject ) UE4Editor-CoreUObject.dll!FSoftObjectPath::ResolveObjectInternal(const wchar_t PathString) UE4Editor-CoreUObject.dll!FSoftObjectPath::ResolveObjectInternal() [Inline Frame] UE4Editor-HoudiniEngineRuntime.dll!TPersistentObjectPtr::Get() [Inline Frame] UE4Editor-HoudiniEngineRuntime.dll!FSoftObjectPtr::Get() UE4Editor-HoudiniEngineRuntime.dll!FSoftObjectPtr::LoadSynchronous() [Inline Frame] UE4Editor-HoudiniEngineRuntime.dll!TSoftObjectPtr::LoadSynchronous() [Inline Frame] UE4Editor-HoudiniEngineRuntime.dll!UHoudiniInputHoudiniAsset::GetHoudiniAssetComponent() UE4Editor-HoudiniEngineRuntime.dll!UHoudiniInput::GetBounds() UE4Editor-HoudiniEngineRuntime.dll!UHoudiniAssetComponent::GetAssetBounds(UHoudiniInput IgnoreInput, const bool & bIgnoreGeneratedLandscape) UE4Editor-HoudiniEngineRuntime.dll!UHoudiniAssetComponent::CalcBounds(const FTransform & LocalToWorld) UE4Editor-Engine.dll!USceneComponent::UpdateBounds() UE4Editor-Engine.dll!UPrimitiveComponent::UpdateBounds() UE4Editor-Engine.dll!USceneComponent::PropagateTransformUpdate(bool bTransformChanged, EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport) UE4Editor-Engine.dll!USceneComponent::UpdateComponentToWorldWithParent(USceneComponent Parent, FName SocketName, EUpdateTransformFlags UpdateTransformFlags, const FQuat & RelativeRotationQuat, ETeleportType Teleport) UE4Editor-Engine.dll!USceneComponent::UpdateComponentToWorld(EUpdateTransformFlags UpdateTransformFlags, ETeleportType Teleport) UE4Editor-Engine.dll!USceneComponent::DetachFromComponent(const FDetachmentTransformRules & DetachmentRules) UE4Editor-Engine.dll!USceneComponent::OnComponentDestroyed(bool bDestroyingHierarchy) UE4Editor-Engine.dll!UActorComponent::BeginDestroy() UE4Editor-CoreUObject.dll!UObject::ConditionalBeginDestroy() UE4Editor-CoreUObject.dll!UnhashUnreachableObjects(bool bUseTimeLimit, float TimeLimit) UE4Editor-CoreUObject.dll!CollectGarbageInternal(EObjectFlags KeepFlags, bool bPerformFullPurge) UE4Editor-CoreUObject.dll!CollectGarbage(EObjectFlags KeepFlags, bool bPerformFullPurge) UE4Editor-UnrealEd.dll!UEditorEngine::Cleanse(bool ClearSelection, bool Redraw, const FText & TransReset) UE4Editor-UnrealEd.dll!UEditorEngine::EditorDestroyWorld(FWorldContext & Context, const FText & CleanseText, UWorld NewWorld) UE4Editor-UnrealEd.dll!UEditorEngine::Map_Load(const wchar_t Str, FOutputDevice & Ar) UE4Editor-UnrealEd.dll!UEditorEngine::HandleMapCommand(const wchar_t Str, FOutputDevice & Ar, UWorld InWorld) UE4Editor-UnrealEd.dll!UEditorEngine::Exec(UWorld InWorld, const wchar_t Stream, FOutputDevice & Ar) UE4Editor-UnrealEd.dll!UUnrealEdEngine::Exec(UWorld InWorld, const wchar_t * Stream, FOutputDevice & Ar) UE4Editor-UnrealEd.dll!FEditorFileUtils::LoadMap(const FString & InFilename, bool LoadAsTemplate, const bool bShowProgress)

From call stack you can see it happens when destory actor component when destory old map.

The direct issue is UpdateBounds CALL UHoudiniAssetComponent::CalcBounds, which lead to load a soft object, that is forbidden when GC is working.

So I wonder many people should have this problem, or just my way of using Houdini is something wrong?

Any suggestions?