OSDN Git Service

Potential fix for Memory leak - Clear (some) Metadata post persist Split_renderers
authormelchior <melchior@users.osdn.me>
Sat, 25 Apr 2020 20:55:25 +0000 (16:55 -0400)
committermelchior <melchior@users.osdn.me>
Sat, 25 Apr 2020 20:55:25 +0000 (16:55 -0400)
Automap/Data/ColumnMeta.cs
Automap/Subsystems/AutomapSystem.cs

index 5ee3945..b767066 100644 (file)
@@ -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
+}
index 8cbfc20..880fe90 100644 (file)
@@ -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<int, uint>(10); }
+
                                do
                                {
                                        do