比较这些变量,哪种方法被认为更有效



我正在编写一个玩家控制器,我正在获取玩家在两个轴(X,Y(上的移动。每个轴上的值可以大致为-1, 0, 1。正值指向上方和右侧。根据我之前的检查,两个值都不可能为零。

根据他们的组合,我想确定球员所面对的方向。玩家有八个可能的方向。我用enum:FacingDirection,通过方向。

要澄清的示例:
如果是X = 1Y = 0,则播放器正在向屏幕右侧移动。

如果是X = -1Y = -1,则玩家正在向屏幕的左下角移动。

我已经为这个问题提出了两种可能的解决方案,但我想知道哪一种更有效
两种解决方案都使用_inputs(一个2D向量(来获得XY的值。

解决方案A

private FacingDirection findMoveDirection() {
int x = 0, y = 0;
float testing = _inputs.x;
for(int i = 0; i < 2; i++) {
int temp;
if (testing != 0) {
temp = (testing > 0) ? 1 : -1;
} else {
temp = 0;
}
if (i < 1) {
x = temp;
} else {
y = temp;
break;
}
testing = _inputs.y;
}
int check = x + y;
switch (check) {
case 2 : {
return FacingDirection.UP_RIGHT;
}
case -2 : {
return FacingDirection.DOWN_LEFT;
}
case 1 : {
if (x > 0) {
return FacingDirection.RIGHT;
} else {
return FacingDirection.UP;
}
}
case 0 : {
if (x > 0) {
return FacingDirection.DOWN_RIGHT;
} else {
return FacingDirection.UP_LEFT;
}
}
case -1 : {
if (x < 0) {
return FacingDirection.LEFT;
} else {
return FacingDirection.DOWN;
}
}
default : {
Debug.LogWarning("Something went wrong while determining moving direction. Returning DOWN as moving direction.");
return FacingDirection.DOWN;
}
}

解决方案B

这是一种更直接的if/else方法。

private FacingDirection findMoveDirection() {
float x = _inputs.x, y = _inputs.y;
if (x != 0) {
if (x > 0) {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_RIGHT;
} else {
return FacingDirection.DOWN_RIGHT;
}
} else {
return FacingDirection.RIGHT;
}
} else {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_LEFT;
} else {
return FacingDirection.DOWN_LEFT;
}
} else {
return FacingDirection.LEFT;
}
}
} else {
if (y > 0) {
return FacingDirection.UP;
} else {
return FacingDirection.DOWN;
}
}
}

您可以将两个值合并为一个值。例如:

int directions = y * 2 + x;

它唯一地标识一个方向
其允许值为:-3。。。+3,不包括0
然后您可以在switch(没有if的解决方案a(中使用它,也可以将它用作字典键。

解决方案B肯定更快,在最坏的情况下它会进行4次比较,而解决方案A会进行8次比较,在最差的情况下,也只是在for循环中。

您可以对这两种方法进行基准测试并进行验证。实际测量性能总是一个好主意:这段代码非常简单,但在更复杂的情况下,有些因素并不明显(例如,在处理内存中的许多对象时,CPU缓存效果(。

相关内容

  • 没有找到相关文章

最新更新