OSDN Git Service

Potential fix for Memory leak - Clear (some) Metadata post persist
[automap/automap.git] / Automap / Data / ColumnMeta.cs
index ed792a0..b767066 100644 (file)
@@ -1,6 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Collections.ObjectModel;
 using System.Collections.Specialized;
 
 
@@ -8,7 +7,10 @@ using Vintagestory.API.MathTools;
 using Vintagestory.API.Common;
 
 using ProtoBuf;
-
+using System.IO;
+using System.Collections.ObjectModel;
+using System.Text;
+using Vintagestory.API.Client;
 
 namespace Automap
 {
@@ -16,36 +18,47 @@ namespace Automap
        public struct ColumnMeta
        {
                [ProtoMember(1)]
+               [DisplayName(0, "Coords.")]
                public Vec2i Location;
 
                [ProtoMember(2)]
+               [DisplayName(1, "Age")]
                public TimeSpan ChunkAge;//OLDEST CHUNK. from chunk last edit
 
                [ProtoMember(3)]
+               [DisplayName(2, "Temp.")]
                public float Temperature;// Temperature - surface
 
                [ProtoMember(4)]
+               [DisplayName(3, "Y Max.")]
                public ushort YMax;// Y feature height
 
                [ProtoMember(5)]
+               //[DisplayName(10, "Rocks")]
                public Dictionary<int, uint> RockRatio;//[Column] Geographic region (rock) Ratio. [BlockID * count]
 
                [ProtoMember(6)]
+               [DisplayName(4, "Fert.")]
                public float Fertility;
 
                [ProtoMember(7)]
+               [DisplayName(5, "Forest")]
                public float ForestDensity;
 
                [ProtoMember(8)]
+               [DisplayName(6, "Rain")]
                public float Rainfall;
 
                [ProtoMember(9)]
+               [DisplayName(7, "Shrub")]
                public float ShrubDensity;
 
                [ProtoMember(10)]
+               [DisplayName(8, "Air blocks")]
                public uint AirBlocks;
 
                [ProtoMember(11)]
+               [DisplayName(9, "Non-air")]
                public uint NonAirBlocks;
 
                [ProtoMember(12)]
@@ -56,7 +69,7 @@ namespace Automap
                public ushort[,] HeightMap;//Needs to be 'flattened' for Protocol-Buffer serialization
 
                [ProtoMember(13)]
-               private ushort[ ] _flattened_HeightMap;
+               private ushort[] _flattened_HeightMap;
 
 
                public ColumnMeta(Vec2i loc, byte chunkSize = 32)
@@ -90,45 +103,53 @@ namespace Automap
                }
 
                [ProtoBeforeSerialization]
-               private void PrepareData( )
+               private void PrepareData()
                {
 
-               if (HeightMap != null) {
-                       _flattened_HeightMap = new ushort[ChunkSize * ChunkSize];
-               int flatIndex = 0;
+                       if (HeightMap != null)
+                       {
+                               _flattened_HeightMap = new ushort[ChunkSize * ChunkSize];
+                               int flatIndex = 0;
+
+                               for (byte col = 0; col < ChunkSize; col++)
+                               {
+                                       for (byte row = 0; row < ChunkSize; row++)
+                                       {
+                                               _flattened_HeightMap[flatIndex] = HeightMap[col, row];
+                                               flatIndex++;
+                                       }
+                               }
 
-               for (byte col = 0; col < ChunkSize; col++) {
-                       for (byte row = 0; row < ChunkSize; row++) {
-                       _flattened_HeightMap[flatIndex] = HeightMap[col, row];
-                       flatIndex++;
                        }
-               }
-
-               }
 
                }
 
 
                [ProtoAfterDeserialization]
-               private void PostProcess( )
+               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 (_flattened_HeightMap != null) {
-               int col, row;
-
-               BitVector32 bitMasker = new BitVector32(0);
-               var rowSection = BitVector32.CreateSection(ChunkSize);
-               var colSection = BitVector32.CreateSection(ChunkSize, rowSection);
+                       if (this.HeightMap == null || this.HeightMap.Length != (ChunkSize * ChunkSize)) {
+                       this.HeightMap = new ushort[ChunkSize, ChunkSize];
+                       }
 
-               for (uint rowcol = 0; rowcol < (ChunkSize * ChunkSize); rowcol++) {
-               bitMasker = new BitVector32(data: ( int )rowcol);
-               row = bitMasker[rowSection];
-               col = bitMasker[colSection];
-               HeightMap[col, row] = _flattened_HeightMap[rowcol];
-               }
+                       if (_flattened_HeightMap != null)
+                       {
+                               int col, row;
+                               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++)
+                               {
+                                       bitMasker = new BitVector32(data: (int) rowcol);
+                                       row = bitMasker[rowSection];
+                                       col = bitMasker[colSection];
+                                       HeightMap[col, row] = _flattened_HeightMap[rowcol];
+                               }
 
-               }
+                       }
 
                }
 
@@ -214,6 +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...
+               }
+               }
+
        }
 }
-