Пользовательский интерфейс не любит графические объекты, созданные в других потоках.Например, если ваши чанки содержат кисти, они могут не работать в потоке пользовательского интерфейса, если они были созданы в рабочем потоке.
В вашем случае не имеет значения, используете ли вы обычные или поточно-ориентированные коллекции,потому что вы создали только один поток.Чтобы испытать прибавку в скорости, пришлось бы создавать и запускать несколько потоков.В этом случае критически важным будет использование потоковобезопасных коллекций, а метод CreateChunks
должен выглядеть следующим образом:
private void CreateChunks() {
while (chunksToCreate.TryDequeue(out Vector2 vec)) {
chunks.TryAdd(vec, generatorFunc(this, (int)vec.X, (int)vec.Y));
}
}
Но с помощью * 1007 можно избежать создания нужного количества потоков и управления ими самостоятельно.* Task Parallel Library (TPL) .
Parallel.ForEach(chunksToCreate, vec =>
chunks.TryAdd(vec, generatorFunc(this, (int)vec.X, (int)vec.Y))
);
Обратите внимание, что источник chunksToCreate
не должен быть потокобезопасным, поскольку Parallel.ForEach
назначает элементы потокам перед их запуском;однако, словарь chunks
должен, так как он будет доступен для нескольких потоков параллельно.
ConcurrentDictionary<Vector2, Chunk> chunks = new ConcurrentDictionary<Vector2, Chunk>();
List<Vector2> chunksToCreate = new List<Vector2>();
public World(Chunk.ChunkGen generator, int program, int seed) {
Program = program;
Seed = seed;
Parallel.ForEach(chunksToCreate, vec =>
chunks.TryAdd(vec, generator(this, (int)vec.X, (int)vec.Y))
);
}