Нужна помощь с оптимизацией игры

Начинающий
Статус
Оффлайн
Регистрация
15 Апр 2020
Сообщения
64
Реакции[?]
9
Поинты[?]
0
Можете помочь оптимизировать игру?

Пожалуйста, авторизуйтесь для просмотра ссылки.
- ссылка на сцену
Пожалуйста, авторизуйтесь для просмотра ссылки.
- весь проект
vt -
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
3,414
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  1. Не используйте Свойства! Поля и методы — ваши лучшие друзья.

  2. Кешируйте все, что вы получаете через GetComponent<>, сюда же входят transforms, rigidbodies и др.

  3. Старайтесь никогда не обращаться к объектам дважды для получения одних и тех же данных. Почти всегда это доступ через Свойства, от которых необходимо отказываться. Зачастую можно увидеть как в разных скриптах запрашивается позиция одного и того же объекта, что лучше заменить на кеширование той самой позиции, обновляя ее один раз внутри Update или даже FixedUpdate в этом объекте.

  4. Кешируйте всю математику. Каждый вызов Vector.Up будет под капотом вызывать конструктор, что не очень быстро. Я создал статический CachedMath класс, в который были сложены все направления, часто используемые векторы и кватернионы.

  5. Попробуйте обходиться без использования типа String. Каждая строка требует выделения памяти, и при бесконтрольном использовании строк, вы увидите, как GC остановит все потоки для своего вызова. В моем случае основными источниками строк были индикатор FPS и таймер во время гонки. Решением стало создать пул строковых литералов для всех цифр от 1 до 100. Это полностью исключило выделение строк в каждом кадре.

  6. Никогда не используйте foreach, просто замените на for, если хотите сберечь GC и драгоценное время CPU. К тем же последствиям зачастую приводит и использование шаблонных методов(generics).

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

  8. Все строки используемые в Animator-объектах следует сконвертировать в целочисленные идентификаторы через Animator.StringToHash()

  9. Инстанциирование объектов является очень тяжелой операций, поэтому стоит для частых созданий использовать пул объектов и затем их переиспользовать.

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

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

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

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

Теперь GPU

С CPU советы были достаточно универсальны и они применимы в любом проекте. Чего не скажешь о GPU-оптимизациях, которые зачастую сильно зависят от конкретной сцены. Однако, если вы не используете сильной магии в своих шейдерах, то явный индикатор — это количество проходов GPU(pass-calls).

Моя игра содержит открытый мир с океаном как основой для передвижений и несколькими островами в качестве декораций. В моем случае проходов было больше 2000, и мне удалось снизить это значение до примерно 300.

Материалы. Уменьшайте количество используемых материалов насколько это возможно. Каждая смена материала это новый проход, также как и каждый текстурный слой внутри материала это тоже новый проход. Конечно, я несколько упрощаю и проходы формируются не так просто, но факт остается — слишком много проходов будут непомерно нагружать слабый GPU. Для мобильных устройств рекомендуют что-то в районе 40-60 проходов. Более продвинутые устройства могут обрабатывать и в районе сотни. Так что вам есть куда стремиться!

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

Импостеры. Я предпочел заменить мои объекты с помощью импостеров (в целом это очень похоже на биллборды, но это множество текстур полученных пререндером объекта со всех сторон). Во встроенном Asset-Store от Unity3d множество готовых платных решений для LOD и импостеров. Однако я решил воспроизвести базовый алгоритм самостоятельно. Я создал скрипт-расширение редактора, который создавал копию необходимого объекта, менял его слой, затем создавал камеру которая была ограничена только этим специальным слоем, и производил отрисовку объекта в текстуры со всех сторон. Были добавлены основные параметры, как название результирующей папки с текстурами, разрешение получаемых текстур, расстояние до объекта, смещение по высоте, количество сторон и флаг для сохранения или отключения освещения во время создания импостера. После того как все действия завершены, скрипт удалял уже ненужную копию объекта.

Спрайты. Теперь почти все объекты заменяются спрайтами на определенном удалении от камеры. Но количество проходов было все еще огромным. Тогда я обнаружил, что спрайты это далеко не всегда легковесная форма для отображения. Каждый спрайт по умолчанию триангулирует картинку, создавая множество вершин. На каждые 900 или около того(по официальной документации) вершин, создается очередной проход (официально группировка|пакетирование|batching — сохранение данных множества объектов в одну инструкцию для GPU — вообще неприменим к SpriteRenderer объектам). В то же время нельзя заменить все спрайты на полные квадратные регионы с прозрачностью, т. к. все прозрачные пиксели все еще требуют отрисовки, и GPU их не пропускает. Также прозрачность ведет к проблемам во время отрисовки всех спрайтов из-за проверки на глубину отрисовки. GPU все еще будет создавать дополнительный проход для одного или двух спрайтов, между отрисовкой множества уже сгруппированных только потому, что этого требует проверка по глубине. Единственное, что удалось сделать — это изменить тип спрайта на Multiple, что меняет внутренний механизм триангуляции, который создает намного меньше вершин.

