2010-02-26 5 views
6

Estoy trabajando en una demostración sobre la detección de colisiones. (Parte del código para esto se detalla en here). En el modo de depuración, funciona bien. En el modo de lanzamiento, es más rápido, pero la detección de colisiones está realmente mal. Los objetos no rebotan nada, o parecen verse ligeramente afectados por la gravedad. Algunos objetos explotan, como si chocaran con los objetos explosivos especiales, a pesar de que ninguno de esos objetos existe.C# XNA Visual Studio: ¿Diferencia entre los modos "liberar" y "eliminar errores"?

Entonces ... ¿qué cambia Visual Studio entre Release y Debug mode que causa este problema? (Estoy usando VS Pro 2008.)

Misteriosamente, el modo de lanzamiento había estado trabajando para un montón de desarrollo. Recientemente se detuvo.

Respuesta

10

Mis poderes psíquicos no son geniales, y es difícil saber qué está pasando sin depurarlo realmente. Pero aquí hay una conjetura. La cuestión discuto aquí:

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

se aplica no sólo para "transversal de la máquina", sino también a "depuración vs liberación". No solo es posible sino también probable que la versión de lanzamiento de su programa esté usando matemática de mayor precisión que su versión de depuración. Si tienes errores de punto flotante allí, es completamente posible que solo por pura mala suerte estés atacando los errores solo en la versión de lanzamiento de mayor precisión y no en la versión de depuración de menor precisión.

¿Por qué la diferencia? Debido a que en la versión no optimizada, el compilador de C# genera con frecuencia código para valores temporales como si fueran variables locales; el jitter entonces realmente asigna locals temporales en la pila, y escribe los valores temporales de los registros a los locales. Luego, cuando los necesita, los vuelve a leer en los registros de los temporales. Ese viaje puede hacer que el valor que estaba en el registro de alta precisión quede truncado a una mera precisión de 64 bits, perdiendo bits de precisión.

En la versión optimizada, el compilador C# y el jitter trabajan más duro para mantener todo en registros todo el tiempo, porque obviamente es más rápido y de mayor precisión, aunque es más difícil de depurar.

Buena suerte. Los errores que solo repro en el modo de lanzamiento son un dolor total.

+0

Quizás este hilo sea un buen ejemplo: http://stackoverflow.com/questions/2225503 –

5

Primero, se ingresan los pragmas #if (DEBUG) o #if (RELEASE). Puede tener un código en uno u otro que deba o no ser llamado, así que búsquelo.

Más allá de eso, de forma predeterminada las compilaciones de versión están configuradas para "optimizar el código", mientras que Debug no lo está. Intenta cambiar esa configuración en la configuración de lanzamiento (Proyecto> Propiedades> Compilar> "Optimizar código") y ver si eso resuelve el problema.

+0

De acuerdo, es poco probable. La optimización .NET está matando a su código, pero puede tener pragma condicionales en su código que están cambiando la ruta de ejecución y, por lo tanto, el comportamiento. –

1

Con el modo de depuración, hay una definición en su lugar, (puede confirmarlo marcando 'Opciones de compilación' cuando haga clic derecho en la solución y seleccione 'Propiedades' que si se utiliza, puede emitir las llamadas de rastreo. En el modo de lanzamiento, se elimina la definición y, por lo tanto, no se utiliza información de depuración. Si depurara ese código de versión, el depurador no podrá decir en qué línea (código original) estaba, incluso si especificó la ubicación del fuente que se optimiza el código.

en cuanto a su situación, tal vez por la limpieza de los archivos de generación intermedios en el directorio de versión o eliminar el archivo .suo encuentra en el directorio solución podría ayudar.

Espero que esto ayude, Saludos cordiales, Tom.

Cuestiones relacionadas