在我的游戏中,我总是有大约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;
等等。
答案 0 :(得分:2)
因此,根据评论,你有一个非常稀疏的数组。一个100 * 10 * 100阵列可以存储100000个对象,如果你正在迭代它,你仍然必须检查其中的所有其他99500 null
,即使它实际上只有500个项目。
我建议您使用更合适的数据类型,允许稀疏分配,例如Dictionary
。由于Dictionary
是通用的,并且您正在试图基于3D点(不一定在空间中,但仍然是3个坐标)存储一些对象,因此您正在寻找类似Dictionary<Vector3Int, GameObject>
的内容。我建议使用Vector3Int
作为密钥,因为它只处理整数,因此您可以避免与floating points相关的所有恶作剧。
使用稀疏结构,可以避免循环遍历不存在的位置,这将极大地减少在极端情况下迭代它所花费的时间。请注意,如果要填充所有100000个位置,稀疏结构通常在技术上较慢。但由于你几乎没有接触到这个数量,迭代时间的减少将帮助你很多。