From: melchior Date: Sat, 25 Apr 2020 20:55:25 +0000 (-0400) Subject: Potential fix for Memory leak - Clear (some) Metadata post persist X-Git-Tag: PR7x~8^2 X-Git-Url: http://git.osdn.net/view?p=automap%2Fautomap.git;a=commitdiff_plain;h=refs%2Fheads%2FSplit_renderers Potential fix for Memory leak - Clear (some) Metadata post persist --- diff --git a/Automap/Data/ColumnMeta.cs b/Automap/Data/ColumnMeta.cs index 5ee3945..b767066 100644 --- a/Automap/Data/ColumnMeta.cs +++ b/Automap/Data/ColumnMeta.cs @@ -128,18 +128,22 @@ namespace Automap [ProtoAfterDeserialization] private void PostProcess() { - if (this.HeightMap == null) this.HeightMap = new ushort[ChunkSize, ChunkSize]; + ChunkSize = (ChunkSize == byte.MinValue) ? (byte)32 : ChunkSize;//Not good - if chunk wasn't 32 orignally! + + if (this.HeightMap == null || this.HeightMap.Length != (ChunkSize * ChunkSize)) { + this.HeightMap = new ushort[ChunkSize, ChunkSize]; + } if (_flattened_HeightMap != null) { int col, row; - _ = new BitVector32(0); + var bitMasker = new BitVector32(0); var rowSection = BitVector32.CreateSection((short) (ChunkSize - 1)); var colSection = BitVector32.CreateSection((short) (ChunkSize - 1), rowSection); for (uint rowcol = 0; rowcol < (ChunkSize * ChunkSize); rowcol++) { - BitVector32 bitMasker = new BitVector32(data: (int) rowcol); + bitMasker = new BitVector32(data: (int) rowcol); row = bitMasker[rowSection]; col = bitMasker[colSection]; HeightMap[col, row] = _flattened_HeightMap[rowcol]; @@ -231,5 +235,14 @@ namespace Automap base.Add(newItem); } + public void ClearMetadata( ) + { + for (int i = 0, maxItemsCount = this.Items.Count; i < maxItemsCount; i++) { + ColumnMeta entry = this.Items[i]; + entry.HeightMap = null; + entry.RockRatio = null;//Also regenerated when any chunk in a column is changed... + } + } + } -} \ No newline at end of file +} diff --git a/Automap/Subsystems/AutomapSystem.cs b/Automap/Subsystems/AutomapSystem.cs index 8cbfc20..880fe90 100644 --- a/Automap/Subsystems/AutomapSystem.cs +++ b/Automap/Subsystems/AutomapSystem.cs @@ -53,7 +53,7 @@ namespace Automap internal CommandType CurrentState { get; set; } //Run status, Chunks processed, stats, center of map.... - private uint nullChunkCount, updatedChunksTotal; + private uint nullChunkCount, nullMapCount, updatedChunksTotal; private Vec2i startChunkColumn; private readonly int chunkSize; @@ -184,7 +184,7 @@ namespace Automap if (mapChunk == null) { Logger.Warning("SKIP CHUNK: ({0}) - Map Chunk NULL!", mostActiveCol.Key); - nullChunkCount++; + nullMapCount++; columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); continue; } @@ -219,8 +219,9 @@ namespace Automap columnCounter.TryRemove(mostActiveCol.Key, out ejectedItem); Logger.VerboseDebug("Un-painted chunk: ({0}) ", mostActiveCol.Key); } - } + //Cleanup persisted Metadata... + chunkTopMetadata.ClearMetadata( ); } UpdateStatus(this.updatedChunksTotal, this.nullChunkCount, updatedChunks); @@ -500,6 +501,7 @@ namespace Automap #if DEBUG Logger.VerboseDebug("Chunk null or empty X{0} Y{1} Z{2}", key.X, targetChunkY, key.Y); #endif + nullChunkCount++; continue; } @@ -512,14 +514,12 @@ namespace Automap foreach (var blockEnt in chunkData.BlockEntities) { - if (blockEnt != null && blockEnt.Block != null && BlockID_Designators.ContainsKey(blockEnt.Block.BlockId)) { var designator = BlockID_Designators[blockEnt.Block.BlockId]; designator.SpecialAction(ClientAPI, POIs, blockEnt.Pos.Copy(), blockEnt.Block); } } - } /********************* Chunk/Column BLOCKs scanning ****************/ //Heightmap, Stats, block tally @@ -528,6 +528,10 @@ namespace Automap int X_index, Y_index, Z_index; X_index = Y_index = Z_index = 0; + //Ensure ChunkData Metadata fields arn't null...due to being tossed out + if (chunkMeta.HeightMap == null) { chunkMeta.HeightMap = new ushort[chunkSize, chunkSize]; } + if (chunkMeta.RockRatio == null) { chunkMeta.RockRatio = new Dictionary(10); } + do { do