我正在制作一个有关碰撞检测的演示。 (这方面的一些代码很详细here https://stackoverflow.com/questions/2343789/c-xna-optimizing-collision-detection.)在调试模式下,它工作正常。在发布模式下,速度更快,但碰撞检测确实很混乱。物体不会从任何物体上反弹,或者似乎受到重力的轻微影响。有些物体会爆炸,就好像它们与特殊的爆炸物体碰撞一样,即使这些物体都不存在。
那么... Visual Studio 在发布和调试模式之间发生了什么变化导致了这个问题? (我使用的是 VS Pro 2008。)
神秘的是,发布模式一直在为大量的开发工作。最近才停止。
我的神通不太好,不实际调试很难判断到底发生了什么。但这里有一个猜测。我在这里讨论的问题:
为什么这个浮点计算在不同的机器上给出不同的结果? https://stackoverflow.com/questions/2342396/why-does-the-calculation-give-different-results-on-different-machines/2343351#2343351
不仅适用于“跨机器”,还适用于“调试与发布”。您的程序的发行版本不仅有可能而且很可能正在使用更高精度的数学比你的调试版本。如果其中存在浮点错误,那么完全有可能只是运气不好,您仅在更高精度的发行版本中遇到这些错误,而在低精度的调试版本中却没有遇到这些错误。
为什么有区别?因为在未优化的版本中,C# 编译器经常为临时值生成代码,就好像它们是局部变量一样;然后,抖动实际上在堆栈上分配临时局部变量,并将临时值从寄存器写入局部变量。然后,当需要它们时,它会将它们从临时值读回到寄存器中。该过程可能会导致高精度寄存器中的值被截断为仅 64 位精度,从而丢失精度位。
在优化版本中,C# 编译器和抖动更加努力地将所有内容始终保留在寄存器中,因为显然这更快、精度更高,但更难调试。
祝你好运。仅在发布模式下重现的错误是非常痛苦的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)