Повышение фпс в assassins creed unity. Используйте правильные параметры сжатия и загрузки для аудио. Сложные математические операции

Если у вас возникают подвисания в Assassin"s Creed Unity или игра показывает довольно низкий FPS, то скорее всего мы поможем вам разобраться с этой проблемой.

Согласитесь, что неудивительно то, что Assassin"s Creed Unity у многих тормозит. Если вам не известно, но эта часть серии сделала существенный шаг вперёд по сравнению с предыдущими частями. Дело в том, что впервые в игре используется масштаб реальных зданий к игроку в соотношении 1:1. Именно поэтому игра имеет высокие системные требования и необходимо осознавать, что если ваш компьютер имеет характеристики ниже минимальных, то работа игры без тормозов гарантироваться не может . Поэтому сперва мы предлагаем вам проверить ваш компьютер на соответствие этим системным требованиям Assassin"s Creed Unity:

Система : Windows 7 SP1, Windows 8/8.1 (64-bit)
Процессор : Intel Core i5-2500K @ 3.3 GHz или AMD FX-8350 @ 4.0 GHz
Память : 6 GB RAM
Видеокарта : NVIDIA GeForce GTX 680 или AMD Radeon HD 7970 (2 GB памяти)
DirectX : 11
Жёсткий диск : 50 GB

Если комп подходит, то всё нормально и есть неплохие шансы избавиться от тормозов и зависаний в Assassin"s Creed Unity. Но если у вас не проходят один или несколько критериев, то гарантий мы никаких давать не можем, хотя производительность в игре улучшим однозначно!

Ниже мы перечислим в пунктах действия, которые вам необходимо выполнить для улучшения быстродействия в Assassin"s Creed Unity:

1 . Понизьте настройки графики в Assassin"s Creed Unity. Не бойтесь этого сделать. Снизьте большинство параметров и после снижения смотрите как это повлияло на скорость в игре и зависания. Поэкспериментируйте с настройками и вы сможете на них добиться более высокой производительности за счёт уменьшения красоты графики (Одно без другого... увы..).


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

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

Какова стоимость графики

Графическая часть вашей игры нагружает в первую очередь две системы компьютера: GPU (графический процессор) и CPU (центральный процессор). Первое правило любой оптимизации: найти, где возникает проблема , так как стратегия оптимизации для GPU и CPU имеет существенные различия (иногда даже возникает ситуация, когда при оптимизации для GPU больше нагрузки ложится на CPU и наоборот).

Типичные узкие места и их проверка:

  • GPU часто ограничен филлрейтом (fillrate) или пропускной способностью памяти.
  • Запуск игры с более низким разрешением экрана увеличивает производительность? Тогда вы скорее всего ограничены филлрейтом GPU.
  • CPU часто ограничен количеством вещей, которые должны быть отрисованы, также известно, как “draw calls ”.
  • Проверьте показателль “draw calls” в окне Rendering Statistics ; если он составляет больше нескольких тысяч (для PC) или нескольких сотен (для мобильных устройств), то вам может потребоваться оптимизация количества объектов.

Less-common bottlenecks:

CPU optimization

В процессе визуализации любого объекта на экране CPU должен немного потрудиться: выяснить, какие источники света влияют на объект, настроить шейдер и его параметры, отправить коменды отрисовки графическому драйверу, который подготовит команды для отправки на видеокарту. Все эти операции могут быть не очень дешёвыми в своей сумме, если у вас есть много видимых объектов.

All this “per object” CPU usage is resource-intensive, so if you have lots of visible objects, it can add up. For example, if you have a thousand triangles, it is much easier on the CPU if they are all in one mesh, rather than in one mesh per triangle (adding up to 1000 meshes). The cost of both scenarios on the GPU is very similar, but the work done by the CPU to render a thousand objects (instead of one) is significantly higher.

Reduce the visible object count. To reduce the amount of work the CPU needs to do:

  • Объединяйте близко расположенные объекты: вручную или используя инструмент draw call batching в Unity.
  • Используйте меньше материалов, объединяйте текстуры в большие текстурные атласы.
  • Используйте меньше объектов, которые должны визуализироваться несколько раз (отражения, тени, попиксельные источники света и т. п., смотрите ниже).

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

