代码之家  ›  专栏  ›  技术社区  ›  John

UWP已初始化多次

  •  1
  • John  · 技术社区  · 8 年前

    我用MonoGame为UWP开发了一款游戏。在这个项目中,我遇到了一个 重大问题

    在发布应用程序之前,我没有意识到这一点,因为这只发生在发布构建模式下,而且由于构建时间较长,我没有在该模式下进行测试。我已经确保应用程序在我自己的设备上以及模拟器上都能正常运行,但当我从商店下载时,应用程序在启动时崩溃了,所以我决定开始分析。

    我终于把它装进去了 释放模式 并对其进行了调试,并在两个App.xaml中放置了几个断点。cs和GamePage.xaml.cs。我注意到这些断点被以不合逻辑的顺序命中,前后跳跃,甚至跳过代码行。甚至静态布尔值也被忽略了等等。

    这个问题与MonoGame无关,因为我可以用一个空白应用程序(通用Windows)重新创建相同的问题。如何 :

    1. 创建新的空白应用程序(通用Windows)
    2. 创建一个需要很长时间才能执行的方法,并在MainPage构造函数中调用它(请参阅下面我的测试方法)。
    3. 在两个App.xaml中设置断点。cs和MainPage.xaml。cs(实际上在每条线路上)
    4. 在调试模式下测试应用程序,以便我们可以比较

    当发布版本多次运行重型方法时,调试版本只运行一次重型方法。这可能是由某种超时异常引起的,而超时异常又是由MainPage的长时间初始化引起的。

    我的测试方法(我知道这不是一种用来衡量性能的方法,但无论如何它确实起到了作用):

    Random r=new Random();
    while (true)
            {
                if (r.Next(100000) == 100)
                    break;
            }
    

    有人知道如何绕过这一点吗?或者为什么会发生这种情况?

    我也在community.monogame.net上发布了这篇文章。如有帮助,请提前表示感谢!

    1 回复  |  直到 8 年前
        1
  •  2
  •   Community CDub    4 年前

    当您构建并运行“ 调试 “配置,您正在运行 IL代码 针对

    当您切换到“ 释放 “模式,默认情况下您的应用程序使用 .NET本机工具链 。由于包被编译为本机二进制文件,因此包不需要包含.NET框架库。此外,软件包取决于最新安装的 .NET本机运行时 而不是CoreCLR包。设备上的.NET Native运行时将始终与您的应用程序包兼容。

    在发布模式下测试很重要。

    有关更多信息,请参阅 .NET Native – What it means for Universal Windows Platform (UWP) developers .

    除了.NET Native工具链之外,另一个重要区别是,默认情况下,发布配置会优化代码,从而丢失一些用于调试的工件。因此,尝试调试Release配置可能会导致一些问题。

    需要注意的是,默认情况下,发布配置是完全优化的代码(例如。 code inlining 将在许多地方应用)。这些优化将对调试体验产生重大影响,包括

    为了绕过这一点,我们可以创建一个自定义配置,并为该配置启用.NETNative工具链。确保不要优化代码。有关更多详细信息,请参见 Debugging .NET Native Windows Universal Apps .

    与在我的测试中一样,如果我没有启用“优化代码”,那么发布模式下的行为与调试模式下的相同。此外,在构造函数中进行繁重的初始化并不是一个好的实践。您可以在其他地方启动初始化,例如页面加载后等。