背景: 我正在使用 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
对象会被传递给 UnsafeNativeMethod,它将这些顶点转换为 2d 顶点。从我在调试模式下单步执行它时所看到的一切来看,它工作得非常好,直到它死掉。
我根本无法弄清楚出了什么问题。任何帮助将非常感激。