我目前正在开发基本的体素(立方体)游戏引擎,并且遇到性能问题。游戏的每一帧:

查找玩家的观看方向→检查玩家的直接观看路径中的每个坐标→查找最近的占用空间→在此块周围绘制线框。

我正在使用OpenTK,这是​​OpenGL用于.NET / Mono(特别是C#)的绑定。我的代码OnRenderFrame包含以下内容:

try
{
    for (int i = 0; i < 8; i++)
    {
        Vector3 block = InterfaceUtils.FindBlockLoc(Utilities.RoundToInt(cam.Position + (cam.lookat * i)));
        if (block != Vector3.Zero)
        {
            // Draw the wireframe
        }
    }
}
catch
{
}


该代码的目的是从播放器中最多检查八个块,直到找到一个块为止。唯一的问题是,try语句最常引发(处理的)异常:但是,由此引起的延迟很大。当我观察太空时,我只会得到11FPS,但是如果代码成功,我会得到50FPS。



如果代码成功(可以绘制线框),我将得到以下信息:



查找数据块的方法是检查对象列表中该位置的数据块。

public static Vector3 FindBlockLoc(Vector3 location)
{
    Vector3 result = new Vector3(Vector3.Zero);

    result = Deltashot.Game.objects.Find(v => v.Position == location).Position;
    if (result != null)
    {
        return result;
    }
    else
    {
        return Vector3.Zero;
    }
}


但是,这将返回NullReferenceException,我被迫使用TRY语句使其运行。这又回到了平方...

最佳答案

Throwing and catching Exceptions is a costly operation in C#,似乎您正在使用exceptions as flow control

您应该避免NullReferenceException而不是在发生时立即捕获它。

我猜异常发生在这里:

result = Deltashot.Game.objects.Find(v => v.Position == location).Position;


我建议这样的事情:

public static Vector3 FindBlockLoc(Vector3 location)
{
    var result = Deltashot.Game.objects.Find(v => v.Position == location);

    if (result != null && result.Position != null)
    {
        return result.Position;
    }
    else
    {
        return Vector3.Zero;
    }
}

10-04 18:48