Unity 6.3
0 онлайн 42 гостей 3 в системе
Вход

Введение в детерминистические построения

Детерминизм сборки важен, если вы хотите иметь возможность повторить процесс сборки и получить один и тот же набор бинарных файлов. Создание детерминистической сборки обеспечивает соответствие нормативным требованиям для отраслей, требующих проверки бинарных файлов, и является полезным способом обеспечения того, чтобы пользователи не загружали неизменное содержимое. Детерминистические сборки облегчают обнаружение несанкционированных изменений, а также позволяют отслеживать ошибки до их точного состояния кода и ассетов.

Понимание недетерминистических построений

Недетерминистические сборки могут происходить в следующих ситуациях:

  • Во время импорта и преобразования ассетов: Недетерминистические построения могут происходить, когда Unity импортирует исходные ассеты и конвертирует их в internal format, или когда Unity конвертирует импортируемые ассеты в пакетные ассеты, такие как AssetBundles.
  • Сценарии редактора, которые собирают или модифицируют ресурсы во время сборки: Недетерминистические сборки могут происходить, если, например, инструменты или пользовательские постпроцессоры автоматически собирают ресурсы проекта и назначают их полям сериализированного массива внутри ScriptableObject. Если порядок объектов в этом массиве явно не сортируется, сериализированные данные могут отличаться между машинами или последовательными сборками.

Создание последовательности среды

Наиболее распространенной причиной недетерминированных сборок являются несоответствия в среде. Чтобы обеспечить согласованность среды, рассмотрите следующие вопросы:

  • Последовательные среды машин сборки: Обеспечение последовательности операционной системы и архитектуры CPU на всех машинах сборки. Поведение округления с плавающей запятой различается между архитектурами, что может изменить серийные значения с плавающей запятой, особенно в AnimationClips или импортированных данных Mesh.

  • Последовательные цепи инструментов: Используйте одну и ту же версию Unity Editor, версию Xcode и цепи инструментов для всех сборок. Небольшие изменения сериализации между версиями Unity могут изменить расположение байтов AssetBundle.

  • Отключить автоматическое преобразование новых строк в Git: Windows и macOS кодируют окончания строк по-разному, и автоматическое преобразование строк изменяет хэш файла и нарушает детерминизм. Чтобы отключить автоматическое преобразование, запустите следующую команду git:

    git config --global core.autocrlf false
    

Использование сервера кэша для сохранения детерминизма

Для достижения детерминистических сборок в Unity наиболее эффективным методом является принуждение всех машин к совместному использованию идентичных импортированных ассетов через Unity Ускоритель.

Когда несколько разработчиков подключаются к одному и тому же удаленному ускорителю, каждая машина повторно использует те же импортированные артефакты вместо повторного импортирования локально.

Ускоритель Unity имеет следующие ограничения:

  • Он кэширует только импортированные ассеты.
  • Он не кэширует встроенные AssetBundles или адресуемые артефакты сборки.
  • Преимущество детерминизма применяется к последовательности импорт-время, а не к повторному использованию AssetBundle.

Дополнительные ресурсы