@@ -20,6 +20,11 @@ private struct RenderInfo
2020 /// </summary>
2121 public SkinnedMeshRenderer renderer ;
2222
23+ /// <summary>
24+ /// The render cache
25+ /// </summary>
26+ public RenderCache cache ;
27+
2328 /// <summary>
2429 /// The current position of the object
2530 /// </summary>
@@ -36,9 +41,16 @@ private struct RenderInfo
3641 public ushort viewID ;
3742 }
3843
44+ private class RenderCache
45+ {
46+ public Matrix4x4 [ ] boneMatrices ;
47+
48+ public VertexBuffer boneBuffer ;
49+ }
50+
3951 private readonly ExpandableContainer < RenderInfo > renderers = new ( ) ;
4052
41- private readonly Dictionary < int , Matrix4x4 [ ] > cachedBoneMatrices = [ ] ;
53+ private readonly Dictionary < int , RenderCache > renderCache = [ ] ;
4254
4355 public void Startup ( )
4456 {
@@ -94,23 +106,39 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
94106
95107 renderer . animator ??= new ( entity , EntityQueryMode . Parent , false ) ;
96108
109+ var animator = renderer . animator . Content ;
110+ var mesh = renderer . mesh ;
111+ var meshAsset = mesh . meshAsset ;
112+
113+ Matrix4x4 [ ] boneMatrices ;
114+
115+ if ( renderCache . TryGetValue ( meshAsset . Guid . GetHashCode ( ) , out var cache ) == false )
116+ {
117+ boneMatrices = new Matrix4x4 [ meshAsset . BoneCount ] ;
118+
119+ cache = new ( )
120+ {
121+ boneMatrices = boneMatrices ,
122+ } ;
123+
124+ renderCache . Add ( meshAsset . Guid . GetHashCode ( ) , cache ) ;
125+ }
126+ else
127+ {
128+ boneMatrices = cache . boneMatrices ;
129+ }
130+
97131 renderers . Add ( new ( )
98132 {
99133 renderer = renderer ,
134+ cache = cache ,
100135 position = transform . Position ,
101136 transform = transform . Matrix ,
102137 viewID = viewId
103138 } ) ;
104139
105- var animator = renderer . animator . Content ;
106- var mesh = renderer . mesh ;
107- var meshAsset = mesh . meshAsset ;
108- var meshAssetMesh = meshAsset . meshes [ mesh . meshAssetIndex ] ;
109-
110140 var useAnimator = animator != null && animator . evaluator != null ;
111141
112- Matrix4x4 [ ] boneMatrices ;
113-
114142 if ( useAnimator )
115143 {
116144 if ( ( animator ? . cachedBoneMatrices ? . Length ?? 0 ) == 0 )
@@ -120,25 +148,21 @@ public void Process((Entity, Transform, IComponent)[] entities, Camera activeCam
120148
121149 boneMatrices = animator . cachedBoneMatrices ;
122150 }
123- else if ( cachedBoneMatrices . TryGetValue ( meshAsset . Guid . GetHashCode ( ) , out boneMatrices ) == false )
151+ else
124152 {
125- boneMatrices = new Matrix4x4 [ meshAsset . BoneCount ] ;
126-
127- cachedBoneMatrices . Add ( meshAsset . Guid . GetHashCode ( ) , boneMatrices ) ;
128-
129153 UpdateBoneMatrices ( meshAsset , boneMatrices , meshAsset . nodes ) ;
130154 }
131155
132- if ( useAnimator == false && ( renderer . boneMatrixBuffer ? . Disposed ?? true ) )
156+ if ( useAnimator == false && ( cache . boneBuffer ? . Disposed ?? true ) )
133157 {
134- renderer . boneMatrixBuffer = VertexBuffer . CreateDynamic ( new VertexLayoutBuilder ( )
158+ cache . boneBuffer = VertexBuffer . CreateDynamic ( new VertexLayoutBuilder ( )
135159 . Add ( VertexAttribute . TexCoord0 , 4 , VertexAttributeType . Float )
136160 . Add ( VertexAttribute . TexCoord1 , 4 , VertexAttributeType . Float )
137161 . Add ( VertexAttribute . TexCoord2 , 4 , VertexAttributeType . Float )
138162 . Add ( VertexAttribute . TexCoord3 , 4 , VertexAttributeType . Float )
139163 . Build ( ) , RenderBufferFlags . ComputeRead , true , ( uint ) boneMatrices . Length ) ;
140164
141- renderer . boneMatrixBuffer . Update ( boneMatrices . AsSpan ( ) , 0 , true ) ;
165+ cache . boneBuffer . Update ( boneMatrices . AsSpan ( ) , 0 , true ) ;
142166 }
143167 }
144168 }
@@ -165,6 +189,7 @@ public void Submit()
165189 foreach ( var pair in renderers . Contents )
166190 {
167191 var renderer = pair . renderer ;
192+ var cache = pair . cache ;
168193 var mesh = renderer . mesh ;
169194 var meshAsset = mesh . meshAsset ;
170195 var animator = renderer . animator . Content ;
@@ -228,14 +253,9 @@ public void Submit()
228253 bgfx . DiscardFlags . IndexBuffer |
229254 bgfx . DiscardFlags . Transform ;
230255
231- if ( useAnimator )
232- {
233- animator . boneMatrixBuffer ? . SetBufferActive ( 15 , Access . Read ) ;
234- }
235- else
236- {
237- renderer . boneMatrixBuffer ? . SetBufferActive ( 15 , Access . Read ) ;
238- }
256+ var buffer = useAnimator ? animator . boneMatrixBuffer : cache . boneBuffer ;
257+
258+ buffer ? . SetBufferActive ( 15 , Access . Read ) ;
239259
240260 bgfx . submit ( pair . viewID , program , 0 , ( byte ) flags ) ;
241261 }
0 commit comments