Merge pull request #8387 from RoosterDragon/one-temp-buffer

Create only one scratch vertex buffer for rendering
This commit is contained in:
Paul Chote
2015-06-17 18:19:28 +00:00
5 changed files with 13 additions and 29 deletions

View File

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

View File

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

View File

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

View File

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

View File

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