private void loaderLoop() { while (!stopThread) { Queue <ChunkRequest> queueCopy = new Queue <ChunkRequest>(); lock (chunkRequests) { // Wait for chunk requests while (chunkRequests.Count == 0 && !stopThread) { Monitor.Wait(chunkRequests); } // Copy for (int i = 0; i < 3 && chunkRequests.Count > 0; i++) { queueCopy.Enqueue(chunkRequests[0]); chunkRequests.RemoveAt(0); } } Queue <TerrainGen.ChunkCreateMsg> done = new Queue <TerrainGen.ChunkCreateMsg>(); while (queueCopy.Count > 0 && !stopThread) { ChunkRequest r = (ChunkRequest)queueCopy.Dequeue(); // Heightmap HeightMap h = World.getOrCreateHeightMap(r.cx, r.cz); h.generate(Constants.WORLD_SEED); // Chunk block data ChunkData c = new ChunkData(r.cx, r.cy, r.cz); c.generate(h); // Mesh Vector2Int meshI = new Vector2Int(-1, -1); if (!c.isAir()) { meshI = c.generateMesh(); while ((meshI.x == -1 && meshI.y == -1) && !stopThread) { // Wait for the main thread to finish with one of the mesh data objects if (done.Count > 0) { TerrainGen.chunksLoaded(done); done.Clear(); } Thread.Sleep(32); meshI = c.generateMesh(); } } TerrainGen.ChunkCreateMsg m = new TerrainGen.ChunkCreateMsg(r.cx, r.cy, r.cz, c, meshI); done.Enqueue(m); } TerrainGen.chunksLoaded(done); } }