随机帧率在XNA中增加

时间:2013-02-05 16:59:57

标签: c# performance optimization xna

当我在PC上运行我的游戏(使用c#/ XNA 4.0开发)时,我遇到了随机帧率 增加 。这些增加导致游戏过程中的口吃效果它通常发生在游戏启动时,并且频繁到足以令人讨厌。

例如 - 我的FPS计数器将从62跳到85(导致轻微的口吃)然后回到62并持续在62/63 FPS之间保持3分钟然后跳到78然后再次回到62/63。 FPS很少实际降到60以下。

有关正在发生的事情的任何想法?

编辑 - 在下面添加了我的FPS代码(02.06.2013)

namespace Game
{
    class FPSDebuggerFont : Font
    {

        //int totalScore;

        //FramesPerSecond (FPS) debug variables
        int totalFrames = 0;
        int fps = 0;
        int elpaseMilliseconds = 1000;
        string fpsText;

        public FPSDebuggerFont(SpriteFont scoreFont, String text, Vector2 pos, Color color, float scale, float layerDepth)
            : base(scoreFont, text, pos, color, scale, layerDepth)
        {
        }

        public void FPSTime(GameTime gameTime)
        {
            //Algorithm for FPS debugging
            elpaseMilliseconds -= (float)gameTime.ElapsedGameTime.Milliseconds;
            if (elpaseMilliseconds < 0)
            {
                //FPS debugg info
                fps = totalFrames;
                elpaseMilliseconds = 1000;
                totalFrames = 0;
            }

        }

        public override void Update(GameTime gameTime)
        {
            FPSTime(gameTime);

        }

        public override void Draw(GameTime gameTime, SpriteBatch sB)
        {
            totalFrames++;
            fpsText = "Frames Per Second: " + fps;

            sB.DrawString(scoreFont, fpsText, pos, color, 0, Vector2.Zero, scale, SpriteEffects.None, layerDepth);

        }
    }
}

为了澄清起见,我不确定如何在不添加整个项目的情况下再添加相关代码。但我当然可以添加更多信息;和我的Game类一起,我有两个使用XNA的GameComponent功能的其他类(SpriteManager,FontManager),每个类都包含自己的Load Content,Update和Draw方法,例如下面的例子;

public class SpriteManager : Microsoft.Xna.Framework.DrawableGameComponent
{
    //Manager code
} 

public class FontManager : Microsoft.Xna.Framework.DrawableGameComponent
{
    //Manager code
}

希望这些附加信息有所帮助。

结束编辑

1 个答案:

答案 0 :(得分:1)

可能是没有看到代码的任何事情。只要您在移动计算中使用gameTime.ElapsedGameTime,它就不会导致任何卡顿问题。

例如:

sprite.Location += sprite.Velocity * (float)gameTime.ElapsedGameTime.TotalSeconds;