Рендеринг текста в Unity приводит к огромной работе сборщика мусора и снижению производительности (низкий fps)C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Рендеринг текста в Unity приводит к огромной работе сборщика мусора и снижению производительности (низкий fps)

Сообщение Anonymous »

Я пишу визуальный роман и заметил проблему. Мой сценарий БОЛЬШОЙ (я имею в виду много текста), и чем больше я играю в процессе, тем больше времени мне нужно ждать, чтобы отобразить текст. он просто кажется все медленнее и медленнее.
Изображение
вот изображение. это показывает, что я резервирую около 2 ГБ. 2 ГБ для визуальной новеллы!! не могу в это поверить. вот функция рендеринга текста:

Код: Выделить всё

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.
Я мало что знаю об использовании памяти и роли GC в C#, поэтому понятия не имею, что делать< /p>
Я использовал профилировщик в Unity, чтобы отслеживать использование памяти, вот результат, проверьте изображение

Подробнее здесь: https://stackoverflow.com/questions/786 ... productivi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»