Skip to content

Commit 9017550

Browse files
authored
Fixes a performance issue in antimatter overlay when a player uses cams. (#1283)
1 parent 438c166 commit 9017550

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

Content.Client/_ES/Power/Antimatter/ESAntimatterOverlay.cs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Numerics;
2+
using Content.Client.Graphics;
23
using Content.Client.Light;
34
using Content.Shared._ES.Power.Antimatter.Components;
45
using Content.Shared.CCVar;
@@ -24,8 +25,7 @@ public sealed class ESAntimatterOverlay : Overlay
2425

2526
public override OverlaySpace Space => OverlaySpace.WorldSpace;
2627

27-
private IRenderTexture? _renderTarget;
28-
private IRenderTexture? _blurBuffer;
28+
private readonly OverlayResourceCache<CachedResources> _resources = new();
2929

3030
public ESAntimatterOverlay()
3131
{
@@ -47,24 +47,26 @@ protected override void Draw(in OverlayDrawArgs args)
4747

4848
var reducedMotion = _cfgManager.GetCVar(CCVars.ReducedMotion);
4949

50-
if (_renderTarget?.Texture.Size != target.Size)
50+
var res = _resources.GetForViewport(viewport, static _ => new CachedResources());
51+
52+
if (res.RenderTarget?.Texture.Size != target.Size)
5153
{
52-
_renderTarget?.Dispose();
53-
_renderTarget = _clyde.CreateRenderTarget(target.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "ambient-occlusion-target");
54+
res.RenderTarget?.Dispose();
55+
res.RenderTarget = _clyde.CreateRenderTarget(target.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "ambient-occlusion-target");
5456
}
5557

56-
if (_blurBuffer?.Texture.Size != target.Size)
58+
if (res.BlurBuffer?.Texture.Size != target.Size)
5759
{
58-
_blurBuffer?.Dispose();
59-
_blurBuffer = _clyde.CreateRenderTarget(target.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "ambient-occlusion-blur-target");
60+
res.BlurBuffer?.Dispose();
61+
res.BlurBuffer = _clyde.CreateRenderTarget(target.Size, new RenderTargetFormatParameters(RenderTargetColorFormat.Rgba8Srgb), name: "ambient-occlusion-blur-target");
6062
}
6163

6264
// Draw the texture data to the texture.
63-
args.WorldHandle.RenderInRenderTarget(_renderTarget,
65+
args.WorldHandle.RenderInRenderTarget(res.RenderTarget,
6466
() =>
6567
{
6668
worldHandle.UseShader(_proto.Index(UnshadedShader).Instance());
67-
var invMatrix = _renderTarget.GetWorldToLocalMatrix(viewport.Eye!, scale);
69+
var invMatrix = res.RenderTarget.GetWorldToLocalMatrix(viewport.Eye!, scale);
6870

6971
_antimatterSet.Clear();
7072
lookups.GetEntitiesIntersecting(mapId, worldBounds.Enlarged(2), _antimatterSet);
@@ -93,11 +95,23 @@ protected override void Draw(in OverlayDrawArgs args)
9395
var offset = !reducedMotion
9496
? _random.NextFloat(-2, 2)
9597
: 0;
96-
_clyde.BlurRenderTarget(viewport, _renderTarget, _blurBuffer, viewport.Eye!, 14f * 2 + offset);
98+
_clyde.BlurRenderTarget(viewport, res.RenderTarget, res.BlurBuffer, viewport.Eye!, 14f * 2 + offset);
9799

98-
worldHandle.DrawTextureRect(_renderTarget!.Texture, worldBounds, Color.Black);
100+
worldHandle.DrawTextureRect(res.RenderTarget!.Texture, worldBounds, Color.Black);
99101

100102
args.WorldHandle.SetTransform(Matrix3x2.Identity);
101103
args.WorldHandle.UseShader(null);
102104
}
105+
106+
private sealed class CachedResources : IDisposable
107+
{
108+
public IRenderTexture? RenderTarget = null;
109+
public IRenderTexture? BlurBuffer = null;
110+
111+
public void Dispose()
112+
{
113+
RenderTarget?.Dispose();
114+
BlurBuffer?.Dispose();
115+
}
116+
}
103117
}

0 commit comments

Comments
 (0)