Технологии курильщика
Часть 1
Поговорили о людях, пора и технологии обсудить. Всё-таки программист я или где?
Развитие движка Unity я наблюдаю ещё с 4 версии. И вот складывается такое ощущение, что компанию изнутри разрывает какая-то техно-шизофрения. И каждая новая крупная фича с трудом вписывается в то, что уже есть. Начиная от GUI: был Unity GUI, потом появился купленный (не самый лучший) uGUI (бывший nGUI), абсолютно меняющий подход к построению GUI и несовместимый с предыдущим, сейчас есть третья итерация, живущая своей жизнью - UIToolkit. Отдельно живёт проект Tiny (и не помер ли он ещё часом?). И вот в далёком 2019 появляется DOTS, переворачивающий процесс разработки с ног на голову. Изначально подход был выбран скорее правильно, чем нет. Ставка на производительность, data-driven, генерация кода, вот это всё. Начал я ковырять DOTS (не путать с дотой) практически с первой публично доступной версии. И даже выпустили АА игру с его использованием для симуляции логики. Ох, сколько я тогда огрёб проблем с моим тогдашним тимлидом. Пришлось записывать обучающие видео, проводить воркшопы, лишь бы человек, тратящий месяц своей работы на таску по переименованию переменных, понял, что же это за зверь такой. Затем выходит Entities 0.5 - полностью меняется API, полностью меняется подход к подготовке ассетов. Затем 1.0 - то же самое второй раз. Но теперь с обещанием, что ну теперь-то уж точно всё, готовый продукт бери и делай. Взял я его твёрдой рукой, прижал к себе и нежно прошептал на ушко… в смысле вкрутил. Тем более задача как раз требующая высокой производительности: много юнитов с физикой на лоу-энд мобилках. Времени делать специализированную физику не дали, поэтому бери, что есть, и докручивай. И KPI - меньше 1% хард-крашей на всех устройствах. И вот вскрылась целая куча проблем, часть удалось закрыть через нытьё на форумах Unity и последующее обновление редактора (а обновление даже минорной версии Unity - это всегда боль и страдания и кровь из жопы), где нам обещали, что ну теперь-то точно всё пофиксили. Остался последний краш, который ну никак не хотел уходить. Проявлялся только на андроид-устройствах с ARMv7 архитектурой. Что внезапно оказалось 10% аудитории. Как выяснилось, на ARMv7 до сих пор выпускают мобилки, даже крупные бренды типа Samsung. В 22 году, например, они выпустили целую линейку A13, M13 и ещё целый зоопарк от производителей поменьше. Видимо, разрывы цепочек поставок и дефицит отдельных составляющих заставили производителей даунгрейднуть свои производства, ну или решили впарить пользователям говно мамонта под видом корейского шоколада. И краш-то ещё неприятный - выстреливает в рандомных местах. Проявляется только вот на этих устройствах, но всегда со стопроцентной вероятностью в течение первых 1-5 минут игры. Бинарный поиск через комментирование половины кода не дал результатов - менялось только время до краша, но сам косяк был неизбежен, как понос после мексиканского ресторана. В итоге опытным путём установил - проблема в Burst. Специальный компилятор/оптимизатор для ускорения работы кода. Выяснилось, что при компиляции Burst систем ECS генерится неправильный код для адресации в unmanaged память на 32-битных платформах. Покрыл ifdef'ами все наши системы для 32 бит - не помогло. Стало вылетать внутри Havok, Unity Graphics и прочих системах Unity. А их форкать ну уж совсем не хотелось. В итоге волевым решением был сделан форк самого Burst, где он отправлялся спать при компиляции под 32 бита, так как заботливые разработчики Unity не предоставили возможности отключить его для отдельной архитектуры. И всё. Краши исчезли, игра держит стабильные 99-99.5% безкрашевых пользователей. Вроде в ченджлогах Entities 1.2 пишут, что они исправили уже эту проблему. Оказалось, они неправильно определяли архитектуру устройства при компиляции. Но обновлять Unity перед релизом - лучше на бутылку сесть. Так что живём пока так.
Post #10
135
