在 Unity 中渲染文本会导致大量垃圾收集器工作并降低生产力(低 fps)

问题描述 投票:0回答:1

我正在写一本视觉小说,我注意到一个问题。我的脚本很大(我的意思是有很多文本),游戏进程越多,我需要等待渲染文本的时间就越多。只是看起来越来越慢。profiler analysis 这是一张图片。它显示我保留了大约2GB。 2GB 视觉小说!!无法相信它。这是文本渲染功能:

private IEnumerator Build_Fade()
    {
        int minRange = pre_text_len;
        int maxRange = minRange + 1;
        byte alphaThreshold = 15;
        TMP_TextInfo textInfo = tmpro.textInfo;
        Color32[] vertexColors = textInfo.meshInfo[textInfo.characterInfo[0].materialReferenceIndex].colors32;
        float[] alphas = new float[textInfo.characterCount];
        while (true)
        {
            float fadeSpeed;
            if (hurryup)
            {
                fadeSpeed = character_per_cycle * 5 * speed * 4f;
            }
            else fadeSpeed = character_per_cycle * speed * 4f;

            for (int i = minRange; i < maxRange; i++ )
            {

                TMP_CharacterInfo characterInfo = textInfo.characterInfo[i];
                if (!characterInfo.isVisible) continue;
                int vertexIndex = textInfo.characterInfo[i].vertexIndex;
                if(i >= alphas.Length)
                {
                    alphas = new float[textInfo.characterCount];
                }
                alphas[i] = Mathf.MoveTowards(alphas[i], 255, fadeSpeed);
                
                for (int v = 0; v < 4; v++)
                {
                    vertexColors[characterInfo.vertexIndex + v].a = (byte)alphas[i];
                }
                if (alphas[i] >= 255)
                {
                    minRange++;
                }
            }
            tmpro.UpdateVertexData(TMP_VertexDataUpdateFlags.Colors32);
            bool lastCharacterInvisible = !textInfo.characterInfo[maxRange - 1].isVisible;
            try
            {
                if (alphas[maxRange - 1] > alphaThreshold || lastCharacterInvisible)
                {
                    if (maxRange < textInfo.characterCount)
                    {
                        maxRange++;
                    }
                    else if (alphas[maxRange - 1] >= 255 || lastCharacterInvisible)
                    {
                        DIALOGUE.ConversationManager.userPrompt = true;
                        break;
                    }
                }
            }
            catch
            {
                Clear();
            }
            yield return new WaitForEndOfFrame();
        }
        

    }

try-catch 块用于非常特殊的情况 - 有时当我快速点击时(点击但不要像小说中那样跳过文本)会发生此错误(索引超出范围)。但这并不是每次都会发生,并且当没有 try-catch 块时就会发生问题。 我不太了解 C# 中的内存使用和 GC 角色,所以我显然不知道该怎么做

我在 Unity 中使用分析器来跟踪内存使用情况,所以这是结果,请检查图像

c# unity-game-engine memory garbage-collection
1个回答
0
投票

我忘记关闭另一个选项卡,这导致了双重渲染。原来是这个原因

© www.soinside.com 2019 - 2024. All rights reserved.