C # XNA Visual Studio: разница между режимами «релиз» и «отладка»? - PullRequest
7 голосов
/ 27 февраля 2010

Я работаю над демо об обнаружении столкновений. (Часть кода для этого подробно здесь .) В режиме отладки работает нормально. В режиме Release это быстрее, но обнаружение столкновений действительно испорчено. Объекты, которые ничего не отскакивают или кажутся странным образом под действием гравитации. Некоторые объекты взрываются, как будто они столкнулись со специальными взрывными объектами, хотя ни один из этих объектов не существует.

Итак ... что Visual Studio меняет между режимом выпуска и отладки, что вызывает эту проблему? (Я использую VS Pro 2008.)

Таинственно, режим релиза работал для большого количества развития. Это совсем недавно прекратилось.

Ответы [ 3 ]

11 голосов
/ 27 февраля 2010

Мои экстрасенсорные способности не велики, и трудно понять, что происходит, фактически не отлаживая их. Но вот предположение. Вопрос, который я обсуждаю здесь:

Почему этот расчет с плавающей запятой дает разные результаты на разных машинах?

относится не только к «кросс-машине», но и к «отладке против выпуска». Это не только возможно, но и вероятно, что версия выпуска вашей программы использует более точную математику , чем ваша версия отладки. Если у вас есть ошибки с плавающей запятой, то вполне возможно, что просто по счастливой случайности вы исправляете ошибки только в версии с более высокой точностью, а не в версии с отладкой с низкой точностью.

Почему разница? Потому что в неоптимизированной версии компилятор C # часто генерирует код для временных значений, как если бы они были локальными переменными; затем джиттер фактически выделяет временные локальные объекты в стеке и записывает временные значения из регистров в локальные. Затем, когда он нуждается в них, он считывает их обратно в регистры из временных. Это путешествие может привести к тому, что значение, которое было в высокоточном регистре, будет усечено до 64-битной точности, теряя биты точности.

В оптимизированной версии компилятор C # и джиттер работают усерднее, чтобы постоянно хранить все в регистрах, потому что, очевидно, это быстрее и с большей точностью, но сложнее в отладке.

Удачи. Ошибки, которые воспроизводятся только в режиме релиза, являются общей болью.

5 голосов
/ 27 февраля 2010

Сначала вводятся любые прагмы #if (DEBUG) или #if (RELEASE). У вас может быть код в одном или другом, который должен или не должен вызываться, поэтому ищите его.

Кроме того, по умолчанию сборки выпуска настроены на «оптимизацию кода», а отладка - нет. Попробуйте изменить этот параметр в конфигурации выпуска («Проект»> «Свойства»> «Сборка»> «Оптимизировать код») и посмотреть, решит ли это проблему.

1 голос
/ 27 февраля 2010

В режиме отладки существует определенное место (вы можете подтвердить это, проверив «Параметры сборки», когда вы щелкнете правой кнопкой мыши по решению и выберите «Свойства», которые, если используются, можно выполнять вызовы трассировки. В В режиме выпуска определение удаляется, и, следовательно, отладочная информация не используется. Если вы отлаживаете этот код выпуска, отладчик не сможет определить, в какой строке (исходном коде) он находился, даже если вы указали расположение источника как код оптимизирован.

Что касается вашей ситуации, возможно, может помочь очистка промежуточных файлов сборки в каталоге выпуска или удаление файла .suo, найденного в каталоге решения.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...