Lazily allocate sheet builder in ModelRenderer.

Avoid allocating the sheet builder each frame until it is needed. For mods that do not need to render models, this avoids allocating a large buffer and backing sheet as it will never render to the sheet. For mods that do render models, but don't need any this frame, this avoids allocating a new SheetBuilder that will not be used.
This commit is contained in:
RoosterDragon
2017-11-17 18:49:12 +00:00
committed by abcdefg30
parent ec84b61316
commit c75a866f0d

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Graphics
readonly Stack<KeyValuePair<Sheet, IFrameBuffer>> unmappedBuffers = new Stack<KeyValuePair<Sheet, IFrameBuffer>>(); readonly Stack<KeyValuePair<Sheet, IFrameBuffer>> unmappedBuffers = new Stack<KeyValuePair<Sheet, IFrameBuffer>>();
readonly List<Pair<Sheet, Action>> doRender = new List<Pair<Sheet, Action>>(); readonly List<Pair<Sheet, Action>> doRender = new List<Pair<Sheet, Action>>();
SheetBuilder sheetBuilder; SheetBuilder sheetBuilderForFrame;
public ModelRenderer(Renderer renderer, IShader shader) public ModelRenderer(Renderer renderer, IShader shader)
{ {
@@ -163,8 +163,11 @@ namespace OpenRA.Graphics
CalculateSpriteGeometry(tl, br, 1, out spriteSize, out spriteOffset); CalculateSpriteGeometry(tl, br, 1, out spriteSize, out spriteOffset);
CalculateSpriteGeometry(stl, sbr, 2, out shadowSpriteSize, out shadowSpriteOffset); CalculateSpriteGeometry(stl, sbr, 2, out shadowSpriteSize, out shadowSpriteOffset);
var sprite = sheetBuilder.Allocate(spriteSize, 0, spriteOffset); if (sheetBuilderForFrame == null)
var shadowSprite = sheetBuilder.Allocate(shadowSpriteSize, 0, shadowSpriteOffset); sheetBuilderForFrame = new SheetBuilder(SheetType.BGRA, AllocateSheet);
var sprite = sheetBuilderForFrame.Allocate(spriteSize, 0, spriteOffset);
var shadowSprite = sheetBuilderForFrame.Allocate(shadowSpriteSize, 0, shadowSpriteOffset);
var sb = sprite.Bounds; var sb = sprite.Bounds;
var ssb = shadowSprite.Bounds; var ssb = shadowSprite.Bounds;
var spriteCenter = new float2(sb.Left + sb.Width / 2, sb.Top + sb.Height / 2); var spriteCenter = new float2(sb.Left + sb.Width / 2, sb.Top + sb.Height / 2);
@@ -279,9 +282,6 @@ namespace OpenRA.Graphics
foreach (var kv in mappedBuffers) foreach (var kv in mappedBuffers)
unmappedBuffers.Push(kv); unmappedBuffers.Push(kv);
mappedBuffers.Clear(); mappedBuffers.Clear();
sheetBuilder = new SheetBuilder(SheetType.BGRA, AllocateSheet);
doRender.Clear();
} }
IFrameBuffer EnableFrameBuffer(Sheet s) IFrameBuffer EnableFrameBuffer(Sheet s)
@@ -303,6 +303,8 @@ namespace OpenRA.Graphics
public void EndFrame() public void EndFrame()
{ {
sheetBuilderForFrame = null;
if (doRender.Count == 0) if (doRender.Count == 0)
return; return;
@@ -325,6 +327,8 @@ namespace OpenRA.Graphics
if (fbo != null) if (fbo != null)
DisableFrameBuffer(fbo); DisableFrameBuffer(fbo);
doRender.Clear();
} }
public Sheet AllocateSheet() public Sheet AllocateSheet()