尝试在XNA中一起绘制两种2D纹理时出现性能问题(参见下面的代码)。
从网络摄像头中抓取捕获的帧,并覆盖一个掩码,我得到稳定的30 FPS。
仅绘制高斯点(即使它是高点数),我也获得了很高的FPS。
但是将捕获的,帧,掩模和高斯点一起绘制,FPS降至15.但是我的应用需要更高的FPS
我的问题是,在这种情况下,如何实现更高的帧速率(如稳定的30 FPS)。我需要改变什么?
我对一件事情感到困惑:我认为随着Textures2d数量的增加,性能会下降。然而,即使我只绘制框架,遮罩并添加单个高斯点,它也直接下降到15 FPS - 不增加高斯点2d纹理的数量(即绘制的纹理总数)似乎没有差异了。所以问题必然在于将这两种不同的东西结合在一起。
任何人都可以帮忙!
非常感谢!
// 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);
}
}
答案 0 :(得分:0)
无法确定代码中的原因是什么。您应该使用Visual Studio中的“分析”菜单来分析您的应用程序,让它运行一段时间然后停止它并查看“样本分析报告”。
然后查找代码中的哪些地方被标记为热门,如下例所示。