我正在写一本视觉小说,我注意到一个问题。我的脚本很大(我的意思是有很多文本),游戏进程越多,我需要等待渲染文本的时间就越多。只是看起来越来越慢。 这是一张图片。它显示我保留了大约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 中使用分析器来跟踪内存使用情况,所以这是结果,请检查图像
我忘记关闭另一个选项卡,这导致了双重渲染。原来是这个原因