首页 > 解决方案 > 哪种方式被认为比较这些变量更有效?

问题描述

我正在编写一个播放器控制器,并且我正在两个轴(X,Y)上移动播放器。这些值可以大致-1, 0, 1位于每个轴上。正值指向 UP 和 RIGHT。根据我之前所做的检查,这两个值都不可能为零。

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

澄清示例:
如果X = 1然后Y = 0玩家正在向屏幕的右侧移动。

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

对于这个问题,我提出了两种可能的解决方案,但我想知道哪一种更有效。
两种解决方案都使用_inputs2D 向量来获取 和 的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;
        }
    }
}

标签: c#performancecomparison

解决方案


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

int directions = y * 2 + x;

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


推荐阅读