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、 即使这样,如果你正在捕捉它,你至少应该记录或跟踪它。这是有原因的。不过说实话,我以前也曾吞下过例外,但这样做总让我觉得很肮脏:)