C#XNA Visual Studio:“发布”和“调试”模式之间的区别?

时间:2010-02-26 23:36:03

标签: c# visual-studio-2008 xna

我正在开发一个关于碰撞检测的演示。 (其中一些代码是详细的here。)在调试模式下,它工作正常。在释放模式下,它更快,但碰撞检测真的搞砸了。物体没有任何反弹,或者似乎被引力奇怪地轻微影响。有些物体爆炸,好像它们与特殊爆炸物体相撞,即使这些物体都不存在。

那么...... Visual Studio在Release和Debug模式之间改变了什么导致了这个问题呢? (我正在使用VS Pro 2008。)

神秘的是,发布模式一直在努力进行大量的开发。它刚刚停止了。

3 个答案:

答案 0 :(得分:11)

我的精神力量不是很好,而且如果没有实际调试就很难分辨出发生了什么。但这是一个猜测。我在这里讨论的问题:

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

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

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

在优化版本中,C#编译器和抖动更难以将所有内容保存在寄存器中,因为显然更快更高精度,但更难以调试。

祝你好运。只在发布模式下重现的错误是一种痛苦。

答案 1 :(得分:5)

首先,输入任何#if(DEBUG)或#if(RELEASE)编译指示。您可能在应该或不应该调用的一个或另一个中包含代码,因此请搜索这些代码。

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

答案 2 :(得分:1)

使用调试模式,有一个定义,(您可以通过在右键单击解决方案时选中'构建选项'并选择'属性'来确认,如果使用,则可以发出跟踪调用。在发布模式下,删除了define,因此没有使用调试信息。如果你要调试那个版本代码,即使你指定了源代码的位置,调试器也无法告诉它是什么行(原始代码)因为代码已经过优化。

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

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