MonoGame窗口在拖动时冻结

时间:2016-07-19 20:21:37

标签: c# xna monogame

我正在使用MonoGame进行联网游戏,并且每当拖动窗口时都会遇到游戏冻结的问题。在搜索解决方案时,我发现this answer描述了如何注入自定义滴答系统。

但是,虽然此答案适用于XNA,但所需的反射调用会在MonoGame中引发异常。有没有人有一个替代解决方案,允许游戏在被拖动时继续更新?

抛出异常的代码部分是:

// Exception on this line
object host = typeof(Game).GetField("host", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this);
host.GetType().BaseType.GetField("Suspend", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(host, null);
host.GetType().BaseType.GetField("Resume", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(host, null);

例外情况如下:

  

未处理的类型' System.NullReferenceException'发生在CardCatacombs.exe

     

附加信息:未将对象引用设置为对象的实例。

据我所知,参考"主持人"游戏领域。

2 个答案:

答案 0 :(得分:0)

通过在项目的引用中导入System.Windows.Forms程序集并忽略为XNA提供的答案的反射组件来解决此问题,因为MonoGame不再使用" host"游戏中的领域。

感谢Sahuagin的支持。

答案 1 :(得分:0)

根据其他答案,并使用System.Timers.Timer代替System.Windows.Forms.Timer

public class MyGame : Game {
   bool manualTick;
   int manualTickCount = 0;
   Timer mTimer;

   public MyGame() {
      mTimer = new Timer {
         Interval = (int)(TargetElapsedTime.TotalMilliseconds)
      };

      mTimer.Elapsed += (s, e) => {
         if (manualTickCount > 2) {
            manualTick = true;
            Debug.Print("manual tick");
            Tick();
            manualTick = false;
         }

         manualTickCount++;
      };

      // required to prevent exception on exit
      // otherwise the timer keeps running after the window closes
      Exiting += (s, e) => mTimer.Dispose();

      // it might be needed to do something similar in the Dispose event
      // if the game can be disposed without exiting
   }

   // the constructor is too early to start the timer, so put it in initialize
   protected override void Initialize() {
      mTimer.Start();
      base.Initialize();
   }

   // and lastly, in Update
   protected override void Update(GameTime pGameTime) {
      if (!manualTick) {
         manualTickCount = 0;
         Debug.Print("not manual");
      }
      base.Update(pGameTime);
   }