Искать

Чего НЕ делать в Unity: избегайте самых распространенных ошибок

Last updated: December 2018

What you’ll get from this page: A guide that you will want to reference throughout your development. Follow these great tips from Unity field engineer Valentin Simonov that will help you set up a smart and efficient development pipeline, and ultimately ship better and more performant content.

Планирование

The most important part of any software development project because decisions made in the this phase will be difficult to change later on in the development cycle.

Недостаток исследования перед началом проекта

  • Убедитесь, что все запланированные фичи действительно работают на все целевых платформах.

The minimally supported devices for your project aren’t specified

  • Define the minimally supported device(s) for your content.
  • Сделайте их доступными для своих групп разработки и контроля качества.
  • Сделайте это, и вы сможете задать реалистичную производительность и кадровый бюджет.

Бюджеты кадров и ассетов не заданы на ранней стадии.

  • Определите бюджеты для:
    • моделей — сколько вертиксов моет отрендерить целевое устройство?
    • ассетов — сколь детальными должны быть модели и текстуры?
    • скрипты и рендеринг — какой % кадра у вас отводится на логику, рендеринг, эффекты и прочие подсистемы?

Еще советы:

Оптимизация графической производительности

Моделирование персонажей в целях оптимальной производительности

Декомпозиция сцен и префабов не установлены на ранней стадии.

... или (иными словами) все работают в одной и той е сцене.

  • Разбейте уровни на (аддитивно загружаемые) сцены.
  • Переместите отдельные объекты в префабы и редактируйте и в отдельных сценах.
  • Договоритесь об основном механизме блокирования сцены.

Процесс работы над ассетами плохо спланирован

Здесь все загвоздка в том, чтобы получать ассеты от художников согласно спецификациям.

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

Еще советы:

Руководство по наилучшим практикам обращения с ассетами

Unity Asset importing

Ваши процессы сборки и контроля качества не согласованы

  • Set up a build machine, or, turn on and set up Unity Teams.
  • Как фича будет публиковаться в релизной сборке?
  • Как тестируются новые сборки?
  • Тестирование проходит автоматически?
  • Записывается ли статистика?

Unity setup Cloud Build

Проект не начат с нуля после первоначального создания прототипа

After building a prototype and getting it approved by the management, strongly consider starting it from scratch.

  • Решения, принятые в ходе создания прототипа, обычно делаются в спешке.
  • Негоже начинать проект на базе решения "танцев с бубном".

Unity-best-practices-planning

Разработка

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

Контроль версии не настроен должным образом

  • Используйте текстовую сериализацию (по умолчанию в Unity).
  • Set up built-in YAML merge tool. See more about SmartMerge здесь.
  • Set up commit hooks. See more сюда.

Сервер кэширования не используется

Статические данные хранятся в файлах JSON или XML

  • Это приводит к медленной загрузке.
  • Парсинг генерирует мусор.
  • Instead, for built-in static data use ScriptableObjects with custom editor tools.

Проект содержит неиспользуемые ассеты, плагины и дублированные библиотеки

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

  • Проверьте, какие зависимости ассетов и Asset Store вовлечены в проект. Вы можете быть удивлены, обнаружив, что в вашем проекте имеется 5 различных библиотек JSON.
  • У вас могут остаться устаревшие ассеты и скрипты из ранних прототипов.
  • The practice of moving old assets to "removed" folder still results in resources and scripts being built into the game.

Повторяющиеся действия требуют ручной работы

  • Для каждой повторяющейся задачи должен быть скрипт для ее автоматизации.
  • Make sure that you can "play" the game or interactive content from any scene.
  • Automate all the steps of build process, so that the application can be built with Cloud Build or locally with a press of a button.

Профилирование проекта только в редакторе

  • Always profile the content on your target device; if you profile in the Editor only, you can miss actual performance bottlenecks.

Unity Profiler

Неиспользование как встроенных, так и специфических для платформы инструментов профилирования и отладки

Еще советы:

Общие оптимизации производительности

Советы по профилированию и оптимизации шейдеров

Unity frame debugger

Профилирование и оптимизация выполняются слишком поздно в цикле разработки

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

Оптимизация не основывается на данных тестирования

  • Убедитесь, что ваша оптимизация нацелена на преодоление фактических "узких мест".
  • Используйте указанные выше инструменты, чтобы собирать нужные данные.

Не хватает знаний о ваших целевых платформах

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

Unity best practices development

Настройки ассетов

Ассеты (модели, текстуры, вуки) занимают больше всего места в вашей игре. Лишь одна неправильная сетка в проекте моет свести на нет все оптимизации, внесенные вашими программистами.

Атласы спрайтов не настроены правильно

  • Use 3rd-party tools (like Texture Packer) to create atlases or group sprites together in Unity. This will reduce the number of draw calls in the game.

Настройки текстур не заданы должным образом

  • Убедитесь что вам известны правильные настройки текстур для целевой платформы:
    • Какое сжатие поддерживает платформа?
    • Нужны ли текстурам MIP-карты?
  • Set up an automated way to apply these settings for new textures using AssetPostprocessor API as shown by в этом проекте
  • Предупредите художников, чтобы они не сдавали текстуры с неправильными настройками.

Unity Asset import settings

Asset Bundles содержит дублированные текстуры

  • It is easy to make a mistake in setting up Asset Bundles build system. Get good guidelines сюда. It is especially bad for duplicated textures.
  • Use браузер Asset Bundle to track dependencies.

Unity best practices asset settings

Программирование

Плохие практические подходы и ошибки в архитектуре кода и разработке приводят к низкой продуктивности.

