我正在使用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
附加信息:未将对象引用设置为对象的实例。
据我所知,参考"主持人"游戏领域。
答案 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);
}