Unity 6.3
0 онлайн 57 гостей 3 в системе
Вход
Программирование в Unity Шаг 97 из 210

Передовые методы серийного кодирования

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

Безопасность потока

Мост Unity APIs может быть вызван только из главного потока. Не вызывать Unity APIs от конструкторов и полевых инициализаторов сериализированные типы потому что они работают на отдельном потоке загрузки.

В разработка построений, Unity выводит ошибку при попытке вызвать главный поток APIs из потока загрузки. В сборке выпуска код запускается без ошибок, но может вызывать сбои и другие неожиданные действия в приложении.

Тип: чтобы снизить риск ошибок во время сериализации, не вызывайте методы API, способные повлиять на состояние проекта или связанных объектов Unity. К безопасным для вызова API относятся Debug.Log и те, которые работают с простыми типами данных, такими как математические функции и Vector3.

Финалисты

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

Попытка серийного кодирования данных из финализатора может привести к неожиданному поведению и сбоям. Дополнительные сведения см. в документации Майкрософт по Финалисты.

Организация данных

Вы можете организовать свои данные следующим образом, чтобы обеспечить оптимальное использование сериализации Unity:

  • Стремитесь к тому, чтобы Unity сериализировал наименьший возможный набор данных. Цель этого не в том, чтобы сэкономить место на жестком диске вашего компьютера, а чтобы убедиться, что вы можете поддерживать обратную совместимость с предыдущими версиями проекта. Обратная совместимость может стать более сложной позже в разработке, если вы работаете с большими наборами серийных данных.
  • Никогда не позволяйте Unity серийизировать дубликаты данных или кэшируемые данные. Это вызывает значительные проблемы для обратной совместимости: это несет высокий риск ошибок, потому что данные могут выйти из синхронизации.
  • При добавлении полей, которые ссылаются на пользовательские классы или структуры C#, следует проявлять осторожность. Когда вы ссылаетесь на пользовательские классы или структуры C# в полях, Unity вставляет все содержимое объекта, на который делается ссылка, в сериализированные данные объекта, на который делается ссылка. Если эта структура становится сложной или глубоко вложенной, тогда может быть трудно перенести эти данные, когда вы измените структуру в будущем. Кроме того, данные из объекта могут легко непреднамеренно повторяться более чем один раз в сериализированных данных. Вместо этого, стремитесь сохранить структуру в ваших производных классах MonoBehaviour и ScriptableObject плоской и простой.
  • Способ совместного использования данных между Объектами заключается в использовании ScriptableObjects. Когда вы ссылаетесь на класс, производный от UnityEngine.Object (например, класс, производный от ScriptableObject), Unity сериализует только ссылку, а не весь граф объектов. Поэтому данные сериализуются один раз — в ScriptableObject, а не в каждой точке, которая на него ссылается. Аналогично можно использовать [SerializeReference] атрибут, если вам нужно сослаться на один и тот же пользовательский класс C# более одного раза внутри одного MonoBehaviour или ScriptableObject. Подробнее см. Сериализация пользовательских классов.

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