C# 在XNA中尝试影响性能的捕获

C# 在XNA中尝试影响性能的捕获,c#,exception,xna,try-catch,sqrt,C#,Exception,Xna,Try Catch,Sqrt,我有点挣扎于试抓行为。我已经读到,它会影响性能,但不会像这段代码对我的机器那样严重 foreach (Crew CurrentBall in CrewList) { if (CurrentBall != WhiteBall) { double distance = 0; try {

我有点挣扎于试抓行为。我已经读到,它会影响性能,但不会像这段代码对我的机器那样严重

foreach (Crew CurrentBall in CrewList)
            {
                if (CurrentBall != WhiteBall)
                {
                    double distance = 0;

                    try
                    {
                        distance = Math.Sqrt((CurrentBall.Rectangle.X - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.X)
                            * (CurrentBall.Rectangle.X - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.X)
                            + (CurrentBall.Rectangle.Y - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.Y)
                            * (CurrentBall.Rectangle.Y - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.Y));
                    }
                    catch
                    {
                        distance = Math.Sqrt((CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
                            * (CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
                            + (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y)
                            * (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y));
                    }

                    if (distance < 75 && CurrentBall != WhiteBall)
                    {
                        if (CurrentBall.IsFollowingWhite == false)
                        {
                            NumberOfBallsFollowingWhite++;
                            CrewCatch.Play();
                            Score += 5;
                            ReduceMovementSpeed();
                            ApplyText(CurrentBall);
                            SnakeArray[NumberOfBallsFollowingWhite] = CurrentBall;
                            CurrentBall.SnakePosition = NumberOfBallsFollowingWhite;
                        }

                        CurrentBall.Follow(SnakeArray[CurrentBall.SnakePosition - 1]);
                        CurrentBall.IsFollowingWhite = true;
                    }
                }
            }
foreach(Crew列表中的Crew CurrentBall)
{
如果(CurrentBall!=白球)
{
双倍距离=0;
尝试
{
距离=Math.Sqrt((CurrentBall.Rectangle.X-SnakeArray[CurrentBall.SnakePosition-1].Rectangle.X)
*(CurrentBall.Rectangle.X-SnakeArray[CurrentBall.SnakePosition-1].Rectangle.X)
+(CurrentBall.Rectangle.Y-SnakeArray[CurrentBall.SnakePosition-1].Rectangle.Y)
*(CurrentBall.Rectangle.Y-SnakeArray[CurrentBall.SnakePosition-1].Rectangle.Y));
}
抓住
{
距离=Math.Sqrt((CurrentBall.Rectangle.X-WhiteBall.Rectangle.X)
*(CurrentBall.Rectangle.X-WhiteBall.Rectangle.X)
+(CurrentBall.Rectangle.Y-WhiteBall.Rectangle.Y)
*(CurrentBall.Rectangle.Y-WhiteBall.Rectangle.Y));
}
如果(距离<75&&CurrentBall!=白球)
{
如果(CurrentBall.IsFollowingWhite==false)
{
以下为白色++的球数;
CrewCatch.Play();
分数+=5分;
降低移动速度();
ApplyText(CurrentBall);
蛇阵[NumberOfBallsFollowingWhite]=当前球;
CurrentBall.SnakePosition=白色以下的球数;
}
CurrentBall.Follow(蛇形数组[CurrentBall.SnakePosition-1]);
CurrentBall.IsFollowerWhite=真;
}
}
}
在我使用try-catch之前,它工作得相当好。我也尝试过不使用Math.Sqrt,但没有任何改进。

这整件事:

try
{
    distance = Math.Sqrt((CurrentBall.Rectangle.X - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.X)
        * (CurrentBall.Rectangle.X - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.X)
        + (CurrentBall.Rectangle.Y - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.Y)
        * (CurrentBall.Rectangle.Y - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.Y));
}
catch
{
    distance = Math.Sqrt((CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
        * (CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
        + (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y)
        * (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y));
}
可以简化为:

if (CurrentBall.SnakePosition - 1 >= 0 && CurrentBall.SnakePosition - 1 < SnakeArray.Length)
{
    int xValue = CurrentBall.Rectangle.X - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.X; 
    int xSquared = xValue * xValue;

    int yValue = CurrentBall.Rectangle.Y - SnakeArray[CurrentBall.SnakePosition - 1].Rectangle.Y;
    int ySquared = yValue * yValue;

    distance = Math.Sqrt(xSquared + ySquared);
}
else
{
    //And similar for the above here...
    distance = Math.Sqrt((CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
                            * (CurrentBall.Rectangle.X - WhiteBall.Rectangle.X)
                            + (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y)
                            * (CurrentBall.Rectangle.Y - WhiteBall.Rectangle.Y));
}
if(CurrentBall.SnakePosition-1>=0&&CurrentBall.SnakePosition-1
切勿使用try/catch执行逻辑操作。如果你没有做异常的事情,也永远不要捕捉


也要尽量使你的逻辑易于阅读。看到我在“如果”的第一部分做了什么吗?看看它是多么容易理解(和调试)。而且没有性能损失,编译器将对其进行优化

try/catch块中最昂贵的部分是实际捕获(抛出、堆栈跟踪等)。我认为,
if/else
更适合您的情况。您应该清理输入,不要依赖catch来执行不同的逻辑。为什么要使用try/catch?这种机制永远不应该在游戏中使用。
在我使用try-catch之前,它工作得相当好。我也尝试过不使用Math.Sqrt,但没有任何改进。
我想您已经回答了自己的问题XDIt的名称:只有在发生异常情况时才应使用异常。如果这是正常操作的一部分,则异常不是您想要的。如果您可以提前预测是否会抛出异常,那么就这样做,并采取措施避免它。异常是代码的一种表达方式,表示“很抱歉,我完全无法使此工作正常进行,请其他人接管”。“如果不处理异常,则永远不会捕获”-通常是正确的,但并非总是如此。有时候你想吞下它。e、 即使这样,如果你正在捕捉它,你至少应该记录或跟踪它。这是有原因的。不过说实话,我以前也曾吞下过例外,但这样做总让我觉得很肮脏:)