From b9c618329a50b91ca1ccd9067a679de1388f53dd Mon Sep 17 00:00:00 2001 From: Walters Date: Mon, 19 Apr 2021 17:08:15 -0700 Subject: [PATCH 1/3] Customer PR. Released unused raw asset data in EmotionFX asset to reclaim memory after asset initialization --- .../EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp | 3 ++- .../Code/Source/Integration/Assets/AnimGraphAsset.cpp | 1 + Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 6 ++++++ .../Code/Source/Integration/Assets/MotionAsset.cpp | 1 + .../Code/Source/Integration/Assets/MotionSetAsset.cpp | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index d0b24cb203..4a20190630 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -68,6 +68,8 @@ namespace EMotionFX &actorSettings, ""); + assetData->ReleaseEmotionFXData(); + if (!assetData->m_emfxActor) { AZ_Error("EMotionFX", false, "Failed to initialize actor asset %s", asset.ToString().c_str()); @@ -77,7 +79,6 @@ namespace EMotionFX assetData->m_emfxActor->SetIsOwnedByRuntime(true); // Note: Render actor depends on the mesh asset, so we need to manually create it after mesh asset has been loaded. - return static_cast(assetData->m_emfxActor); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 82bb487d2e..3dd9621420 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,6 +90,7 @@ namespace EMotionFX } } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast(assetData->m_emfxAnimGraph); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 2936076258..4e7f1c984f 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -36,6 +36,12 @@ namespace EMotionFX : AZ::Data::AssetData(id) {} + void ReleaseEmotionFXData() + { + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); + } + AZStd::vector m_emfxNativeData; }; diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index 6bcc572ec6..5acbf5b4f7 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -47,6 +47,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index f437cea256..3fe6e0c395 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -232,6 +232,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); + assetData->ReleaseEmotionFXData(); return true; } From 1ef7d5c14b66b3a1865cd0aaef941b2b81db45a4 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Wed, 21 Apr 2021 09:46:06 -0700 Subject: [PATCH 2/3] updating based on feedback --- Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp | 2 +- .../Code/Source/Integration/Assets/AnimGraphAsset.cpp | 2 +- Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 5 ++--- .../EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp | 2 +- .../Code/Source/Integration/Assets/MotionSetAsset.cpp | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index 4a20190630..518db289e2 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -68,7 +68,7 @@ namespace EMotionFX &actorSettings, ""); - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); if (!assetData->m_emfxActor) { diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 3dd9621420..a8b9746789 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,7 +90,7 @@ namespace EMotionFX } } - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast(assetData->m_emfxAnimGraph); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 4e7f1c984f..9b174c0620 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -36,10 +36,9 @@ namespace EMotionFX : AZ::Data::AssetData(id) {} - void ReleaseEmotionFXData() + void ReleaseEMotionFXData() { - m_emfxNativeData.clear(); - m_emfxNativeData.shrink_to_fit(); + m_emfxNativeData = {}; } AZStd::vector m_emfxNativeData; diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index 5acbf5b4f7..2d95066b13 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -47,7 +47,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index 3fe6e0c395..a49dd95986 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -232,7 +232,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); - assetData->ReleaseEmotionFXData(); + assetData->ReleaseEMotionFXData(); return true; } From 53b29cbca50daf045fe0ddf715e1edd825c98e48 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Thu, 22 Apr 2021 16:36:47 -0700 Subject: [PATCH 3/3] updating based on feedback --- Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 9b174c0620..ca0f6d996d 100644 --- a/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -38,7 +38,8 @@ namespace EMotionFX void ReleaseEMotionFXData() { - m_emfxNativeData = {}; + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); } AZStd::vector m_emfxNativeData;