Skip to content

Commit 4cf4275

Browse files
committed
Avoid allocating array per frame
1 parent dfec902 commit 4cf4275

1 file changed

Lines changed: 17 additions & 11 deletions

File tree

‎Source.Engine/ModelLoader.cs‎

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -576,20 +576,26 @@ internal void Mod_RecomputeTranslucency(Model mod, int skin, int body, object? c
576576
if ((studioHdr.Flags & StudioHdrFlags.ForceOpaque) != 0)
577577
return;
578578

579-
Span<IMaterial> materials = new IMaterial[128];
580-
int materialCount = StudioRender.GetMaterialListFromBodyAndSkin(mod.Studio, skin, body, materials);
581-
for (int i = 0; i < materialCount; i++) {
582-
if (materials[i] != null) {
583-
using MatRenderContextPtr renderContext = new(SourceDllMain.materials);
584-
renderContext.Bind(materials[i], clientRenderable);
585-
bool isTranslucent = materials[i].IsTranslucent();
586-
587-
if (isTranslucent) {
588-
mod.Flags |= ModelFlag.Translucent;
589-
break;
579+
IMaterial[] materialsArray = ArrayPool<IMaterial>.Shared.Rent(128);
580+
try {
581+
Span<IMaterial> materials = materialsArray.AsSpan(0, 128);
582+
int materialCount = StudioRender.GetMaterialListFromBodyAndSkin(mod.Studio, skin, body, materials);
583+
for (int i = 0; i < materialCount; i++) {
584+
if (materials[i] != null) {
585+
using MatRenderContextPtr renderContext = new(SourceDllMain.materials);
586+
renderContext.Bind(materials[i], clientRenderable);
587+
bool isTranslucent = materials[i].IsTranslucent();
588+
589+
if (isTranslucent) {
590+
mod.Flags |= ModelFlag.Translucent;
591+
break;
592+
}
590593
}
591594
}
592595
}
596+
finally {
597+
ArrayPool<IMaterial>.Shared.Return(materialsArray, true);
598+
}
593599
}
594600
break;
595601
}

0 commit comments

Comments
 (0)