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