unity中豪华的解决string产生GC问题【内容可变的string实现】

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;






/// <summary>
/// 内容可变的字符串
/// </summary>
public class VariableString
{
    private string _data;
    private int maxCount;


    public VariableString(int maxCount = 1024)
    {
        this.maxCount = maxCount;
        _data = new string('\0', this.maxCount);
        Clear();
    }


    public string GetString()
    {
        return _data;
    }


    public string ConCat(string a, string b, bool clear = true)
    {
        if(clear)
        {
            Clear();
        }


        Push(a);
        Push(b);
        return _data;
    }


    public unsafe void Push(string newStr)
    {
        if(string.IsNullOrEmpty(newStr))
        {
            return;
        }


        int newLen = _data.Length + newStr.Length;
        if (newLen >= maxCount)
        {            
            return;
        }


        fixed (char* src = newStr)
        {
            fixed(char* dst = _data)
            {
                UnsafeFunction.memcpyimpl((byte*)src, (byte*)(dst + _data.Length), newStr.Length * 2); //system.string的存储每个元素两个字节


                int* iDst = (int*)dst; 
                iDst = iDst - 1;    //字符串的长度在第一个元素的前面4个字节
                * iDst = newLen;
            }
        }
    }




    public unsafe void Clear()
    {
        fixed(char* p = _data)
        {           
            int* pSize = (int*)p;
            pSize = pSize - 1;
            *pSize = 0;
        }
    }
   


}



using System.Collections;
using System.Collections.Generic;
using UnityEngine;






public class UnsafeFunction
{


    public unsafe static void memcpyimpl(byte* src, byte* dest, int len)
    {
        if (len >= 16)
        {
            do
            {
                *(int*)dest = *(int*)src;
                *(int*)(dest + 4) = *(int*)(src + 4);
                *(int*)(dest + 8) = *(int*)(src + 8);
                *(int*)(dest + 12) = *(int*)(src + 12);
                dest += 16;
                src += 16;
            }
            while ((len -= 16) >= 16);
        }
        if (len > 0)
        {
            if ((len & 8) != 0)
            {
                *(int*)dest = *(int*)src;
                *(int*)(dest + 4) = *(int*)(src + 4);
                dest += 8;
                src += 8;
            }
            if ((len & 4) != 0)
            {
                *(int*)dest = *(int*)src;
                dest += 4;
                src += 4;
            }
            if ((len & 2) != 0)
            {
                *(short*)dest = *(short*)src;
                dest += 2;
                src += 2;
            }
            if ((len & 1) != 0)
            {
                *(dest++) = *(src++);
            }
        }
    }


}





阅读更多
文章标签: GC
个人分类: Unity3d技术
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