У меня есть система «фрагментов» вроде Minecraft, к которой я добавил систему потоковой передачи фрагментов, чтобы они загружались и выгружались рядом с плеером динамически во время выполнения. делать это сейчас очень медленно, потому что каждый кадр я проверяю, порождаются ли все фрагменты, которые должны быть загружены вокруг плеера.
void Update() {
ChunkPosition[] nearChunks = ChunkPosition.getNearChunkPositions(transform.position, renderDistance);
for(int i = 0; i < nearChunks.Length; ++i)
if(!Chunk.exists(nearChunks[i]))
Spawn(nearChunks[i]);
for(int i = 0; i < Chunk.spawned.Count; ++i)
if(Chunk.shouldDespawn(transform.position, Chunk.spawned[i], renderDistance))
Despawn(i);
return;
}
Это происходит каждый кадр. Теперь позвольте мне показать вам часть, которая фактически влияет на производительность:
for(int i = 0; i < nearChunks.Length; ++i)
if(!Chunk.exists(nearChunks[i]))
Spawn(nearChunks[i]);
Итак, в каждом кадре я проверяю, существует ли кусок в позиции p (x, z). Вот как я это делаю:
public static bool exists(ChunkPosition position) {
return (getChunk(position) != null);
}
Но здесь становится хуже:
public static Chunk getChunk(ChunkPosition position) {
for(int i = 0; i < spawned.Count; ++i)
if(spawned[i].position.x == position.x && spawned[i].position.z == position.z)
return spawned[i];
return null;
}
Я перебираю каждый соседний кусок, и на каждой итерации я перебираю список порожденных блоков, чтобы проверить, есть ли один в этой позиции.
Это плохо. Очень плохо. Изначально я думал о том, чтобы создать отдельный поток для рендеринга фрагментов, который не помог бы однопоточным системам, но все равно помог бы, но да ладно, Unity не является потокобезопасным.
Какой метод был бы лучше как это сделать?