Пример #1
0
        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);
            }
        }
Пример #2
0
 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));
 }