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

时间:2021-06-08 21:12:40

标签: c# performance comparison

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

根据他们的组合,我想确定玩家面对的方向。玩家可以选择八个可能的方向。我使用 enum: FacingDirection 来传递方向。

<块引用>

举例说明:
如果 X = 1Y = 0 则玩家正在向屏幕右侧移动。

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

我想出了两种可能的解决方案来解决这个问题,但我想知道哪个更有效。
两种解决方案都使用 _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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

int directions = y * 2 + x;

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

答案 1 :(得分:0)

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

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

相关问题