Однако, когда вы используете много пиксельных источников света при Forward rendering path , бывают ситуации, в которых не имеет смысла объединять объекты, это более подробно описано ниже.

GPU: Оптимизация геометрии моделей

There are two basic rules for optimizing the geometry of a model:

  • Не используйте треугольников больше, чем необходимо
  • Старайтесь держать количество швов на UV-карте и количество жёстких рёбер (удваивающих вершины) как можно более низким

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

В то время как количество геометрии в моделях оказывает влияние в первую очередь на GPU, некоторые функции Unity предполагают обработку моделей и на CPU, например mesh skinning.

Производительность освещения

Самое быстрое освещение - это то, которое не рассчитывается. Используйте карты освещения для запекания статичного освещения вместо расчёта освещения в каждом кадре. Процесс создания карт освещения требует много времени, чем простое размещения источников света в сцене, но :

  • Это намного быстрее работает (в 2–3 раза по сравнению с 2 пиксельными источниками света)
  • Это выглядит лучше, так как вы можете запечь глобальное освещение и с более высоким качеством

Во многих случаях можно заменить размещение источников света правильной настройков шейдеров и контента. Для примера, вместо размещения источника света прямо перед камерой для получения эффекта “подсветка краёв модели” (rim lighting), проще добавить расчёт этого эффекта прямо в шейдере.

Освещение в forward rendering

Освещение в forward rendering

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

Если вы используете пиксельное освещение, то каждлый меш будет визуализирован столько раз, сколько пиксельных источников света его освещает. Если вы объедините два меша, находящихся далеко друг от друга, то это увеличит габариты меша. Все пиксельные источники света, освещавшие каждую часть объединённого меша, будут освещать теперь этот меш, поэтому количество проходов визуализации, необходимое для этого меша, увеличится. Как правило, число проходов для объединённого меша равно сумме проходов для составивших его частей, в результате чего нет выигрыша от объединения. По этой причине не стоит объединять меши, которые достаточно далеко друг от друга, чтобы быть освещёнными разными пиксельными источниками света.

В процессе визуализации Unity находит все источники света вокруг меша и рассчитывает их важность для данного меша. В настройках Quality Settings можно задать, сколько источников света в конце концов может использоваться для освещения каждого меша. Для каждого источника света его приоритет вычисляется на основании расстояния до меша и яркости этого источника света. Также имеет значение параметр Render Mode внутри компонента Light, который может принимать два значения: Important или Not Important . Источники света, помеченные как Not Important имеют более низкий приоритет.

Для примера рассмотрим игру, где игрок управляет автомобилем, движущимся в темноте со включёнными фарами. Скорее всего, передние фары будут наиболее важным источником света в игре и параметр Render Mode будет установлен для них в значение Important . Задние огни будут менее важны, не оказывая значительного влияния на конечное изображения, так что для них Render Mode можно установить в Not Important , сэкономив тем самым аппаратные ресурсы.

Оптимизация пиксельного освещения сохраняет ресурсы и CPU и GPU: CPU делает меньше draw calls, а GPU обрабатывает меньше вершин и растеризует меньше пикселей для каждого дополнительного объекта.

GPU: сжатие текстур и мипмапы

Manually set per-layer culling distances on the camera

Это может быть достигнуто использованием системы Level Of Detail или ручной настройкой дистанции обрезки для камеры по слоям. Вы можете поместить мелкие объекты в отдельный слой и задать ему дистанцию обрезки, используя свойство Camera.layerCullDistances .

Тени в реальном времени

Тени в реальном времени хорошо выглядят, но они могут сильно снижать производительность, одновременно добавляя дополнительные draw calls для CPU и дополнительную обработку для GPU. Подробности даны на странице Shadows .

GPU: советы для написания высокопроизводительных шейдеров

Different platforms have vastly different performance capabilities; a high-end PC GPU can handle much more in terms of graphics and shaders than a low-end mobile GPU. The same is true even on a single platform; a fast GPU is dozens of times faster than a slow integrated GPU.

