3

我正在编写一些使用 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%。我认为有更好的方法可以做到这一点,但我正在努力弄清楚该怎么做。任何人都可以为此提供任何建议吗?

4

0 回答 0