mirror of
https://github.com/Facepunch/sbox-public.git
synced 2025-12-23 14:38:13 -05:00
Animgraph pose node optimizations (#3646)
* AddPoseOperation skip work when added transform is equal to identity * SubtractPoseOperation skip work when added transform is equal to identity * Fast path for BlendUpdateNode when weights are 1 Don't emit expensive pose op just forward the pose with weight 1 * Fast path for Blend2DUpdateNode when weights are 1 Don't emit expensive pose op just forward the pose with weight 1 * Avoid allocation of Actions in MergeDescendants
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace Sandbox;
|
||||
|
||||
/// <summary>
|
||||
@@ -519,8 +520,7 @@ public sealed partial class SkinnedModelRenderer : ModelRenderer, Component.Exec
|
||||
|
||||
return transformsChanged;
|
||||
}
|
||||
|
||||
internal void MergeDescendants( Action<GameTransform> transformChangedCallback = null )
|
||||
internal void MergeDescendants( ConcurrentQueue<GameTransform> changedTransforms = null )
|
||||
{
|
||||
foreach ( var child in mergeChildren )
|
||||
{
|
||||
@@ -547,9 +547,9 @@ public sealed partial class SkinnedModelRenderer : ModelRenderer, Component.Exec
|
||||
|
||||
if ( child.UpdateGameObjectsFromBones() )
|
||||
{
|
||||
if ( transformChangedCallback is not null )
|
||||
if ( changedTransforms is not null )
|
||||
{
|
||||
transformChangedCallback( child.Transform );
|
||||
changedTransforms.Enqueue( child.Transform );
|
||||
}
|
||||
else if ( ThreadSafe.IsMainThread )
|
||||
{
|
||||
@@ -557,8 +557,7 @@ public sealed partial class SkinnedModelRenderer : ModelRenderer, Component.Exec
|
||||
}
|
||||
}
|
||||
|
||||
// Recursively merge descendants of this child
|
||||
child.MergeDescendants( transformChangedCallback );
|
||||
child.MergeDescendants( changedTransforms );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -65,8 +65,8 @@ public sealed class SceneAnimationSystem : GameObjectSystem<SceneAnimationSystem
|
||||
}
|
||||
);
|
||||
|
||||
// Now merge any descendants
|
||||
System.Threading.Tasks.Parallel.ForEach( rootRenderers.Where( x => !x.BoneMergeTarget.IsValid() ), _animParallelOptions, x => x.MergeDescendants( ChangedTransforms.Enqueue ) );
|
||||
// Now merge any descendants without allocating per-merge delegates
|
||||
System.Threading.Tasks.Parallel.ForEach( rootRenderers.Where( x => !x.BoneMergeTarget.IsValid() ), _animParallelOptions, renderer => renderer.MergeDescendants( ChangedTransforms ) );
|
||||
|
||||
while ( ChangedTransforms.TryDequeue( out var tx ) )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user