Reduce ImageSharp arraypool ballooning (#6768)

Dispose images as soon as practical so we don't balloon its arraypool as much.
This commit is contained in:
metalgearsloth
2026-07-12 16:44:31 +10:00
committed by GitHub
parent 89a054696b
commit 657e9bfb2d
2 changed files with 65 additions and 34 deletions
@@ -83,27 +83,44 @@ namespace Robust.Client.ResourceManagement
metadata = RsiLoading.LoadRsiMetadata(manifestFile);
}
data.FrameCounts = RsiLoading.CalculateFrameCounts(metadata);
data.Images = RsiLoading.LoadImages(
metadata,
SixLabors.ImageSharp.Configuration.Default,
name =>
{
var texPath = data.Path / (name + ".png");
return manager.ContentFileRead(texPath);
});
Image<Rgba32>[]? images = null;
Image<Rgba32> sheet;
var sheet = RsiLoading.GenerateAtlas(
metadata,
data.FrameCounts,
data.Images,
SixLabors.ImageSharp.Configuration.Default,
out var dimensionX);
try
{
data.FrameCounts = RsiLoading.CalculateFrameCounts(metadata);
images = RsiLoading.LoadImages(
metadata,
SixLabors.ImageSharp.Configuration.Default,
name =>
{
var texPath = data.Path / (name + ".png");
return manager.ContentFileRead(texPath);
});
sheet = RsiLoading.GenerateAtlas(
metadata,
data.FrameCounts,
images,
SixLabors.ImageSharp.Configuration.Default,
out var dimensionX);
data.AtlasSheet = sheet;
data.DimX = dimensionX;
}
finally
{
if (images != null)
{
foreach (var image in images)
{
image.Dispose();
}
}
}
LoadPreTextureCommon(metadata, data);
data.AtlasSheet = sheet;
data.DimX = dimensionX;
data.LoadParameters = metadata.LoadParameters;
data.MetaAtlas = metadata.MetaAtlas;
}
@@ -392,7 +409,6 @@ namespace Robust.Client.ResourceManagement
public int DimX;
public StateReg[] AtlasList = default!;
public int[] FrameCounts = default!;
public Image<Rgba32>[] Images = default!;
public Vector2i FrameSize;
public Dictionary<RSI.StateId, Vector2i[][]> CallbackOffsets = default!;
public Texture AtlasTexture = default!;