2010-02-26 10 views
6

Pracuję nad wersją demonstracyjną dotyczącą wykrywania kolizji. (Niektóre z tego kodu są szczegółowe here.) W trybie debugowania działa dobrze. W trybie zwolnienia jest szybszy, ale wykrywanie kolizji jest NAPRAWDĘ zaniedbane. Obiekty nie odbijają się od niczego, lub wydają się dziwnie lekko poruszane grawitacją. Niektóre obiekty eksplodują, jakby zderzyły się ze specjalnymi obiektami wybuchowymi, nawet jeśli żaden z tych obiektów nie istnieje.C# XNA Visual Studio: Różnica między trybami "wydania" i "debugowania"?

A więc ... co zmienia program Visual Studio między trybem Release a Debug, który powoduje ten problem? (Używam VS Pro 2008.)

Tajemnie, tryb wydawania działał dla wielu prac rozwojowych. Właśnie się zatrzymał.

Odpowiedz

10

Moje moce psychiczne nie są świetne i trudno jest powiedzieć, co się dzieje, bez faktycznego debugowania. Ale zgaduję. Kwestia Omówię tutaj:

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

dotyczy nie tylko „cross maszynę”, ale także do „debugowania vs uwolnienia”. Jest nie tylko możliwe, ale prawdopodobne, że wersja programu korzystającego z wersji ma wyższą precyzję matematyczną niż twoja wersja debugowania. Jeśli masz tam błędy zmiennoprzecinkowe, to jest całkiem możliwe, że tylko przez zwykły pech uderzasz w błędy tylko w wyższej precyzji wersji wydania, a nie w mniej precyzyjnej wersji debugowania.

Dlaczego różnica? Ponieważ w wersji nieoptymalizowanej kompilator C# często generuje kod dla wartości tymczasowych, tak jakby były to zmienne lokalne; jitter faktycznie przydziela tymczasowych locals na stosie i zapisuje tymczasowe wartości z rejestrów do lokalnych. Następnie, gdy ich potrzebuje, odczytuje je z powrotem do rejestrów z czasoprzestrzeni. Ta podróż może spowodować, że wartość w rejestrze precyzyjnym zostanie obcięta do zaledwie 64-bitowej precyzji, tracąc precyzję.

W wersji zoptymalizowanej kompilator C# i jitter ciężko pracują, aby wszystko w rejestrach było cały czas, ponieważ oczywiście jest to szybsza i wyższa precyzja, ale trudniejsza do debugowania.

Powodzenia. Błędy, które tylko repro w trybie zwolnienia są całkowitym bólem.

+0

Może ten wątek jest dobrym przykładem: http://stackoverflow.com/questions/2225503 –

5

Najpierw wprowadzane są dowolne życzenia #if (DEBUG) lub #if (RELEASE). Możesz mieć kod w jednym lub drugim, który powinien lub nie powinien być wywołany, więc szukaj ich.

Poza tym, domyślnie wersje kompilacji są ustawione na "optymalizacji kodu", podczas gdy debugowanie nie jest. Spróbuj zmienić to ustawienie w konfiguracji wydania (Projekt> Właściwości> Kompilacja> "Optymalizuj kod") i zobacz, czy to rozwiąże problem.

+0

Zgadzam się, jest to mało prawdopodobne. Optymalizacja .NET zabija twój kod, ale możesz mieć warunkowe pragmy w kodzie, które zmieniają ścieżkę wykonania, a co za tym idzie, zachowanie. –

1

W trybie debugowania istnieje definicja (można to potwierdzić, zaznaczając opcję "Opcje kompilacji" po kliknięciu rozwiązania prawym przyciskiem myszy i wybierając opcję "Właściwości", która może zostać użyta, można wykonać wywołania śledzenia. W trybie zwolnienia definicja jest usuwana, a zatem nie są używane żadne informacje debugowania.Jeśli miałbyś debugować ten kod zwolnienia, debugger nie będzie mógł określić, w którym wierszu (oryginalnym kodzie) był włączony, nawet jeśli podałeś lokalizację źródło jako kod jest zoptymalizowany.

co do Twojej sytuacji, może przez oczyszczaniu pośrednie pliki kompilacji w katalogu uwalnianiu lub usunąć plik .suo znaleźć w katalogu rozwiązanie może pomóc.

Mam nadzieję, że to pomoże, Pozdrawiam, Tom.

Powiązane problemy