需要帮助进行搜索优化

时间:2013-12-09 14:47:07

标签: c# optimization

我对编程很新,我需要一些优化方面的帮助。 基本上我的方法的一部分做:

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次检查 底部,左侧和右侧..

有人可以帮助我并指出一种获得快速结果的方法吗? 也许我应该选择类似线程的东西?

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有多少字段