Optimize memory alloc on Animated Model init

This commit is contained in:
Wojtek Figat
2025-06-06 22:41:29 +02:00
parent 091f76bbf2
commit d95cd2f0be
3 changed files with 13 additions and 39 deletions

View File

@@ -86,7 +86,8 @@ void AnimatedModel::PreInitSkinningData()
{
if (!SkinnedModel || !SkinnedModel->IsLoaded())
return;
PROFILE_CPU();
PROFILE_MEM(Animations);
ScopeLock lock(SkinnedModel->Locker);
SetupSkinningData();
@@ -96,28 +97,30 @@ void AnimatedModel::PreInitSkinningData()
// Get nodes global transformations for the initial pose
GraphInstance.NodesPose.Resize(nodesCount, false);
auto nodesPose = GraphInstance.NodesPose.Get();
for (int32 nodeIndex = 0; nodeIndex < nodesCount; nodeIndex++)
{
Matrix localTransform;
skeleton.Nodes[nodeIndex].LocalTransform.GetWorld(localTransform);
const int32 parentIndex = skeleton.Nodes[nodeIndex].ParentIndex;
if (parentIndex != -1)
GraphInstance.NodesPose[nodeIndex] = localTransform * GraphInstance.NodesPose[parentIndex];
nodesPose[nodeIndex] = localTransform * nodesPose[parentIndex];
else
GraphInstance.NodesPose[nodeIndex] = localTransform;
nodesPose[nodeIndex] = localTransform;
}
GraphInstance.Invalidate();
GraphInstance.RootTransform = skeleton.Nodes[0].LocalTransform;
GraphInstance.RootTransform = nodesCount > 0 ? skeleton.Nodes[0].LocalTransform : Transform::Identity;
// Setup bones transformations including bone offset matrix
Array<Matrix> identityMatrices; // TODO: use shared memory?
identityMatrices.Resize(bonesCount, false);
Matrix3x4* output = (Matrix3x4*)_skinningData.Data.Get();
const SkeletonBone* bones = skeleton.Bones.Get();
for (int32 boneIndex = 0; boneIndex < bonesCount; boneIndex++)
{
auto& bone = skeleton.Bones[boneIndex];
identityMatrices.Get()[boneIndex] = bone.OffsetMatrix * GraphInstance.NodesPose[bone.NodeIndex];
auto& bone = bones[boneIndex];
Matrix identityMatrix = bone.OffsetMatrix * nodesPose[bone.NodeIndex];
output[boneIndex].SetMatrixTranspose(identityMatrix);
}
_skinningData.SetData(identityMatrices.Get(), true);
_skinningData.OnDataChanged(true);
UpdateBounds();
UpdateSockets();
@@ -586,6 +589,7 @@ void AnimatedModel::SyncParameters()
}
else
{
PROFILE_MEM(Animations);
ScopeLock lock(AnimationGraph->Locker);
// Clone the parameters