2010-02-26 11 views
6

Ich arbeite an einer Demo über Kollisionserkennung. (Ein Teil des Codes dafür ist detailliert here.) Im Debug-Modus funktioniert es gut. Im Release-Modus ist es schneller, aber die Kollisionserkennung ist wirklich durcheinander. Objekte, die nichts abprallen lassen oder durch die Schwerkraft seltsam beeinflusst zu sein scheinen. Einige Objekte explodieren, als wären sie mit den speziellen explosiven Objekten kollidiert, obwohl keines dieser Objekte existiert.C# XNA Visual Studio: Unterschied zwischen "Release" und "Debug" -Modi?

Also ... Was ändert Visual Studio zwischen Release und Debug-Modus, die dieses Problem verursacht? (Ich benutze VS Pro 2008.)

Mysteriöserweise hatte Release-Modus für eine Menge Entwicklung gearbeitet. Es hat gerade erst aufgehört.

Antwort

10

Meine psychischen Kräfte sind nicht großartig, und es ist schwer zu sagen, was passiert, ohne es tatsächlich zu debuggen. Aber hier ist eine Vermutung. Die Frage, die ich hier diskutieren:

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

gilt nicht nur für "Cross-Maschine", sondern auch "debug vs release". Es ist nicht nur möglich, aber wahrscheinlich, dass die Release-Version Ihres Programms höhere Genauigkeit Mathematik als Ihre Debug-Version verwendet. Wenn Sie dort Gleitkomma-Bugs haben, ist es durchaus möglich, dass Sie nur durch Pech die Bugs nur in der höherpräzisen Release-Version und nicht in der weniger präzisen Debug-Version treffen.

Warum der Unterschied? Da der C# -Compiler in der nicht optimierten Version häufig Code für temporäre Werte generiert, als wären es lokale Variablen; Der Jitter weist dann temporäre Zwischenspeicher auf dem Stapel zu und schreibt die temporären Werte aus den Registern in die lokalen Variablen. Dann, wenn es sie braucht, liest es sie aus den Provisorien in die Register zurück. Diese Reise kann dazu führen, dass der Wert, der in dem Hochpräzisionsregister enthalten war, auf eine Genauigkeit von nur 64 Bits verkürzt wird, wodurch Genauigkeitsanteile verloren gehen.

In der optimierten Version arbeiten der C# -Compiler und der Jitter härter, um alles in Registern die ganze Zeit zu behalten, denn das ist natürlich schneller und höhere Präzision, obwohl schwieriger zu debuggen.

Viel Glück. Bugs, die nur im Release-Modus repro- duzieren, sind ein absoluter Schmerz.

+0

Vielleicht ist dieser Thread ein gutes Beispiel: http://stackoverflow.com/questions/2225503 –

5

Zuerst werden alle Pragmate #if (DEBUG) oder #if (RELEASE) eingegeben. Sie haben möglicherweise Code in der einen oder anderen, die aufgerufen werden sollte oder nicht, also suchen Sie nach denen.

Darüber hinaus sind Release-Builds standardmäßig auf "Code optimieren" eingestellt, während Debuggen nicht aktiviert ist. Versuchen Sie, diese Einstellung in Ihrer Release-Konfiguration zu ändern (Projekt> Eigenschaften> Erstellen> "Code optimieren") und sehen Sie, ob das Problem dadurch gelöst wird.

+0

Einverstanden, es ist unwahrscheinlich, .NET-Optimierung tötet Ihren Code, aber Sie haben möglicherweise Pragma-Bedingungen in Ihrem Code, die den Ausführungspfad und damit das Verhalten ändern. –

1

Im Debug-Modus gibt es eine Definition, (Sie können dies überprüfen, indem Sie die 'Build Options' anklicken, wenn Sie mit der rechten Maustaste auf die Lösung klicken und 'Eigenschaften' auswählen. Falls verwendet, können Sie die Trace-Aufrufe ausführen. Im Freigabemodus wird die Definition entfernt und es werden keine Debugging - Informationen verwendet.Wenn Sie diesen Freigabecode debuggen, kann der Debugger nicht feststellen, in welcher Zeile (Originalcode) er sich befand, selbst wenn Sie den Speicherort der Datei angegeben haben Quelle als der Code optimiert ist.

wie für Ihre Situation, vielleicht durch die Zwischen Build-Dateien in dem Freigabe-Verzeichnis Ausräumen oder die .suo Datei in der Lösung Verzeichnis entfernen könnte helfen.

Hoffe, das hilft, Mit freundlichen Grüßen, Tom.

Verwandte Themen