TextMeshPro 上显示“数字”时,两种不生成GC Alloc的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。出自 游戏开发实验室 https://blog.csdn.net/u010019717/article/details/87023701

在UI上显示数字是很常见的行为, 并且数字经常改变。  例如 得分, 伤害数字, hp,属性等等。

怎么怎么产生的 GC Alloc?

            是 将数字转换为String  (int.ToString() 时)发生的。

如何避免?

1、使用 SetChatArray(...)

// 例1、结果:TEST1
int [] characters1 = new int [] {84,69,83,84,49};
label.SetCharArray(characters1,0,characters1.Length);

// 例2、结果:Test2
char [] characters2 = new char [] {'T','E','S','T','2'};
label.SetCharArray(characters2,0,characters2.Length);

         其中的int 类型代表的时Unicode  数字0~9  对应int 48到 57 

例子:

位数固定,使用0补位显示

using UnityEngine;
using TMPro;

public class ShowCharacter : MonoBehaviour
{
    [SerializeField]
    TextMeshProUGUI label;

    [Range(0, 99999)]
    [SerializeField]
    int count;

    int[] characters = new int[5];

    void Update()
    {
        var value = count;
        for (int i = characters.Length - 1; i >= 0; i--)
        {
            characters[i] = (value % 10) + 48;
            value /= 10;
        }

        label.SetCharArray(characters, 0, characters.Length);
    }
}

F:ID:tsubaki_t1:20190204014238克:平纹

             位数不固定,有多少位显示多少位

using UnityEngine;
using TMPro;

public class ShowCharacter2 : MonoBehaviour
{
    [SerializeField]
    TextMeshProUGUI label;

    public int Count;

    int[] characters = new int[5];

    void Update()
    {
        var digit = (Count == 0) ? 1 : ((int)Mathf.Log10(Count) + 1);
        var value = Count;
        for (int i = digit - 1; i >= 0; i--)
        {
            characters[i] = (value % 10) + 48;
            value /= 10;
        }

        label.SetCharArray(characters, 0, digit);
    }
}

F:ID:tsubaki_t1:20190204014055克:平纹

         想要和刚刚用0填充一样,可以这样改一下

using UnityEngine;
using TMPro;

public class ShowCharacter4 : MonoBehaviour
{
    [SerializeField]
    TextMeshProUGUI label;

    [Range(0, 99999)]
    [SerializeField]
    int count;

    char[] characters = new char[5];
    const char zero = '0';

    void Update()
    {
        var value = count;
        for (int i = characters.Length - 1; i >= 0; i--)
        {
            characters[i] = (char)((value % 10) + zero);
            value /= 10;
        }

        label.SetCharArray(characters, 0, characters.Length);
    }
}

2、使用 SetText(...)

        // 例3
        int value = 12345;
        label.SetText("value:{0}", value);

        // 例4  浮点数,负数
        float valueF = -123.41234f;
        label.SetText("valueF : {0:2}", valueF); // 小数点后两位

例子:

using UnityEngine;
using TMPro;

public class ShowCharacter3 : MonoBehaviour
{
    [SerializeField]
    TextMeshProUGUI label;

    public int Count;

    void Update()
    {
        var value = Count;
        label.SetText("<size=50%>value</size> {0}", Count);
    }
}

F:ID:tsubaki_t1:20190204015938克:平纹

请注意,GC在编辑器中是有的

当你在编辑器上运行和实际构建它时,行为是不同的。 如果使用编辑器则会发生GC。    

F:ID:tsubaki_t1:20190204021147j:平纹

         可能是编辑器的 InputBox 中显示字符导致的吧

参考:

https://qiita.com/taoru/items/c9c5461912ae0af94ed0  

https://github.com/kanitaoru/TMProNonAllocUtil  

猜你喜欢

转载自blog.csdn.net/u010019717/article/details/87023701
今日推荐