Friday, October 11, 2019

int to string function Non GC

https://forum.unity.com/threads/int-to-string-conversion-tostring-creates-garbage-for-the-gc.364818/


  1. using
     UnityEngine;
  2. using System.Text;
  3.  
  4. public class StaticString
  5. {
  6.  
  7.     public enum CharAlignment
  8.     {
  9.         Left = 0,
  10.         Right = 1
  11.     }
  12.  
  13.     #region Fields
  14.  
  15.     private static System.Reflection.FieldInfo _sb_str_info = typeof(StringBuilder).GetField("_str",
  16.                                                                                             System.Reflection.BindingFlags.NonPublic |
  17.                                                                                             System.Reflection.BindingFlags.Instance);
  18.     private StringBuilder _sb;
  19.  
  20.     #endregion
  21.  
  22.     #region CONSTRUCTOR
  23.  
  24.     public StaticString(int size)
  25.     {
  26.         _sb = new StringBuilder(new string(' ', size)0, size, size);
  27.     }
  28.  
  29.     #endregion
  30.  
  31.     #region Properties
  32.  
  33.     public CharAlignment Alignment
  34.     {
  35.         get;
  36.         set;
  37.     }
  38.  
  39.     public string Value
  40.     {
  41.         get { return _sb_str_info.GetValue(_sb) as string; }
  42.     }
  43.  
  44.     #endregion
  45.  
  46.     #region Methods
  47.  
  48.     public void Set(int value)
  49.     {
  50.         const int CHAR_0 = (int)'0';
  51.         _sb.Length = 0;
  52.  
  53.         bool isNeg = value < 0;
  54.         value = System.Math.Abs(value);
  55.         int cap = _sb.Capacity;
  56.         int log = (int)System.Math.Floor(System.Math.Log10(value));
  57.         int charCnt = log + ((isNeg) ? 2 : 1);
  58.         int blankCnt = cap - charCnt;
  59.  
  60.         switch (this.Alignment)
  61.         {
  62.             case CharAlignment.Left:
  63.                 {
  64.                     if (isNeg) _sb.Append('-');
  65.                     int min = System.Math.Max(charCnt - cap, 0);
  66.                     for(int i = log; i >= min; i--)
  67.                     {
  68.                         int pow = (int)System.Math.Pow(10, i);
  69.                         int digit = (value / pow) % 10;
  70.                         _sb.Append((char)(digit + CHAR_0));
  71.                     }
  72.  
  73.                     for (int i = 0; i < blankCnt; i++)
  74.                     {
  75.                         _sb.Append(' ');
  76.                     }
  77.                 }
  78.                 break;
  79.             case CharAlignment.Right:
  80.                 {
  81.                     for (int i = 0; i < blankCnt; i++)
  82.                     {
  83.                         _sb.Append(' ');
  84.                     }
  85.  
  86.                     if (isNeg) _sb.Append('-');
  87.                     int min = System.Math.Max(charCnt - cap, 0);
  88.                     for (int i = log; i >= min; i--)
  89.                     {
  90.                         int pow = (int)System.Math.Pow(10, i);
  91.                         int digit = (value / pow) % 10;
  92.                         _sb.Append((char)(digit + CHAR_0));
  93.                     }
  94.                 }
  95.                 break;
  96.         }
  97.     }
  98.  
  99.     #endregion
  100.  
  101. }

  1. public StaticString staticString = new StaticString(20);
  2. staticString.Set (33);
  3. Debug.Log ("VALUE: " + staticString.Value);

No comments:

Post a Comment