如何改进GameObject-Array导致滞后

时间:2018-06-14 23:07:53

标签: c# unity3d

在我的游戏中,我总是有大约500个同时处于活动状态的对象。

我还有一个GameObject [] - 存储活动对象位置的数组。数组中的所有其他位置都设置为空。

这是一个例子:

我在5,5,0位置有一个立方体。 我的GameObject数组看起来像:cubes [5,5,0] = cube;

当我将数组的最大值设置为[100,10,100]时,游戏运行正常。但如果我把它增加到类似[200,10,200]的东西,它就会开始滞后。

有没有办法改进阵列,以便我可以保存更多的位置(同时仍然最多有500个对象活动!)

代码:

GameObject[] cubePrefab;
GameObject[,,] cubes;
bool[,,] world;
int worldX = 100;
int worldY = 5;
int worldZ = 100;

void Start()
{
    world = new bool[worldX, worldY, worldZ];
    cubes = new GameObject[worldX, worldY, worldZ];
}

void Update()
{
    for (var i = playerXMin; i < playerXMax; i++)
        for (var i2 = playerYMin; i2 < playerYMax; i2++)
            for (var i3 = playerZMin; i3 < playerZMax; i3++)
                if (world[i, i2, i3] && cubes[i, i2, i3] == null)
                    cubes[i, i2, i3] = Instantiate(cubePrefab);
}

一开始,世界上大约500个随机位置设置为true。

playerXMin = player.transform.position.x - 10;

playerXMax = player.transform.position.x + 10;

等等。

1 个答案:

答案 0 :(得分:2)

因此,根据评论,你有一个非常稀疏的数组。一个100 * 10 * 100阵列可以存储100000个对象,如果你正在迭代它,你仍然必须检查其中的所有其他99500 null,即使它实际上只有500个项目。

我建议您使用更合适的数据类型,允许稀疏分配,例如Dictionary。由于Dictionary是通用的,并且您正在试图基于3D点(不一定在空间中,但仍然是3个坐标)存储一些对象,因此您正在寻找类似Dictionary<Vector3Int, GameObject>的内容。我建议使用Vector3Int 作为密钥,因为它只处理整数,因此您可以避免与floating points相关的所有恶作剧。

使用稀疏结构,可以避免循环遍历不存在的位置,这将极大地减少在极端情况下迭代它所花费的时间。请注意,如果要填充所有100000个位置,稀疏结构通常在技术上较慢。但由于你几乎没有接触到这个数量,迭代时间的减少将帮助你很多