Unity: Что выделяет память в моей функции? - PullRequest
0 голосов
/ 14 сентября 2018

Я относительно новичок в памяти и оптимизации.Мне было поручено оптимизировать существующий проект, и, глядя на профилировщик в Unity, я увидел, что есть функция, производящая кучу вещей для очистки GC.

Функция такова:

public bool AnyCanvasOpen()
{
    for (int i = 0; i < canvasList.Count; i++)
        if (canvasList[i].activeSelf && canvasList[i].name != "MainUICanvas")
            return true;

    return false;
}

, где canvasList - это просто список GameObjects.Что может быть причиной моего распределения 282B?

1 Ответ

0 голосов
/ 14 сентября 2018

Переменная canvasList представляет собой List из GameObject, а Unity's GameObject происходит от UnityEngine.Object, который имеет свойство name, которое вы используете.

Распределение памяти пришло от этого: canvasList[i].name != "MainUICanvas"

Это связано с тем, что свойство Object.name должно возвращать строку с нативной стороны, и это означает, что новая строка создается при каждом обращении к этому свойству. Вот почему была добавлена ​​функция GameObject.CompareTag, чтобы можно было сравнивать имя объекта без выделения памяти. Функция GameObject.CompareTag будет сравнивать имя объекта на нативной стороне без необходимости создавать или возвращать новую строку на стороне C #. Это удаляет выделение памяти.

К сожалению, большинство примеров кода Unity на своем сайте и в других местах используют Object.name вместо функции GameObject.CompareTag, которая заставляет больше людей чаще использовать свойство Object.name.

Это не должно выделять память:

List<GameObject> canvasList = new List<GameObject>();

public bool AnyCanvasOpen()
{
    for (int i = 0; i < canvasList.Count; i++)
        if (canvasList[i].activeSelf && canvasList[i].CompareTag("MainUICanvas"))
            return true;

    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...