hellbound/Assets/Scripts/Core/Utils/Buffer.cs

75 lines
1.7 KiB
C#

using System;
using System.Text;
//NOTE: cache for less GC operations
public static class TempBuffer
{
static byte[][] tmp_bufs = new byte[][] { new byte[512], new byte[512], new byte[512] };
static int tmp_buf_counter = 0;
static public int stats_max_buf = 0;
static public byte[] Get(int size)
{
var buf = Get();
if(size > buf.Length)
{
Array.Resize(ref buf, size);
Update(buf);
}
return buf;
}
static byte[] Get()
{
var buf = tmp_bufs[tmp_buf_counter % 3];
++tmp_buf_counter;
return buf;
}
static void Update(byte[] buf)
{
var idx = (tmp_buf_counter-1) % 3;
//for debug
//var curr = tmp_bufs[idx];
//if(curr != buf)
// Log.Debug(curr.Length + " VS " + buf.Length);
tmp_bufs[idx] = buf;
stats_max_buf = stats_max_buf < buf.Length ? buf.Length : stats_max_buf;
}
static public void Cleanup()
{
for(int i = 0; i < tmp_bufs.Length; ++i)
System.Array.Clear(tmp_bufs[i], 0, tmp_bufs[i].Length);
}
}
public static class TempStringBuffer
{
static public StringBuilder[] tmp_bufs = new StringBuilder[] { new StringBuilder(), new StringBuilder() };
static int tmp_buf_counter = 0;
static public StringBuilder Get()
{
var buf = tmp_bufs[tmp_buf_counter % 2];
buf.Length = 0;
++tmp_buf_counter;
return buf;
}
static public string Concat(string s1, string s2)
{
return Get().Append(s1).Append(s2).ToString();
}
static public string Concat(string s1, string s2, string s3)
{
return Get().Append(s1).Append(s2).Append(s3).ToString();
}
static public string Concat(string s1, string s2, string s3, string s4)
{
return Get().Append(s1).Append(s2).Append(s3).Append(s4).ToString();
}
}