【问题标题】:C# XNA always IsRunningSlowlyC# XNA 总是 IsRunningSlowly
【发布时间】:2012-02-11 22:47:57
【问题描述】:
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace proj
{
    public class game : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        public static SpriteBatch sprite_batch;
        public static Texture2D texture;

        public game()
        {
            graphics = new GraphicsDeviceManager(this);
        }

        protected override void Initialize()
        {
            graphics.PreferredBackBufferWidth = 300;
            graphics.PreferredBackBufferHeight = 300;
            graphics.ApplyChanges();
            Content.RootDirectory = "Content";
            sprite_batch = new SpriteBatch(GraphicsDevice);
            texture = Content.Load<Texture2D>("a"); // 1 x 1, white
            base.Initialize();
        }

        protected override void Update(GameTime game_time)
        {
            base.Update(game_time);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);
            sprite_batch.Begin();
            if (gameTime.IsRunningSlowly)
            {
                sprite_batch.Draw(texture,
                    new Rectangle(50, 50, 200, 200), Color.OrangeRed);
            }
            sprite_batch.End();
            base.Draw(gameTime);
        }
    }
}

对我来说,橙色方块几乎一直可见,但几乎什么都没有发生。

60 不更新和 60 不绘制任何内容,使得应该发生 120 个几乎是空的函数调用,并且他们有一整秒钟的时间来执行此操作以使程序不会“运行缓慢”,但 gameTime.IsRunningSlowly 几乎返回 True一直都在。

我确信我的计算机足够快,可以更好地处理这个问题,这是怎么回事?我需要能够使用 gameTime.IsRunningSlowly,如果它不能正常工作,我就不能。

【问题讨论】:

  • 这不是标准的基本游戏模板,你还有其他东西要包装代码吗?我打开了一个全新的游戏项目并复制了您在 Initialize 和 Draw 中的实际代码片段,但我没有得到相同的体验。事实上,如果我在绘制橙色方块的线上设置一个断点,它不会因为让我开心 5 分钟而受到打击。
  • 我现在没有任何问题,也没有更改任何代码。这既令人沮丧又非常好。
  • 也许您的病毒防护运行较早并占用了您的系统资源?这样的事情可能会导致您的系统开始运行缓慢,从而导致游戏运行缓慢。
  • 也许吧。我的系统设置为不会自动发生这样的事情,而是提示我,这样我就可以接受当我不做任何其他事情时,不要使用虚拟内存,因为它有大量的真实内存等......我不认为这是系统的其余部分。也许关于我如何初始化事物的某些事情会产生间歇性故障。不过,我看不出我初始化事物的方式有什么问题。

标签: c# performance xna rendering


【解决方案1】:

什么都不做。问题会神奇地自行解决!

说真的,IsRunningSlowly 不应该对您撒谎。在基本游戏项目中,除非系统资源稀缺,否则它永远不应该返回 True。如果它一直返回 True,那么我建议您查看一下正在运行的其他进程。

IsRunningSlowly 是从一开始就存在的 XNA 框架功能之一,虽然您可能会发现一些边缘情况,会暴露一些奇怪的错误,报告不正确,但不太可能。

我建议重新启动电脑,然后重试。如果问题仍然存在,您将不得不在启动时开始检查其他进程正在使用系统资源或评估您当前的硬件设置(并且您不需要太多的空游戏项目以 60 FPS 运行, XNA 默认)

【讨论】:

  • 似乎是这样 :¬) 也许微软在我不在的时候推出了一次隐形更新:¬P
  • 是的,我认为它可能是 Andras :) 很难抗拒,因为在这种情况下这是正确的答案!
  • 那里',我的答案不那么轻浮了。
  • @George 我最后删除了评论,因为 +1 和勾号(SO 的伟大之处 - 你不能与社区争论)!你知道吗——这可能是第一次,也可能是唯一一次“什么都不做”的答案实际上是正确的——对你有好处!我能听到 Jon Skeet 的膝盖敲击声! :)
【解决方案2】:

将此行添加到 game() 构造函数。这应该使游戏调用更新尽可能频繁。

                 this.IsFixedTimeStep = false;

【讨论】:

  • 谢谢,但我不希望它尽可能地更新。我对 60(F,U)PS 很满意。此外,尽管没有改变任何东西,但它似乎已经以某种方式解决了自己的问题,尽管它没有改变任何东西。见上面的评论。
【解决方案3】:

我也有同样的问题。游戏运行缓慢,但几乎没有使用电脑的资源 我在我的代码中注意到我被游戏开始拖累了。它会落后一秒钟并留在那里。这很难调试,因为像断点这样的任何东西都会触发游戏运行缓慢的字段。

我最终通过使用外部计时器并将其与游戏中的计时器进行比较来追踪问题。我有类似的结果

在游戏中/实时 1/2 5/6 10/11

所以游戏在开始时输了一秒,但随后运行良好。

很可能有一个正确的方法来启动游戏和加载资源,可以避免这个问题

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多