TGViewer
Григорий Дядиченко Григорий Дядиченко @dev_game · 2.66K subscribers
Post #1407 1.17K
"Оптимизация" проверки на null с GameObject
https://www.youtube.com/watch?v=wOPJR8gUs_w

Оптимизаторы... Или как сломать вообще всё. В общем. Некоторые советы слушать не надо, ну либо хотя бы задаваться главным вопросом: "Так стоп, а почему это быстрее?". Но это видео требует довольно подробных разъяснений. Итак, что предлагает автор. Есть три стула: 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% уверены, что в данном месте ссылка будет работать именно так. Поэтому такие "советы" это конечно самый простой способ себе выстрелить в ногу.

#новости
YouTube Null Testing - Unity Performance Tip - Optimization we all have lines of code in our project that test whether it's something is null or not, so which way is best to get the null reference? 🔥Simple Trajectory Prediction 3D/2D Unity - Without LineRenderer - Perspective and Orthographic: https://youtu.be/sDFCHTIdSIw…
  • 🔥 26
  • ❤‍🔥 1
More from @dev_game
  1. Oct 4, 2026💡 Вредные советы: Идея С тех пор как я открыл для себя чудесный мир элевенлабса (и это ка…
  2. Oct 4, 2026ТСПУ и телега Короче говоря как раз немного кул стори по следам теста. Спасибо кто там как…
  3. Oct 3, 2026Мой новый проект https://t.me/Mespoker_bot Поймал меня значит как-то Паша за покером и ска…
  4. Oct 1, 2026🤔 Как продвинуть игру? Я обещал. Я сделал. Получился большой документ с шагами и действия…
  5. Sep 29, 2026И тут продублирую раз прилетело несколько вопросов. Доступ к дневнику можно будет получить…
  6. Sep 29, 2026Да, чет не анонсировал. Остановил сбор. Ну в целом донаты показывают классические для меня…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →