哪种方式被认为比较这些变量更有效?

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(二维向量)来获取 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 中使用它(没有 ifs 的解决方案 A)或作为字典键。

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

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