47 подписчиков
"Оптимизация" проверки на null с GameObject
Оптимизаторы... Или как сломать вообще всё. В общем. Некоторые советы слушать не надо, ну либо хотя бы задаваться главным вопросом: "Так стоп, а почему это быстрее?". Но это видео требует довольно подробных разъяснений. Итак, что предлагает автор. Есть три стула: ReferenceEquals, оператор "is" и оператор "==". Автор предлагает использовать вместо оператора "==" функцию ReferenceEquals, так как она быстрее. И говорит, что она ещё и быстрее чем оператор "is".
Для начала разберёмся с самым простым. Оператор "is“ и ReferenceEquals — это одно и тоже. Быстрее у него получилось в пределах погрешности. На это можно не обращать внимания особого. В компайл тайме, если можно сделать эквивалентно, компилятор сделает эквивалентно. Тут как бы и с простыми объектами можно не париться.
А теперь поговорим про опасности замены == на ReferenceEquals в случае проверок геймобжектов на налл. Вообще изначально в шарпе явно ReferenceEquals используется в одном контекстуальном случае. Который странный, но в огромных системах имеет место быть. Дело в том что ReferenceEquals статический метод класса Object и его нельзя переопределить в отличии от операторов сравнения. Поэтому для устойчивости каких-то частей системы, когда конкретно интересуют нас именно ссылки, чтобы никто ничего не переопределил — можно использовать его явно. И собственно в Unity оператор "==" для GameObject переопределён. И работает совершенно не так, как ReferenceEquals. И поэтому он во много раз медленнее.
Отлично, значит это всё же ускоряет? Безусловно. С небольшой ценой. Ваш код работать будет весьма не ожидаемо.
Допустим давайте простой пример. Что будет выведено в лог, если у нас условный код. Объект в инспекторе не назначен:
[SerializeField] private GameObject _testNull;
private void Start()
{
Debug.Log(ReferenceEquals(_testNull, null));
Debug.Log(_testNull is null);
Debug.Log(_testNull == null);
}
Ну ответ достаточно простой: False, False, True. И таких случаев можно придумать много. А если уничтожить объект и так далее. И оно будет работать далеко не еквивалентно. Проверку на ссылку для оптимизации можно делать, если вы на 100% уверены, что в данном месте ссылка будет работать именно так. Поэтому такие "советы" это конечно самый простой способ себе выстрелить в ногу.
#новости
1 минута
26 февраля 2024