Найти тему
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 минута