0

XNA で 2 種類の 2D テクスチャを一緒に描画しようとすると、パフォーマンスの問題が発生します (以下のコードを参照)。

マスクを重ねた状態でウェブカメラからキャプチャしたフレームだけを描画すると、30 FPS という安定した結果が得られます。

ガウス ドットだけを描画すると (ドットの数が多くても)、しっかりとした高い FPS も得られます。

しかし、キャプチャ、フレーム、マスク、およびガウス ドットを一緒に描画すると、FPS は 15 に低下します。ただし、アプリケーションにはより高い FPS が必要です。

私の質問は、この場合、どのようにしてより高いフレーム レート (安定した 30 FPS など) を達成できるかということです。何を変更する必要がありますか?

私はあることに困惑しています: 描画される Textures2d の数が増えるとパフォーマンスが低下すると思っていました。ただし、フレームを描画し、マスクして単一のガウス ドットを追加しただけでも、15 FPS まで直接低下します。ガウス ドット 2D テクスチャの数 (つまり、描画されるテクスチャの総数) を減らしても、もう差。したがって、問題はこれら 2 つの異なるものを組み合わせることにあるに違いありません。

誰でも助けてくれますか!

どうもありがとう!

// if residual is enabled, blend the video with the mask
if (configPanel.GetResidualEnabled())
{
    // Turn alpha blending on
    GraphicsDevice.BlendState = BlendState.Additive;

    Texture2D frame = configPanel.GetFrame();

    // Set the channels to write to the R, G, B channels 
    // and draw the first texture using a sprite batch
    spriteBatch.Draw(frame, new Rectangle(
                           0, 0, graphics.PreferredBackBufferWidth, 
                           graphics.PreferredBackBufferHeight),
                           new Rectangle(0, 0, frame.Width, frame.Height), 
                           Color.White, 0.0f, 
                           new Vector2(0, 0), myEffect, 0.0f);

    // Set channels to alpha only, and draw the alpha mask
    spriteBatch.Draw(configPanel.GetMask(), new Vector2(0, 0), Color.White);



    GraphicsDevice.BlendState = BlendState.Opaque;
}
// render the gaussian dots
if (configPanel.GetgaussianDotsEnabled())
{
    Texture2D gaussianDotTexture = configPanel.GetgaussianDot();

    foreach (GaussianDot gaussianDot in configPanel.GetGaussianDotList())
    {
        // Draw the gaussianDot with the correct amount of transparency 
        // and shift them by 1/2 of gaussianDot's size
        if (!configPanel.GetHorizontalFlip())
            spriteBatch.Draw(gaussianDotTexture, 
                        new Vector2(gaussianDot.centreX - 
                        gaussianDotTexture.Width / 2, 
                        gaussianDot.centreY - 
                        gaussianDotTexture.Height / 2), 
                        Color.White * gaussianDot.alpha);
        // if the box is checked, flip the horizontal by shifting the centres
        else
            spriteBatch.Draw(configPanel.GetgaussianDot(), 
                        new Vector2(graphics.PreferredBackBufferWidth - 
                        (gaussianDot.centreX + gaussianDotTexture.Width / 2), 
                        gaussianDot.centreY - gaussianDotTexture.Height / 2), 
                        Color.White * gaussianDot.alpha);
    }
}
4

1 に答える 1