Имейте в виду, что производительность GPU на мобильных устройствах и PC начального уровня скорее всего будет намного ниже, чем на PC, который вы используете для разработки. Как правило, шейдеры нужно вручную оптимизировать, чтобы уменьшить количество расчётов и чтений текстуры для получения высокой производительности. Для примера, некоторые встроенные в Unity шейдеры имеют “мобильные” эквиваленты, которые работают намного быстрее за счёт некоторых ограничений и упрощений.

Сложные математические операции

Transcendental mathematical functions (such as pow , exp , log , cos , sin , tan) are quite resource-intensive, so avoid using them where possible. Consider using lookup textures as an alternative to complex math calculations if applicable.

Avoid writing your own operations (such as normalize , dot , inversesqrt). Unity’s built-in options ensure that the driver can generate much better code. Remember that the Alpha Test (discard) operation often makes your fragment shader slower.

Операции с плавающей точкой

While the precision (float vs half vs fixed) of floating point variables is largely ignored on desktop GPUs, it is quite important to get a good performance on mobile GPUs. See the Shader Data Types and Precision page for details.

Подробности о производительности шейдеров можно прочитать на странице Shader Performance .

Список шагов для увеличения производительности вашей игры

  • Сохраняйте количество вершин между 200 000 и 3 000 000 в каждом кадре, если целевая платформа - PC
  • Если вы используете встроенные шейдеры, проверьте категории шейдеров Mobile и Unlit. Они прекрасно работают и на немобильных платформ, но являются упрощёнными версиями более сложных шейдеров.
  • Уменьшите количество различных материалов в сцене - используйте один материал для нескольких объектов, где это возможно.
  • Установите свойство Static для неподвижных объектов, чтобы использовать внутреннию оптимизацию static batching .
  • Only have a single (preferably directional) pixel light affecting your geometry, rather than multiples.
  • Bake lighting rather than using dynamic lighting.
  • Используйте сжатие текстур, когда это возможно, а также отдавайте предпочтение 16-битным текстурами перед 32-битными.
  • Avoid using fog where possible.
  • Узнайте преимущества технологии Occlusion Culling и используйте её для снижения количества видимой геометрии и количества draw calls в случаях со сложными статичными сценами с большим количеством перекрывающих друг друга объектов. Планируйте свои игровые уровни с учётом этой технологии.
  • Используйте скайбоксы для имитации далеко расположенной геометрии.
  • Используйте пиксельные шейдеры или инструменты для совмещения текстур, чтобы смешивать текстуры вместо многопроходной визуализации.
  • Use half precision variables where possible.
  • Сводите к минимуму количество сложных математических операций в пиксельных шейдерах: pow , sin , cos и т. п.
  • Используйте меньше текстур.

См. также

Пример - создание плоскости-биллборда

Батчинг вызовов отрисовки (Draw Call Batching)

Производительность игры может очень важна, так как она позволяет охватывать множество платформ, в том числе низкопроизводительные. Jonathan Gonzalez делится секретам из собственного опыта, как сделать игру без багов и с нормальным fps.

Чаще всего довольно индивидуальный процесс, но есть общие пункты, на которые стоит обратить внимание.

Чем проще, тем лучше

Когда вы разрабатываете игру, вам нужно конкретно обозначить, что вам нужно включать и что не нужно.
Jonathan возвращается к старым скриптам или проектам и найти способы сделать что-то продуктивнее и проще.
Если же вы делаете игру впервые, всё равно помните об этом пункте, но не слишком ограничивайте себя.

Используйте Profiler

Прежде чем вы начнете удалять строки кода, очищать ненужные файлы и пытаться сделать все, что вам нужно, необходимо знать, что на самом деле вызывает проблемы с производительностью.
Profiler — отличный способ получить подробный обзор того, как ваша игра работает. Ищите его тут: Window>Profiler .

Во время игры вы должны держать это окно видимым. Он будет отображать такие категории нагрузку на CPU и GPU, рендеринг, физику, аудио и другое.

Правильно задавайте тип объекта

