我正在编写一些使用 D3D11(用于 WinRT 应用程序的 SharpDX)绘制 2D 精灵的代码。所有这些都有效,但速度并不快。这是我正在使用的一些代码:
// Setup local variables
var d3dDevice = App.deviceManager.DeviceDirect3D;
var d3dContext = App.deviceManager.ContextDirect3D;
var vertices = SharpDX.Direct3D11.Buffer.Create(App.deviceManager.DeviceDirect3D, BindFlags.VertexBuffer, new[]
{
// Position Colour UV
x0 - OFFSET, y0 - OFFSET, 0.0f, 1.0f , 1.0f, 1.0f, 1.0f, 1.0f, u, v,
x1 - OFFSET, y1 - OFFSET, 0.0f, 1.0f , 1.0f, 1.0f, 1.0f, 1.0f, u2, v,
x3 - OFFSET, y3 - OFFSET, 0.0f, 1.0f , 1.0f, 1.0f, 1.0f, 1.0f, u, v2,
x2 - OFFSET, y2 - OFFSET, 0.0f, 1.0f , 1.0f, 1.0f, 1.0f, 1.0f, u2, v2,
});
textureView = new ShaderResourceView( App.deviceManager.DeviceDirect3D, texture );
// Setup the pipeline
d3dContext.InputAssembler.SetVertexBuffers( 0, vertexBufferBinding );
d3dContext.InputAssembler.InputLayout = layout;
d3dContext.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
d3dContext.VertexShader.SetConstantBuffer( 0, constantBuffer );
d3dContext.VertexShader.Set( vertexShader );
d3dContext.PixelShader.Set( pixelShader );
if( textureView != null )
d3dContext.PixelShader.SetShaderResource( 0, textureView );
// Draw the quad
d3dContext.Draw( 4, 0 );
屏幕上渲染的每个精灵都会调用此代码。我不能保证每个精灵的寿命。他们可能在下一帧的相同位置或不同的位置。可以有更多,也可以更少。根据我的分析器,在渲染大量精灵时,SharpDX.Direct3D11.Buffer.Create 占用了整个帧的 50%。我认为有更好的方法可以做到这一点,但我正在努力弄清楚该怎么做。任何人都可以为此提供任何建议吗?