public void UpdateRebuildList() { List <VoxelChunk> toRebuild = new List <VoxelChunk>(); List <VoxelChunk> toRebuildLiquids = new List <VoxelChunk>(); RebuildTest = toRebuild; foreach (VoxelChunk chunk in ChunkData.ChunkMap.Select(chunks => chunks.Value)) { if (chunk.ShouldRebuild && !chunk.RebuildPending) { toRebuild.Add(chunk); chunk.RebuildPending = true; } if (chunk.ShouldRebuildWater && !chunk.RebuildLiquidPending) { toRebuildLiquids.Add(chunk); chunk.RebuildLiquidPending = true; } } if (toRebuild.Count > 0) { toRebuild.Sort(CompareChunkDistance); //RebuildLock.WaitOne(); foreach (VoxelChunk chunk in toRebuild) { RebuildList.Enqueue(chunk); } //RebuildLock.ReleaseMutex(); } if (toRebuildLiquids.Count > 0) { toRebuildLiquids.Sort(CompareChunkDistance); //LiquidLock.WaitOne(); foreach (VoxelChunk chunk in toRebuildLiquids.Where(chunk => !RebuildLiquidsList.Contains(chunk))) { RebuildLiquidsList.Enqueue(chunk); } //LiquidLock.ReleaseMutex(); } if (RebuildList.Count > 0) { NeedsRebuildEvent.Set(); } if (RebuildLiquidsList.Count > 0) { NeedsLiquidEvent.Set(); } }
public void RebuildLiquidsThread() { EventWaitHandle[] waitHandles = { NeedsLiquidEvent, Program.ShutdownEvent }; #if CREATE_CRASH_LOGS try #endif { bool shouldExit = false; while (!shouldExit && !DwarfGame.ExitGame && !ExitThreads) { EventWaitHandle wh = Datastructures.WaitFor(waitHandles); if (wh == Program.ShutdownEvent) { break; } while (!PauseThreads && RebuildLiquidsList.Count > 0) { VoxelChunk chunk = null; //LiquidLock.WaitOne(); if (!RebuildLiquidsList.TryDequeue(out chunk)) { //LiquidLock.ReleaseMutex(); break; } //LiquidLock.ReleaseMutex(); if (chunk == null) { continue; } try { chunk.RebuildLiquids(Graphics); chunk.RebuildLiquidPending = false; chunk.ShouldRebuildWater = false; } catch (Exception e) { Console.Error.WriteLine(e.Message); shouldExit = true; break; } } } } #if CREATE_CRASH_LOGS catch (Exception exception) { ProgramData.WriteExceptionLog(exception); } #endif }