MOAR PERF
git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1956 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -15,18 +15,19 @@ namespace OpenRa.Game
|
||||
|
||||
const int spritesPerBatch = 1024;
|
||||
|
||||
List<Vertex> vertices = new List<Vertex>();
|
||||
List<ushort> indices = new List<ushort>();
|
||||
Vertex[] vertices = new Vertex[4 * spritesPerBatch];
|
||||
ushort[] indices = new ushort[6 * spritesPerBatch];
|
||||
Sheet currentSheet = null;
|
||||
int sprites = 0;
|
||||
ShaderQuality quality;
|
||||
int nv = 0, ni = 0;
|
||||
|
||||
public SpriteRenderer(Renderer renderer, bool allowAlpha)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>(renderer.Device, 4 * spritesPerBatch, Vertex.Format);
|
||||
indexBuffer = new IndexBuffer(renderer.Device, 6 * spritesPerBatch);
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>(renderer.Device, vertices.Length, Vertex.Format);
|
||||
indexBuffer = new IndexBuffer(renderer.Device, indices.Length);
|
||||
|
||||
quality = allowAlpha ? ShaderQuality.High : ShaderQuality.Low;
|
||||
}
|
||||
@@ -37,16 +38,15 @@ namespace OpenRa.Game
|
||||
{
|
||||
renderer.DrawWithShader(quality, delegate
|
||||
{
|
||||
vertexBuffer.SetData(vertices.ToArray());
|
||||
indexBuffer.SetData(indices.ToArray());
|
||||
vertexBuffer.SetData(vertices);
|
||||
indexBuffer.SetData(indices);
|
||||
renderer.DrawBatch(vertexBuffer, indexBuffer,
|
||||
new Range<int>(0, vertices.Count),
|
||||
new Range<int>(0, indices.Count),
|
||||
new Range<int>(0, nv),
|
||||
new Range<int>(0, ni),
|
||||
currentSheet.Texture);
|
||||
});
|
||||
|
||||
vertices = new List<Vertex>();
|
||||
indices = new List<ushort>();
|
||||
nv = 0; ni = 0;
|
||||
currentSheet = null;
|
||||
sprites = 0;
|
||||
}
|
||||
@@ -58,8 +58,8 @@ namespace OpenRa.Game
|
||||
Flush();
|
||||
|
||||
currentSheet = s.sheet;
|
||||
Util.CreateQuad(vertices, indices, location, s, palette);
|
||||
|
||||
Util.FastCreateQuad(vertices, indices, location, s, palette, nv, ni);
|
||||
nv += 4; ni += 6;
|
||||
if (++sprites >= spritesPerBatch)
|
||||
Flush();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using Ijw.DirectX;
|
||||
using IjwFramework.Collections;
|
||||
|
||||
namespace OpenRa.Game
|
||||
{
|
||||
@@ -30,33 +31,32 @@ namespace OpenRa.Game
|
||||
|
||||
tileSet = new TileSet( map.TileSuffix );
|
||||
|
||||
Dictionary<TileReference, Sprite> tileMapping =
|
||||
new Dictionary<TileReference, Sprite>();
|
||||
Size tileSize = new Size( 24, 24 );
|
||||
|
||||
Size tileSize = new Size( 24, 24 );
|
||||
var tileMapping = new Cache<TileReference, Sprite>(
|
||||
x => SheetBuilder.Add(tileSet.GetBytes(x), tileSize));
|
||||
|
||||
List<Vertex> vertices = new List<Vertex>();
|
||||
List<ushort> indices = new List<ushort>();
|
||||
Vertex[] vertices = new Vertex[4 * map.Height * map.Width];
|
||||
ushort[] indices = new ushort[6 * map.Height * map.Width];
|
||||
|
||||
int nv = 0;
|
||||
int ni = 0;
|
||||
for( int j = 0 ; j < map.Height ; j++ )
|
||||
for( int i = 0 ; i < map.Width ; i++ )
|
||||
{
|
||||
TileReference tileRef = map.MapTiles[ i + map.XOffset, j + map.YOffset ];
|
||||
Sprite tile;
|
||||
for (int i = 0; i < map.Width; i++)
|
||||
{
|
||||
Sprite tile = tileMapping[map.MapTiles[i + map.XOffset, j + map.YOffset]];
|
||||
Util.FastCreateQuad(vertices, indices, 24 * new float2(i, j), tile, 0, nv, ni);
|
||||
nv += 4;
|
||||
ni += 6;
|
||||
}
|
||||
|
||||
if( !tileMapping.TryGetValue( tileRef, out tile ) )
|
||||
tileMapping.Add( tileRef, tile = SheetBuilder.Add( tileSet.GetBytes( tileRef ), tileSize ) );
|
||||
terrainSheet = tileMapping[map.MapTiles[map.XOffset, map.YOffset]].sheet;
|
||||
|
||||
terrainSheet = tile.sheet;
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>( renderer.Device, vertices.Length, Vertex.Format );
|
||||
vertexBuffer.SetData( vertices );
|
||||
|
||||
Util.CreateQuad( vertices, indices, 24 * new float2( i, j ), tile, 0 );
|
||||
}
|
||||
|
||||
vertexBuffer = new FvfVertexBuffer<Vertex>( renderer.Device, vertices.Count, Vertex.Format );
|
||||
vertexBuffer.SetData( vertices.ToArray() );
|
||||
|
||||
indexBuffer = new IndexBuffer( renderer.Device, indices.Count );
|
||||
indexBuffer.SetData( indices.ToArray() );
|
||||
indexBuffer = new IndexBuffer( renderer.Device, indices.Length );
|
||||
indexBuffer.SetData( indices );
|
||||
}
|
||||
|
||||
void Draw()
|
||||
|
||||
@@ -10,13 +10,6 @@ namespace OpenRa.Game
|
||||
{
|
||||
static class Util
|
||||
{
|
||||
static float[] channelSelect = { 0.75f, 0.25f, -0.25f, -0.75f };
|
||||
|
||||
static float2 EncodeVertexAttributes(TextureChannel channel, int paletteLine)
|
||||
{
|
||||
return new float2(paletteLine / 16.0f, channelSelect[(int)channel]);
|
||||
}
|
||||
|
||||
static float2 KLerp(float2 o, float2 d, int k)
|
||||
{
|
||||
switch (k)
|
||||
@@ -29,14 +22,6 @@ namespace OpenRa.Game
|
||||
}
|
||||
}
|
||||
|
||||
static Vertex MakeVertex(float2 o, int k, Sprite r, float2 attrib)
|
||||
{
|
||||
return new Vertex(
|
||||
KLerp( o, r.size, k ),
|
||||
r.FastMapTextureCoords(k),
|
||||
attrib);
|
||||
}
|
||||
|
||||
public static string[] ReadAllLines(Stream s)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
@@ -56,28 +41,22 @@ namespace OpenRa.Game
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void CreateQuad(List<Vertex> vertices, List<ushort> indices, float2 o, Sprite r, int palette)
|
||||
{
|
||||
ushort offset = (ushort)vertices.Count;
|
||||
float2 attrib = EncodeVertexAttributes(r.channel, palette);
|
||||
static float[] channelSelect = { 0.75f, 0.25f, -0.25f, -0.75f };
|
||||
|
||||
Vertex[] v = new Vertex[]
|
||||
{
|
||||
Util.MakeVertex(o, 0, r, attrib),
|
||||
Util.MakeVertex(o, 1, r, attrib),
|
||||
Util.MakeVertex(o, 2, r, attrib),
|
||||
Util.MakeVertex(o, 3, r, attrib),
|
||||
};
|
||||
public static void FastCreateQuad(Vertex[] vertices, ushort[] indices, float2 o, Sprite r, int palette, int nv, int ni)
|
||||
{
|
||||
float2 attrib = new float2(palette / 16.0f, channelSelect[(int)r.channel]);
|
||||
|
||||
vertices.AddRange(v);
|
||||
vertices[nv] = new Vertex(KLerp(o, r.size, 0), r.FastMapTextureCoords(0), attrib);
|
||||
vertices[nv + 1] = new Vertex(KLerp(o, r.size, 1), r.FastMapTextureCoords(1), attrib);
|
||||
vertices[nv + 2] = new Vertex(KLerp(o, r.size, 2), r.FastMapTextureCoords(2), attrib);
|
||||
vertices[nv + 3] = new Vertex(KLerp(o, r.size, 3), r.FastMapTextureCoords(3), attrib);
|
||||
|
||||
ushort[] i = new ushort[]
|
||||
{
|
||||
offset, (ushort)(offset + 1), (ushort)(offset + 2), (ushort)(offset + 1), (ushort)(offset + 3), (ushort)(offset + 2)
|
||||
};
|
||||
|
||||
indices.AddRange(i);
|
||||
}
|
||||
indices[ni] = (ushort)(nv);
|
||||
indices[ni + 1] = indices[ni + 3] = (ushort)(nv + 1);
|
||||
indices[ni + 2] = indices[ni + 5] = (ushort)(nv + 2);
|
||||
indices[ni + 4] = (ushort)(nv + 3);
|
||||
}
|
||||
|
||||
public static void FastCopyIntoChannel(Sprite dest, byte[] src)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user