gpt4 book ai didi

c# - 如何避免 TRY 语句导致程序性能不佳?

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:32 25 4
gpt4 key购买 nike

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

找到玩家的观察方向 → 检查玩家直接观察路径中的每个坐标 → 找到最近的占用空间 → 围绕这个 block 绘制线框。

我正在使用 OpenTK,它是 .NET/Mono(特别是 C#)的 OpenGL 绑定(bind)。我的代码 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
{
}

这段代码的目的是检查玩家最多八个方 block ,直到找到一个方 block 。唯一的问题是 try 语句最常抛出(已处理的)异常:但由此造成的延迟是巨大的。当我看空间时,我只有 11FPS,但如果代码成功,我会得到 50。

如果代码成功(可以绘制线框),我会得到:

block 查找通过检查对象列表中该位置的 block 来工作。

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;
}
}

关于c# - 如何避免 TRY 语句导致程序性能不佳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com