应用程序在没有评论部分的情况下无法启动(已解决)

问题描述 投票:0回答:2

我正在为我的游戏制作一个引擎,我有这段代码:

protected override void OnLoad(EventArgs e)
{
    GameTime.stopwatch.Start();
    if (GameTime.stopwatch.IsRunning)
    {
        GameTime.CallUpdate();
    }
    base.OnLoad(e);
}

如果我没有注释掉 stopwatch.Start() 或 if 语句,或者如果我只有 GameTime.CallUpdate(),则不会弹出任何应用程序窗口。我注释掉哪一个并不重要,如果两者都未注释,它就没有窗口。如果有人可以帮助我解决当我运行未注释的代码时应用程序窗口未启动的问题,请告诉我。

编辑:CallUpdate 和秒表都不是启动窗口的一部分,这增加了我的困惑

public static void CallUpdate()
{
    Debug.Write("I am here");
    while (stopwatch.IsRunning)
    {
        if (stopwatch.ElapsedMilliseconds > 120)
        {
            timeSinceUpdate = (int)stopwatch.ElapsedMilliseconds;
            Debug.Write("Updated");
            //Call update
            stopwatch.Restart();
        }
    }
}
c# game-engine game-development
2个回答
0
投票

base.OnLoad(e)
返回之前,您不会致电
GameTime.CallUpdate()

但是

CallUpdate()
方法永远不会返回。该方法中的循环一直运行,直到秒表不再运行,但没有任何东西告诉它停止。有没有可能您不应该打电话给
stopwatch.Restart()
,而应该打电话给
stopwatch.Stop()


0
投票

我建议研究一下 C# 中的 threading 主题。您提供的所有代码都在单个线程上运行,该线程也恰好是 UI 线程。

当您取消注释

GameTime.stopwatch.Start();
时,它会使
stopwatch.IsRunning
的值始终为
true
,因此循环
while (stopwatch.IsRunning)
会无限运行。因为
CallUpdate
方法永远不会完成执行,并且基
base.OnLoad(e);
永远不会被调用,并且你的窗口永远不会显示。

如何解决这个问题的一个简单例子是使用

Task.Run
,例如

protected override void OnLoad(EventArgs e)
{
    Task.Run(() => {
        GameTime.stopwatch.Start();
        if (GameTime.stopwatch.IsRunning)
        {
            GameTime.CallUpdate();
        }
    });
    base.OnLoad(e);
}

此任务在另一个线程上异步执行其内部的代码,并且不会阻塞

base.OnLoad(e);
。但是,该异步线程上仍然存在无限循环,并且您必须在某个地方停止秒表才能完成
CallUpdate
方法。

此外,线程会带来大量的处理复杂性。例如,大多数平台在尝试从非 UI 线程更新 UI 元素时需要一种称为“同步”的技术。 也许,对于您的情况,使用简单的

Timer

类可能就足够了。一切都取决于您打算如何处理您的

GameTime
    

© www.soinside.com 2019 - 2024. All rights reserved.