private void ComputeBlocks(World world, Chunk chunk, Chunk.ChunkPart chunkPart, int partNumber, ChunkPosition chunkPosition) { if (chunkPart.Blocks != null) { StaticReferences.BlocksToClean.Add(chunkPart.Blocks); } chunkPart.Blocks = new Blocks3D(); var partNumberMultipliedBy16 = partNumber << 4; var siblingChunks = _worldManager.GetSiblingChunks(world, chunkPosition); if (StaticReferences.ParallelMode) { var blockInfos = new List <BlockInfo> [256]; Parallel.For(0, 256, (i) => { var x = (byte)(i % 16); var z = (byte)(i / 16); var bInfos = new List <BlockInfo>(64); for (short y = (short)partNumberMultipliedBy16; y < partNumberMultipliedBy16 + 16; y++) { var chunkBlockInfo = _chunkManager.GetBlockInformation(chunk, x, (byte)y, z); if (chunkBlockInfo.Id == 0) { continue; } BlockInfo?blockInfo; if (ComputeBlockInfo(chunk, chunkPosition, siblingChunks, x, z, y, chunkBlockInfo, out blockInfo)) { bInfos.Add((BlockInfo)blockInfo); } } blockInfos[i] = bInfos; }); for (int i = 0; i < 256; i++) { chunkPart.Blocks.BlockInfos.AddRange(blockInfos[i]); } } else { for (byte x = 0; x < 16; x++) { for (byte z = 0; z < 16; z++) { for (short y = (short)partNumberMultipliedBy16; y < partNumberMultipliedBy16 + 16; y++) { var chunkBlockInfo = _chunkManager.GetBlockInformation(chunk, x, (byte)y, z); if (chunkBlockInfo.Id == 0) { continue; } BlockInfo?blockInfo; if (ComputeBlockInfo(chunk, chunkPosition, siblingChunks, x, z, y, chunkBlockInfo, out blockInfo)) { chunkPart.Blocks.BlockInfos.Add((BlockInfo)blockInfo); } } } } } chunkPart.Invalidated = false; }