Программный код очень абстрактен и в нем трудно разбираться

  • Код Abstract Enterprise редко оправдан.
  • В таком коде труднее разбираться.
  • Он работает медленнее, и IL2CPP должен генерировать больше кода.

Архитектурные соглашения не определены или плохо задокументированы:

  • Избегайте использования разных методов для выполнения одной и той же задачи, например, использования разных:
    • Конфигурационных форматов (файлы, свойства, ассеты).
    • События (события Unity, события C#, SendMessage).
  • Какой менеджер за какие объекты отвечает?

Нет полного понимания цикла в кадре Unity

  • Когда вызываются Awake, OnEnable, Update и прочие методы.
  • Когда обновляются сопрограммы.
  • Как выполняется FixedUpdate.

Логика инициализации скрипта опирается на порядок исполнения Unity

  • Либо "он и так работает", либо неправильная настройка Script Execution Order.

Частота смена кадров не принимается во внимание при скриптовании логики или анимации

  • Используйте Time.deltaTime, для скриптов, не зависящих от частоты смены кадров.

Еще советы:

3 крутых способа разработки игр с помощью скриптуемых объектов

Инструменты для исправления неполадок и понимания архитектуры

Unity best practices programming

Производительность центрального процессора

High CPU usage results in "laggy" gameplay experience and drains the battery faster.

Unity CPU Profiler

Слишком много скриптов используют вызов Update()

  • Native -> Managed calls have some overhead. See в блоге for more details.
  • Используйте настраиваемые менеджеры вместо этого.

Все настраиваемые поведения наследуются из абстрактного класса с определенными методами Update/Awake/Start

  • Теперь все ваши скрипты имеют метод Update().

Все игровые системы обновляются в каждом кадре

  • Define how frequently you want to update different systems in your game/content such as:
    • Перемещение объектов.
    • ИИ и поиск пути.
    • Регистрация и сохранение состояния игры.
    • Other "heavy" systems.

Не кэшируются часто требующиеся данные и ссылки на объекты

Кэшируйте часто требуемые данные:

  • Reflection
  • Find()
  • Camera.main
  • GetComponent()

Часто обрабатываемые объекты не включены в пул

  • Создание экземпляров объектов происходит медленно.
  • Создавайте пулы объектов в начале игры.
  • Повторно используйте объекты вместо того, чтобы создавать новые.

Память назначается в каждом кадре

  • Даже небольшие выделения в каждом кадре рано или поздно приведут к пикам GC.
  • Попытайтесь устранить ВСЕ назначения.

Используются API с назначением памяти вместо альтернатив без назначения памяти

  • LINQ.
  • Конкатенация строки.
  • Unity API с возвращением массивов:
    • Physics.RaycastAll, Mesh.vertices, GetComponents и т.д.

Еще советы:

Оптимальная работа со структурами данных C# и Unity API

Unity best practices CPU performance

Производительность графического процессора

High GPU usage results in low framerate, drains battery faster and the game/content is perceived as "running slow".

Unity GPU Profiler

Для мобильных платформ: в проекте слишком много перерисовки

  • Графические процессоры мобильных платформ могут прорисовывать лишь определенное число пикселей в секунду.
  • Перерисовка является одним из самых "узких мест" на мобильных устройствах.
  • Не прорисовывайте ненужные прозрачные изображения.
  • Используйте более сложные сетки, чтобы покрывать полностью прозрачные области.

Для мобильных платформ: слишком сложные шейдеры

  • Не используйте стандартный шейдер на мобильных платформах.
  • Создавайте настраиваемые специализированные шейдеры.
  • Используйте упрощенные версии, чтобы выключать некоторые эффекты на маломощных устройствах.

Слишком много динамического освещения используется с упреждающим рендерингом

  • Каждый источник света добавляет проход рендеринга для каждого освещаемого объекта.

Неправильные настройки в проекте разрушают динамическое пакетирование

  • Objects must be "similar" to be dynamically batched.
  • Покадровый отладчик показывает, почему определенные объекты не пакетируются.

Уровни детализации не используются или не настроены должным образом

  • LODs let rendering further objects take fewer resources

Еще советы:

Почему вызовы прорисовки не пакетируются

Наилучшие практические методы оптимизации для мобильных платформ

Unity best practices GPU performance

Производительность интерфейса пользователя

Unity UI - очень удобный и понятный инструмент, но его довольно легко настроить неправильно, так что он будет потреблять много ресурсов центрального и графического процессоров.

Unity UI

Не учитываются различные разрешения и соотношения сторон экрана

  • Протестируйте пользовательский интерфейс с различными разрешениями и соотношениями сторон экрана
  • Иногда лучше создать разные экраны пользовательского интерфейса для разных устройств

Анимированные элементы находятся на одном и том же холсте

  • Когда элемент меняется, на холсте должна быть создана новая комбинированная сетка
  • Для сложных холстов это может быть затратно по ресурсам
  • Переместите анимированные элементы, чтобы разделить холсты

"Opening" a new window is not optimized

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

Списки содержат большое количество элементов

  • Динамически повторно используйте элементы списка вместо того, чтобы создавать всех их одновременно.
  • Создайте вложенные холсты в списке.
  • Use open source implementations, such as эта.

Посмотрите:

Советы по оптимизации Unity UI

Unity best practices UI performance

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

Мы очень хотим знать, нравится ли вам наш контент.

Да, хочу больше Нет, могло быть и лучше

Unity Buffbot поможет вам

Подпишитесь, чтобы получать еженедельные сводки по техническим и креативным "ноу-хау" от экспертов Unity.

Subscribe
Согласен

Мы используем cookie-файлы, чтобы вам было удобнее работать с нашим веб-сайтом. Подробные сведения смотрите на странице политики обработки cookie-файлов.