Упаковщик спрайтов(SpritePacker). Это последнее о чем вы должны помнить при работе со спрайтами. Чтобы явно указать для спрайта необходимость упаковки в карту атлас, нужно указать его Tag. В момент отрисовки спрайтов из одного атласа GPU не создает дополнительных проходов, даже если порядок отрисовки по глубине не оптимален для неупакованных спрайтов. Размер результирующего атласа также важен. По умолчанию он ограничен значением в 2048х2048. Это максимальный размер атласа, и он динамически подстраивается под оптимальный, в зависимости от заполнения. В моем случае этого было недостаточно для упаковки всех необходимых мне спрайтов на одной странице. Замена алгоритма упаковки на собственный, который основан на базовом, но с измененным значением размера на 4096x2048 значительно улучшило производительность.

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

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

После всех изменений, производительность улучшилась настолько, что отключение всех объектов импостеров практически не влияет на результирующий FPS.
 
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2020
Сообщения
889
Реакции[?]
83
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У тебя оптимизаторов нет вообще, где прорисовка? лоды? порталы? и т д, там дохерища способов сделать оптимизацию, и вообще насколько мне известно кто этим занимается у тебя тупо бабок попросит, и правильно сделает ибо это потно.
 
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
3,414
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У тебя оптимизаторов нет вообще, где прорисовка? лоды? порталы? и т д, там дохерища способов сделать оптимизацию, и вообще насколько мне известно кто этим занимается у тебя тупо бабок попросит, и правильно сделает ибо это потно.
А если быть bigbrain, то полазив по форумам для юньки можно найти плагин который делает всё за тебя и не ебать себе мозг.
 
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
3,414
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У тебя оптимизаторов нет вообще, где прорисовка? лоды? порталы? и т д, там дохерища способов сделать оптимизацию, и вообще насколько мне известно кто этим занимается у тебя тупо бабок попросит, и правильно сделает ибо это потно.
Просто сам плагин продаётся на Unity(махазин)
 
BLESS
Забаненный
Статус
Оффлайн
Регистрация
26 Сен 2019
Сообщения
269
Реакции[?]
31
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
чел купи крысу чтоб бегала в компе .я не виноват если у тебя гарячка
 
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2020
Сообщения
889
Реакции[?]
83
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А если быть bigbrain, то полазив по форумам для юньки можно найти плагин который делает всё за тебя и не ебать себе мозг.
:NotLikeThis: Ты игры делал вообще? Ну иди поставь этот плагин и сделай ему оптимизацию, а мы оценим.
 
Секретный дизайнер своих продуктов.
Забаненный
Статус
Оффлайн
Регистрация
7 Фев 2020
Сообщения
603
Реакции[?]
130
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
3,414
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
:NotLikeThis: Ты игры делал вообще? Ну иди поставь этот плагин и сделай ему оптимизацию, а мы оценим.
Делал это раз, а два что плагин делает Lod систему для моделей пупсик
 
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2020
Сообщения
889
Реакции[?]
83
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Эх, жизнь — хоть за хуй
Забаненный
Статус
Оффлайн
Регистрация
8 Июл 2019
Сообщения
3,414
Реакции[?]
1,656
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Лоды примитивная часть оптимизации пупсик, буст от нее минимальный.
Facepalm (будем слушать тру) Ты проект видел ? Lod будет достаточно для начала, а если бы он понимал что делает он не стал бы обращаться на форум читеров и чсв
 
Забаненный
Статус
Оффлайн
Регистрация
16 Мар 2020
Сообщения
889
Реакции[?]
83
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Facepalm (будем слушать тру) Ты проект видел ? Lod будет достаточно для начала, а если бы он понимал что делает он не стал бы обращаться на форум читеров и чсв
Ну всякое бывает, может тут есть челики которым нехер делать и они за 5 сек накидают примеров лучше чем любое расширение.
 
Пользователь
Статус
Оффлайн
Регистрация
17 Июн 2020
Сообщения
196
Реакции[?]
150
Поинты[?]
2K
Ни один "оптимизатор" или "помощник" в магазине не сделает оптимизацию лучше тебя. (После прочтения соответствующей документации)
 
Начинающий
Статус
Оффлайн
Регистрация
10 Авг 2020
Сообщения
133
Реакции[?]
14
Поинты[?]
0
Что насчёт оптимизации для Unreal?

У меня небольшой проект, но fps довольно низкий: деревья с procedural foliage volume - с лодами, минимальный лод у меня уже на 3 уровне (400 полигонов), из 5 (биллборд). С каллингом на 20 метров (сцена такая, что на дальше не нужно).
Landscape небольшой, но у него шейдер имеет разные слои, а также тесселяцию. Всего использую на нём 5 слоёв, в принципе ничего не обычного.
Имеются аттаченные к игроку particle effect и динамичный источник света.
Если сцену поставить как Unlit - то всё будет идти довольно плавно. Если Lit - игра начинается с 30fps, после чего постепенно (я думаю, это тоже важно) падает до 1.
Освещение у меня целиком динамичное, ибо во-первых на 4.22 освещение не билдится вообще, во-вторых у меня имеется daynight cycle. Почему не использую поздние версии движка - 4.23 еще более забагован, а на 4.24+ убрали Gaussian Blur, что мне нужен для проекта.
Также имеется пост-процесс, с уже упомянутым блюром, lut-картой, AO эффектом, bloom и lens flares. Можно AO как-то запечь?
Как можно оптимизировать сцену?
 
Последнее редактирование:
Сверху Снизу