索引坐标最佳实践?按位运算与模数和除法

时间:2016-03-07 17:37:55

标签: c# unity3d

在使用unity构建我的2D游戏时,我开始使用以下代码索引我的tile坐标以便在字典中访问:

Public class Coordinate
{
    private short[] coordinate = new Int16[2];

    public Coordinate(In16 x, Int16 y)[...]
    public Int16 x {[...]}
    public Int16 y {[...]}

    public Int32 Key
    {
        get{
            return ((Int32)(y << 16) ^ x);
        }
    }

    public static void Coordinate(Coordinate coordinate, Int32 index)
    {
        coordinate.X = (Int16)(index >> 16);
        coordinate.y = (Int16)index;
    }
}

但最终我发现了一个非常简单的解决方案:

int index = y * mapWidth + x;

int x = index % mapWidth;
int y = index / mapWidth;

我的问题是: 这两种方法中的任何一种方法对于在不同平台上移植是否更安全,或者只是更好的做法?如果是,想知道具体细节。

1 个答案:

答案 0 :(得分:0)

使用Lsl或lsr不是一个好习惯,因为即使它比其他解决方案更快,每个人都不理解它是如何工作的。

分区是最糟糕的解决方案,因为它对计算机来说并不自然,它们可能需要花费很多时间(是的,不到1毫秒,但是时间太长)。想象一下,如果你有一个等于0的map。

我不知道模数,但我认为这不是一个糟糕的解决方案。

乘法可能是最好的解决方案,也可能是最差的解决方案。它取决于数量(2 ^ x =最佳解,(2 ^ x)-1 =最差解(我认为这适合于臂组装) 它就像乘以3.在汇编中你应该乘以2并加上数字。  x * 3 = x * 2 + x。对于人类来说,它是相同的,而不是计算机。 也许编译器会进行转换,因为它们比过去更聪明。

在这种情况下,我认为乘法是最好的解决方案。只需更改&lt;&lt;通过基本乘法(2 ^ 16,所以65536)

我不知道你想用你的代码做什么,但根据评论你应该将索引分成2个变量。 因此,vector2是一个很好的解决方案,很容易管理,所以这是一个很好的实践。

对不起,我的英语很差。如果你不明白的话告诉我,我会再试一次:)

度过愉快的一天