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:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user