Справочная информация: Я использую управляемые библиотеки DirectX 9.0 для преобразования массивов трехмерных точек в координаты экрана 2d. Для скорости я использую UnsafeNativeMethods для выполнения всех преобразований.Почему этот код генерирует System.ExecutionEngineException
Проблема: Если моя пользовательская функция линии отсечения используется мое приложение умирает, не бросали какие-либо исключения, это мне потребовалось некоторое время, чтобы понять, что это было бросать неуловимогоSystem.ExecutionEngineException
. Я сузил его, чтобы произойти из-за последних двух строк моей функции отсечения.
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);
}
Когда verticesAfterClipping
список копируется в lineToClip
lineToClip
вершин объект и затем передают на UnsafeNativeMethod, который преобразует эти вершины в 2d вершин. Из всего, что я вижу, когда я перехожу через него в режиме отладки, он работает полностью нормально, пока он просто не умрет.
Я просто не могу понять, что не так. Любая помощь приветствуется.
Вы правы, когда говорите, что исключение не встречается в этих двух строках, но оно происходит как РЕЗУЛЬТАТ этих двух линий. Я заменил эти строки и использовал другой временный буфер для копирования обрезанных вершин, и теперь все работает нормально.Я предположил, что было какое-то нарушение доступа к памяти, которое происходит под обложками, когда линия была передана небезопасным родным методам directx. – tbridge
Не предполагайте, что отсутствие ExecutionEngineException означает, что проблема исчезла. Может быть, CLR больше не обнаруживает его. Заменяя эти строки, вы можете оказаться в ситуации, когда данные повреждаются, но вы больше не получаете исключения. (CLR не гарантирует и не может бросить ExecutionEngineException в любое время, когда что-то вроде этого идет не так, и это только бросает его, когда это случается, чтобы заметить.) Таким образом, я был бы обеспокоен - я определенно пытаюсь добраться до основания * как * произошел сбой, так как сейчас нет причин быть уверенным, что вы действительно исправили его. –