Create only one scratch vertex buffer for rendering.

Previously several buffers were created but only one was ever used.
This commit is contained in:
RoosterDragon
2015-05-20 20:02:23 +01:00
parent 1651bd817b
commit 1e60a0ca76
5 changed files with 13 additions and 29 deletions

View File

@@ -56,12 +56,11 @@ namespace OpenRA.Graphics
renderer.Device.SetBlendMode(BlendMode.Alpha); renderer.Device.SetBlendMode(BlendMode.Alpha);
shader.Render(() => shader.Render(() =>
{ {
var vb = renderer.GetTempVertexBuffer();
vb.SetData(vertices, nv);
renderer.SetLineWidth(LineWidth); renderer.SetLineWidth(LineWidth);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList); renderer.DrawBatch(vertices, nv, PrimitiveType.LineList);
}); });
renderer.Device.SetBlendMode(BlendMode.None); renderer.Device.SetBlendMode(BlendMode.None);
nv = 0; nv = 0;
} }
} }

View File

@@ -32,12 +32,7 @@ namespace OpenRA.Graphics
if (nv > 0) if (nv > 0)
{ {
renderer.Device.SetBlendMode(BlendMode.Alpha); renderer.Device.SetBlendMode(BlendMode.Alpha);
shader.Render(() => shader.Render(() => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList));
{
var vb = renderer.GetTempVertexBuffer();
vb.SetData(vertices, nv);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
});
renderer.Device.SetBlendMode(BlendMode.None); renderer.Device.SetBlendMode(BlendMode.None);
nv = 0; nv = 0;

View File

@@ -32,9 +32,8 @@ namespace OpenRA.Graphics
internal IGraphicsDevice Device { get; private set; } internal IGraphicsDevice Device { get; private set; }
internal int SheetSize { get; private set; } internal int SheetSize { get; private set; }
internal int TempBufferSize { get; private set; } internal int TempBufferSize { get; private set; }
internal int TempBufferCount { get; private set; }
readonly Queue<IVertexBuffer<Vertex>> tempBuffers = new Queue<IVertexBuffer<Vertex>>(); readonly IVertexBuffer<Vertex> tempBuffer;
readonly Stack<Rectangle> scissorState = new Stack<Rectangle>(); readonly Stack<Rectangle> scissorState = new Stack<Rectangle>();
SheetBuilder fontSheetBuilder; SheetBuilder fontSheetBuilder;
@@ -57,7 +56,6 @@ namespace OpenRA.Graphics
if (!serverSettings.Dedicated) if (!serverSettings.Dedicated)
{ {
TempBufferSize = graphicSettings.BatchSize; TempBufferSize = graphicSettings.BatchSize;
TempBufferCount = graphicSettings.NumTempBuffers;
SheetSize = graphicSettings.SheetSize; SheetSize = graphicSettings.SheetSize;
} }
@@ -70,8 +68,7 @@ namespace OpenRA.Graphics
RgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba")); RgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba"));
SpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp")); SpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp"));
for (var i = 0; i < TempBufferCount; i++) tempBuffer = Device.CreateVertexBuffer(TempBufferSize);
tempBuffers.Enqueue(Device.CreateVertexBuffer(TempBufferSize));
} }
static Size GetResolution(GraphicSettings graphicsSettings) static Size GetResolution(GraphicSettings graphicsSettings)
@@ -157,6 +154,12 @@ namespace OpenRA.Graphics
Device.Present(); Device.Present();
} }
public void DrawBatch(Vertex[] vertices, int numVertices, PrimitiveType type)
{
tempBuffer.SetData(vertices, numVertices);
DrawBatch(tempBuffer, 0, numVertices, type);
}
public void DrawBatch<T>(IVertexBuffer<T> vertices, public void DrawBatch<T>(IVertexBuffer<T> vertices,
int firstVertex, int numVertices, PrimitiveType type) int firstVertex, int numVertices, PrimitiveType type)
where T : struct where T : struct
@@ -178,11 +181,6 @@ namespace OpenRA.Graphics
public Size Resolution { get { return Device.WindowSize; } } public Size Resolution { get { return Device.WindowSize; } }
internal IVertexBuffer<Vertex> GetTempVertexBuffer()
{
return tempBuffers.Peek();
}
public interface IBatchRenderer { void Flush(); } public interface IBatchRenderer { void Flush(); }
public IBatchRenderer CurrentBatchRenderer public IBatchRenderer CurrentBatchRenderer
@@ -259,9 +257,7 @@ namespace OpenRA.Graphics
{ {
Device.Dispose(); Device.Dispose();
WorldVoxelRenderer.Dispose(); WorldVoxelRenderer.Dispose();
foreach (var buffer in tempBuffers) tempBuffer.Dispose();
buffer.Dispose();
tempBuffers.Clear();
if (fontSheetBuilder != null) if (fontSheetBuilder != null)
fontSheetBuilder.Dispose(); fontSheetBuilder.Dispose();
} }

View File

@@ -37,12 +37,7 @@ namespace OpenRA.Graphics
shader.SetTexture("DiffuseTexture", currentSheet.GetTexture()); shader.SetTexture("DiffuseTexture", currentSheet.GetTexture());
renderer.Device.SetBlendMode(currentBlend); renderer.Device.SetBlendMode(currentBlend);
shader.Render(() => shader.Render(() => renderer.DrawBatch(vertices, nv, PrimitiveType.QuadList));
{
var vb = renderer.GetTempVertexBuffer();
vb.SetData(vertices, nv);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
});
renderer.Device.SetBlendMode(BlendMode.None); renderer.Device.SetBlendMode(BlendMode.None);
nv = 0; nv = 0;

View File

@@ -89,7 +89,6 @@ namespace OpenRA
public int MaxFramerate = 60; public int MaxFramerate = 60;
public int BatchSize = 8192; public int BatchSize = 8192;
public int NumTempBuffers = 8;
public int SheetSize = 2048; public int SheetSize = 2048;
public string Language = "english"; public string Language = "english";