背景: 我正在使用DirectX 9.0托管库将3D点的数组转换为2D屏幕坐标。为了提高速度,我使用UnsafeNativeMethods来执行所有的变换。
问题:
如果使用我的自定义线剪辑函数,我的应用程序会在没有抛出任何异常的情况下崩溃。花了一段时间,我才发现它会抛出一个无法捕获的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
对象随后传递给一个不安全的本地方法,该方法将这些顶点转换为2D顶点。从我能看到的一切,在调试模式下逐步执行它是完全正常的,直到它突然死机。
我就是无法弄清楚出了什么问题。任何帮助将不胜感激。