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);
}
}