Всё, что появляется на экране, должно быть «нарисовано». Поэтому необходимо правильно задать тип объекта, чтобы не перегружать игру.
Static Batching используется для неподвижных объектов. Это означает, что объект не будет перемещаться, масштабироваться или вращаться.
Объекты, которые используют одни и те же материалы, будут объедены. Скорей всего это необходимо использовать, когда добавляете запечённый свет или что-то вроде навигационного объекта в свою игру. Поменять тип объекта можно в окне inspector-а.
Dynamic Batching используется для объектов, которые будут перемещаться. Подобно Static batching, он будет сочетать элементы с подобными материалами.
Существуют и другие типы объектов (например, скиненные мэши и Cloth).
Jonathan любит объединять мэши, когда это возможно. Вы можете использовать Mesh.CombineMeshes для этого.

Уменьшение разрешения и повторное использование текстур.

Множество текстур с высоким разрешением замедлят производительность. Текстуры нужно использовать правильно и по возможности объединять несколько объектов в одну большую текстуру.
Это обычная практика в AAA-играх. Таким образом вы можете уменьшить количество используемых текстурных карт, и упростить организацию. Например, игра Rage and Doom, с использованием Megatextures и виртуального текстурирования.

Используйте ограничение в рендере.

Мы можем сказать Unity не визуализировать объекты, которые скрыты. Это позволяет нам только визуализировать объекты, на которые у нас есть прямая видимость. Нет причин для рендеринга объекта в дальнем конце обзора нашей камеры, если мы не сможем увидеть его напрямую.
Для этого вы можете использовать Frustum Culling, Occlusion Culling и SECTR VIS.

Оптимизируйте видимые объекты.

LODs (Levels Of Detail) — способ рендеринга low poly сетки, когда она находится за пределами определенного расстояния.
MipMaps — это аналог LODs для текстур. Чем дальше текстура от камеры, тем меньше в нём разрешения.

Используйте правильные параметры сжатия и загрузки для аудио.

Unity поддерживает несколько типов аудио, по умолчанию он будет импортировать аудиоклипы для использования типа загрузки Decompress On Load вместе со сжатием Vorbis.


Для одного зацикливающегося аудиоклипа импортируемый размер составляет 3,3 МБ, что значительно увеличивает память, необходимую для нашей игры. Исходный размер — это количество ram, которое потребуется для воспроизведения этого клипа.
Звуковые эффекты обычно короткие и, следовательно, имеют небольшие требования к памяти. Для них настройка Decompress on Load будет работать лучше всего, но тип сжатия должен быть либо PCM, либо ADPCM. PCM обеспечивает более высокое качество, но поставляется с большим размером файла, что отлично подходит для очень короткого, но важного звукового эффекта. ADPCM имеет коэффициент сжатия в 3,5 раза меньше, чем PCM, и лучше всего используется для аудиоэффектов, которые используются очень часто, таких как шаги, удары, оружие и т. Д.
Для более длинных аудиоклипов, таких как фоновая музыка или другие большие файлы, лучше использовать сжатым в памяти, что приводит к распаковке файла прямо перед воспроизведением. Потоковая передача (streaming) — еще один вариант. Согласно документам Unity, потоковая передача использует минимальный объем памяти для хранения сжатых данных, которые затем постепенно считываются с диска.

Оптимизация физических вычислений.

В Unity вы можете использовать несколько разных коллайдеров, такие как box colliders, capsule colliders, mesh colliders, и различные 2D colliders. По возможности используйте примитивные коллайдеры. Это ваши основные формы для коллайдеров, такие как коробка, сфера или капсула.
Mesh Colliders принимают форму какой-либо сетки, которую вы указываете. Примером этого может служить человеческий персонаж с коллайдером, который соответствует их форме. Его следует избегать, если это возможно. Если без этого никак, создайте низкополигональную версию сетки и назначьте Mesh Colliders.


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


Объекты без Rigidbody считаются статическими коллайдерами и не должны перемещаться. Установите компоненты Rigidbody на «is Kinematic», если вы хотите переместить их самостоятельно без физики.
Вторая часть статьи

Статьи по теме: