private void CleanUpTreadedWork(VisualWorldParameters vwp, Vector3I lastSinglePlayerChunkPosition) { //Single Player Mode = Remove buffer data based on current player chunk position if (Monitor.TryEnter(_syncLock, 0)) { //Get the list of Buffer var buffer2Remove = new List <LandscapeChunkBuffer>(); foreach (var buffer in _buffers.Values) { if (Math.Abs((lastSinglePlayerChunkPosition.X - buffer.ChunkLocation.X)) > ((vwp.VisibleChunkInWorld.X / 2.0) + _chunkRangeLookUp.X * 2) || Math.Abs((lastSinglePlayerChunkPosition.Z - buffer.ChunkLocation.Z)) > ((vwp.VisibleChunkInWorld.Y / 2.0) + _chunkRangeLookUp.Z * 2)) { buffer2Remove.Add(buffer); } } if (buffer2Remove.Count > 0) { logger.Trace("Landscape buffer cleanup, {0} buffers removed", buffer2Remove.Count); //remove the buffer that won't be used anymore foreach (var b in buffer2Remove) { _buffers.Remove(b.ChunkLocation); } } Monitor.Exit(_syncLock); } }
public void CleanUpClient(Vector3I chunkPosition, VisualWorldParameters vwp) { //Clean Up LandscapeChunkBuffer that are too far from current player position for single player mode if (chunkPosition == _lastSinglePlayerChunkPosition) { return; } _lastSinglePlayerChunkPosition = chunkPosition; S33M3DXEngine.Threading.ThreadsManager.RunAsync(() => CleanUpTreadedWork(vwp, _lastSinglePlayerChunkPosition)); }