Antecedentes: Estoy utilizando DirectX 9.0 Managed Libraries para transformar matrices de puntos 3d en coordenadas de pantalla 2d. Para velocidad utilizo los métodos UnsafeNativeMethods para hacer todas las transformaciones.Por qué este código arroja System.ExecutionEngineException
El problema: Si se utiliza la función de mi línea de recorte a medida mi solicitud muere sin lanzar ninguna excepción, me tomó un tiempo para averiguar que estaba lanzando un inalcanzableSystem.ExecutionEngineException
. Lo he reducido a suceder debido a las dos últimas líneas de mi función de recorte.
List<Vector3> verticesAfterClipping = new List<Vector3>;
public unsafe void ClipLine(Line lineToClip)
{
this.verticesAfterClipping.Clear();
// Clipping algorithm happens here... (this is psuedo-code of what it does)
foreach(Vertex in lineToClip.Vertices)
{
bool thisIsClipped = // Set to whether this vertex is clipped
bool lastWasClipped = // Set to whether last vertex was clipped
if(thisIsClipped == false && lastWasClipped == true)
{
verticesAfterClipping.Add(/* intersection on clipping plane */);
verticesAfterClipping.Add(/* thisVertex */);
}
else if (thisIsClipped == false && lastWasClipped == false)
{
verticesAfterClipping.Add(/* thisVertex */);
}
else if (thisIsClipped == true && lastWasClipped == false)
{
verticesAfterClipping.Add(/* intersection on clipping plane */);
}
}
// THIS IS WHERE BAD THINGS HAPPEN
lineToClip.Vertices = new Vertex[verticesAfterClipping.Count];
verticesAfterClipping.CopyTo(lineToClip.Vertices, 0);
}
Cuando la lista de verticesAfterClipping
se copia en el lineToClip
vértices del objeto lineToClip
se pasa entonces a un UnsafeNativeMethod que transforma estos vértices a los vértices 2D. De todo lo que puedo ver cuando lo paso en el modo de depuración funciona completamente bien, hasta que simplemente muere.
Simplemente no puedo entender lo que está mal. Cualquier ayuda sería muy apreciada.
Tiene razón cuando dice que la excepción no ocurre en esas dos líneas, pero ocurre como RESULTADO de esas dos líneas. Reemplacé esas líneas y usé otro buffer temporal para copiar vértices recortados y todo está funcionando bien ahora.Supuse que se producía algún tipo de violación de acceso a la memoria bajo las cubiertas cuando la línea se pasaba a métodos inseguros de directx nativo. – tbridge
No asuma que la ausencia de ExecutionEngineException significa que el problema se ha ido. Simplemente puede ser que el CLR ya no lo detecte. Al reemplazar esas líneas, es posible que ahora se encuentre en una situación en la que los datos se corrompen, pero ya no obtiene una excepción. (El CLR no garantiza ni puede garantizar tirar ExecutionEngineException en cualquier momento en que algo así salga mal. Solo lo lanza cuando se da cuenta.) Así que estaría preocupado. Definitivamente estaría tratando de llegar al fondo de * cómo * se produjo el bloqueo, como ahora, no hay motivo para estar seguro de que realmente lo ha solucionado. –