我对编程很新,我需要一些优化方面的帮助。 基本上我的方法的一部分做:
for(int i = 0; i < Tiles.Length; i++)
{
x = Tiles[i].WorldPosition.x;
y = Tiles[i].WorldPosition.y;
z = Tiles[i].WorldPosition.z;
Tile topsearch = Array.Find(Tiles,
search => search.WorldPosition == Tiles[i].WorldPosition +
new Vector3Int(0,1,0));
if(topsearch.isEmpty)
{
// DoMyThing
}
}
所以我正在寻找一个比当前Tile高1个单位的瓷砖。
我的问题是,对于整个方法,它需要0.1秒,这会导致小的翘起。没有Array.Find
,方法是0.01秒。
我也尝试了for循环,但仍然没有很好的结果,因为我还需要3次检查 底部,左侧和右侧..
有人可以帮助我并指出一种获得快速结果的方法吗? 也许我应该选择类似线程的东西?
答案 0 :(得分:9)
您可以创建一个三维数组,这样您只需查看Tiles[x, y + 1, z]
中的内容,就可以在特定位置查找切片。
然后,您可以在2个循环中遍历数据:一个用于构建Tiles,另一个用于执行您在上面的代码中执行的检查,这将只是:
for(int i = 0; i < Tiles.Length; i++)
{
Tile toFind = Tiles[Tile[i].x, Tile[i].y + 1, Tile[i].z];
if (toFind != null) ...
}
您必须对数组进行维度设置,以便在y中有1个额外的行,以便Tiles[x, y + 1, z]
不会导致索引超出范围的异常。
答案 1 :(得分:4)
添加到Roy's solution,如果空间不是连续的,可以将WorldPosition
(x,y和z坐标)的哈希码放在这里好用。< / p>
我的意思是你可以用你自己的实现覆盖WorldPosition
的{{1}}:
GetHashCode
请参阅Why is '397' used for ReSharper GetHashCode override?了解相关信息。
然后你可以将你的瓷砖放在public class WorldPosition
{
public int X;
public int Y;
public int Z;
public override int GetHashCode()
{
int result = X.GetHashCode();
result = (result * 397) ^ Y.GetHashCode();
result = (result * 397) ^ Z.GetHashCode();
return result;
}
}
中。
这样可以快速查找Dictionary<WorldPosition, Tile>
等。字典使用哈希码作为密钥,因此速度很快。
答案 2 :(得分:0)
首先,像@Roy建议的那样,尝试将值存储在数组中,以便您可以使用x,y,z坐标访问它们,
您可以做的另一件事是将搜索更改为
Tile topsearch = Array.Find(Tiles,
search => search.WorldPosition.x == Tiles[i].WorldPosition.x &&
search.WorldPosition.y == (Tiles[i].WorldPosition.y + 1) &&
search.WorldPosition.z == Tiles[i].WorldPosition.z)
这可能会更快,具体取决于WorldPosition
有多少字段