哪种方式被认为比较这些变量更有效?
Which way is considered more efficient to compare these variables?
我正在编写一个玩家控制器,我正在让玩家在两个轴 (X, Y) 上移动。每个轴上的值大致可以是 -1, 0, 1
。正值指向上和右。根据我之前所做的检查,两个 值不可能为零。
我想根据他们的组合来确定玩家面对的方向。玩家有八个可能的方向。我用的是enum
:FacingDirection
,传递方向。
Example to clarify:
If X = 1
and Y = 0
then the player is moving towards the RIGHT side of the screen.
If X = -1
and Y = -1
then the player is moving towards DOWN LEFT corner of the screen.
针对这个问题,我提出了两种可能的解决方案,但我想知道哪一种更有效。
两种解决方案都使用 _inputs
(二维向量)来获取 X
和 Y
.
的值
解决方案 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
s 的解决方案 A)或作为字典键。
解决方案 B 肯定更快,它在最坏的情况下进行 4 次比较,而解决方案 A 进行 8 次比较,同样在最坏的情况,就在 for 循环中。
您可以对这两种方法进行基准测试并进行验证。实际衡量性能总是一个好主意:这段代码非常简单,但在更复杂的情况下,存在一些不明显的因素(即 CPU 处理内存中的许多对象时的缓存效果)。
我正在编写一个玩家控制器,我正在让玩家在两个轴 (X, Y) 上移动。每个轴上的值大致可以是 -1, 0, 1
。正值指向上和右。根据我之前所做的检查,两个 值不可能为零。
我想根据他们的组合来确定玩家面对的方向。玩家有八个可能的方向。我用的是enum
:FacingDirection
,传递方向。
Example to clarify:
IfX = 1
andY = 0
then the player is moving towards the RIGHT side of the screen.If
X = -1
andY = -1
then the player is moving towards DOWN LEFT corner of the screen.
针对这个问题,我提出了两种可能的解决方案,但我想知道哪一种更有效。
两种解决方案都使用 _inputs
(二维向量)来获取 X
和 Y
.
解决方案 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
s 的解决方案 A)或作为字典键。
解决方案 B 肯定更快,它在最坏的情况下进行 4 次比较,而解决方案 A 进行 8 次比较,同样在最坏的情况,就在 for 循环中。
您可以对这两种方法进行基准测试并进行验证。实际衡量性能总是一个好主意:这段代码非常简单,但在更复杂的情况下,存在一些不明显的因素(即 CPU 处理内存中的许多对象时的缓存效果)。