Быстрое рисование нескольких 2D-текстур в XNA

У меня возникла проблема с производительностью при попытке отрисовать вместе два вида 2D-текстур в XNA (см. код ниже).

Рисуя только захваченный кадр с веб-камеры с наложенной маской, я получаю твердые 30 FPS.

Рисуя только точки Гаусса (даже если их много), я также получаю стабильно высокий FPS.

Но при объединении захваченных кадров, рамок, масок и точек Гаусса FPS падает до 15. Однако мне нужно более высокое FPS для моего приложения.

Мой вопрос в том, как я могу добиться более высокой частоты кадров (например, стабильных 30 кадров в секунду) в этом случае. Что я должен изменить?

Я озадачен одной вещью: я думал, что производительность упадет с увеличением количества прорисованных текстур2d. Однако, даже если я просто рисую рамку, маскирую и добавляю одну гауссову точку, она снижается до 15 кадров в секунду — уменьшение количества гауссовых точек 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);
    }
}

person user2716609    schedule 11.09.2013    source источник


Ответы (1)


Не могу точно сказать, в чем причина в вашем коде. Вы должны профилировать свое приложение с помощью меню «Анализ» в Visual Studio, оставить его работать на некоторое время, затем остановить его и просмотреть образец отчета о профилировании.

Затем найдите, какие места в вашем коде отмечены как горячие, как в примере ниже.

введите здесь описание изображения

person aybe    schedule 11.09.2013