[英]Best practice for parameter: IEnumerable vs. IList vs. IReadOnlyCollection
[英]Indexing coordinate best practice? bitwise operation vs. modulo and division
在使用统一性构建2D游戏时,我开始用以下代码索引图块坐标以方便在字典中访问:
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;
我的问题是:这两种方法中的任何一种在移植到不同平台上时是否更安全? 如果是,则想了解具体情况。
使用Lsl或lsr并不是一个好习惯,因为即使它比其他解决方案要快,每个人也不知道它是如何工作的。
除法是最糟糕的解决方案,因为它对于计算机而言并不自然,并且会花费很多时间(是的,不到1毫秒,但即使这样也太多了)。 想象一下,如果您有一个mapwith等于0。
我不知道模数,但我认为这不是一个坏解决方案。
乘法可能是最好的解决方案,也可能是最坏的解决方案。 它取决于数字(2 ^ x =最佳解决方案,(2 ^ x)-1 =最坏的解决方案(我认为这对手臂装配是正确的),就像乘以3。在装配中,您应该乘以2并加上数字。x * 3 = x * 2 + x。对于人类来说,是相同的,而不是对于计算机,也许是编译器进行了转换,因为它们比过去更智能。
在这种情况下,我认为乘法是最好的解决方案。 只需将<<乘以基本乘法即可(2 ^ 16,所以65536)
我不知道您想对代码做什么,但是根据注释,您应该将索引分为2个变量。 因此,vector2是一个很好的解决方案,并且易于管理。
对不起,我的英语不好。 如果您不明白,请告诉我,我会再试一次:)
祝你今天愉快
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.