【问题标题】:C# XNA Visual Studio: Difference between "release" and "debug" modes?C# XNA Visual Studio:“发布”和“调试”模式之间的区别?
【发布时间】:2010-02-26 23:36:02
【问题描述】:

我正在制作一个关于碰撞检测的演示。 (其中的一些代码是详细的here。)在调试模式下,它工作正常。在发布模式下,它更快,但碰撞检测真的很混乱。物体不会反弹,或者似乎受到重力的轻微影响。有些物体会爆炸,就好像它们与特殊的爆炸物体发生碰撞一样,即使这些物体都不存在。

那么……Vis​​ual Studio 在发布模式和调试模式之间有何变化会导致此问题? (我使用的是 VS Pro 2008。)

神秘的是,发布模式一直在为大量开发工作。它最近才停止。

【问题讨论】:

    标签: c# visual-studio-2008 xna


    【解决方案1】:

    我的精神力量不是很大,如果不实际调试它,很难知道发生了什么。但这里有一个猜测。我在这里讨论的问题:

    Why does this floating-point calculation give different results on different machines?

    不仅适用于“跨机器”,还适用于“调试与发布”。您的程序的发布版本不仅可能而且很可能使用比调试版本更高精度的数学。如果你有浮点错误,那么完全有可能只是运气不好,你只会在更高精度的版本中遇到错误,而不是在低精度的调试版本中。

    为什么不一样?因为在未优化的版本中,C# 编译器经常为临时值生成代码,就好像它们是局部变量一样;然后抖动实际上在堆栈上分配临时局部变量,并将临时值从寄存器写入局部变量。然后,当它需要它们时,它会将它们读回临时寄存器中。该过程可能会导致高精度寄存器中的值被截断为仅 64 位精度,从而丢失位精度。

    在优化后的版本中,C# 编译器和抖动会更加努力地将所有内容始终保存在寄存器中,因为显然这样更快且精度更高,但更难调试。

    祝你好运。仅在发布模式下重现的错误非常痛苦。

    【讨论】:

      【解决方案2】:

      首先,输入任何#if(DEBUG) 或#if(RELEASE) pragma。您可能有一个或另一个代码应该或不应该被调用,所以搜索那些。

      除此之外,默认情况下,发布版本设置为“优化代码”,而调试不是。尝试在您的发布配置中更改该设置(项目>属性>构建>“优化代码”)并查看是否可以解决问题。

      【讨论】:

      • 同意,.NET 优化不太可能会杀死您的代码,但您的代码中可能有编译指示条件,它们正在改变执行路径并因此改变行为。
      【解决方案3】:

      在调试模式下,有一个定义,(您可以通过检查“构建选项”来确认这一点,当您右键单击解决方案并选择“属性”时,如果使用,您可以发出跟踪调用。在发布模式,定义被删除,因此不使用调试信息。如果您要调试该发布代码,即使您指定了源代码的位置,调试器也无法判断它在哪一行(原始代码)随着代码的优化。

      至于您的情况,也许通过清除发布目录中的中间构建文件或删除解决方案目录中的 .suo 文件可能会有所帮助。

      希望这会有所帮助, 最好的祝福, 汤姆。

      【讨论】:

        猜你喜欢
        • 2011-03-22
        • 1970-01-01
        • 2019-10-22
        • 2012-10-07
        • 1970-01-01
        • 2011-07-17
        • 2016-12-16
        相关资源
        最近更新 更多