Gamedev Andrey Apanasik
4 270

Советы от разработчиков Cuphead по оптимизации под Nintendo Switch

Отрисованная вручную 2D прелесть Cuphead совсем недавно была выпущена на Nintendo Switch. Unity поговорили с Адамом Винкелсом, разработчиком из Studio MDHR, чтобы узнать о подходе команды к оптимизации под эту платформу.

В закладки
Аудио

Перенос Cuphead на Nintendo Switch прошёл довольно гладко. Большая часть игры работала сразу из коробки, что позволило нам сосредоточиться на том, чтобы качество и производительность соответствовали нашим стандартам.

Адам Винкельс
Studio MDHR

Предварительный план для Nintendo Switch

Studio MDHR изначально планировали выйти на Nintendo Switch.

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

Необходимо профайлерить игру с ранних этапов

Использование профилировщиков для оптимизации под Nintendo Switch помогло создать плавный и отзывчивый игровой процесс, которым славится Cuphead.

Будьте в курсе узких мест в плане производительности в вашей игре. Studio MDHR использовали встроенный в Unity профилировщик и собственный CPU-профилировщик Nintendo для анализа кода, устраняя любее спайки и делая всё возможное, чтобы максимально снизить базовое использование процессора. Не бойтесь почаще использовать эти инструменты на ранних этапах разработки, чтобы избежать глобального рефакторинга архитектуры в будущем.

Снизить потребление памяти с помощью атласов

Первоначально в игре было более 45 000+ нарисованных от руки анимационных кадров, которые не были упакованы, но такой подход не очень эффективен. Используйте SpriteAtlas.

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

Преимущества AssetBundles

AssetBundles помогли Studio MDHR не только сократить общий размер игры, но также настроить процесс для будущих обновлений.

Постарайтесь использовать AssetBundles для как можно большей части своей игры. Для Cuphead команда расфасовала и сжала SpriteAtlases по различным бандлам. Это значительно уменьшило размер игры и очень помогло в соблюдении требований Nintendo к размеру патчей. Бандлы также помогают устаканить части игры, чтоб они меньше менялись между билдами.

Поколдуйте над механизмом загрузки шейдеров

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

Studio MDHR столкнулась с небольшими спайками производительности при спавне определённых врагов на Run ‘n Gun уровнях. После продолжительных поисков они поняли, что всему виной была загрузка шейдеров. К счастью, Unity предоставляет возможность предзагрузить шейдеры с помощью Shader Variant Collections, поэтому, хотя проблему было довольно сложно определить, её было легко исправить!

Танцы с бубном вокруг сборщика мусора

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

Хотя в Unity нет прямого способа контролировать размер кучи, вы можете заставить её расширяться, вручную выделяя память при запуске игры. К счастью, у них в запасе был определённый объём RAM для увеличения кучи, чтобы GC срабатывал каждые 15-20 минут. Учитывая, что они в придачу сами запускают сборку мусора при каждой паузе, загрузке или перезагрузке, а также потому, что Cuphead — очень сложная игра, крайне нежелательно, чтобы игроки, находясь на уровне достаточно долго, столкнулись с автоматической сборкой мусора непосредственно во время игры.

Вот и всё, котята!

Если хотите узнать больше о Studio MDHR и Cuphead (которая сейчас доступна на Nintendo Switch), посетите официальную страницу Made with Unity. Чтобы узнать больше о создании игр под Nintendo Switch, посетите портал разработчиков Nintendo.

#Cuphead #NintendoSwitch #unity #unity3d #оптимизация

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Andrey Apanasik", "author_type": "self", "tags": ["\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f","unity3d","nintendoswitch","cuphead","unity"], "comments": 58, "likes": 71, "favorites": 95, "is_advertisement": false, "subsite_label": "gamedev", "id": 47796, "is_wide": false, "is_ugc": true, "date": "Tue, 23 Apr 2019 12:16:04 +0300" }
{ "id": 47796, "author_id": 1922, "diff_limit": 1000, "urls": {"diff":"\/comments\/47796\/get","add":"\/comments\/47796\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/47796"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 64954, "last_count_and_date": null }

58 комментариев 58 комм.

Популярные

По порядку

Написать комментарий...
10

у вас ошибка в слове кал (проверочное слово колдовство)
Покалдуйте над механизмом загрузки шейдеров

Ответить
19

Андрей, проверяйте текст, перед тем как публиковать. Калдуйте, спайки. Спайки в русском это места пайки, а не всплески. Так клево запостить фоточку Фрейда, при том что оговорочка-то ваша, не моя.

Ответить
1

Спайки, всплески. Это не описка, это намеренно. Фрейд - самоирония.

Ответить
1

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

Ответить
0

У меня на этот счёт другая статистика. Но спорить не имеет смысла.

Ответить
0

Окай. Сори, неправильно интерпретировал. Я не против англицизмов, сам в силу профессии оч часто ими оперирую. И спасибо за текст в любом случае

Ответить
0

Если Cuphead вышла на Switch, Xbox и PC, то почему не вышла на PS4? Или я чего то не знаю? Просто любопытно стало

Ответить
0

вы наверное не у меня спрашивать должны, я как-то слабо отношусь к тем, кто может шейрить инфо об этом.

Ответить
0

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

Ответить
–1

Оу, ну вы это зря. В русском языке есть слово "спайка", которое означает совсем другое.

Ответить
15

На мой взгляд в статье именно про оптимизацию под Свитч ничего не говорится.

Ответить
3

Как уже выше отметили, они, вероятно, просто попиарили выход игры на Свич. Но, в любом случае, несколько общих полезных советов в статье, всё же, есть. Правда, они уровня elementary, да =/

Ответить
0

Про загрузку шейдеров не знал, а остальное есть в нинтендовских гайдах по оптимизации.

Ответить
0

Интересно. А вы авторизед под Свитч девелопер?

Ответить
2

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

Ответить
0

А можете ссылкой на гайды поделиться?

Ответить
0

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

Ответить
0

Аа, вот как, но спасибо за совет.

Ответить
1

Из той же категории, как и "спайки" в тексте...

Ответить
9

Отрисованная вручную 2D прелесть

2D прелесть

Русские люди так не разговаривают. Зачем вообще вставлять в текст нечто НАСТОЛЬКО корявое, портя впечатление от статьи с первого же предложения?!

Unity поговорили с Адамом Винкелсом

Это тоже крайне коряво звучит. Может "сотрудники Unity Technologies" или кто там у них официально.

"Профайлерить", "спайки", "2D прелесть" - то ли бот, то ли хипстер какой-то текст составлял :)

Ответить
3

4 класса церковно-приходской школы.

Ответить
1

Капхэд уже на релизе была оптимизирована донельзя (рендердок в помощь), этот пост - просто реклама свитчевой версии и не более, ничего полезного (кроме, наверное, запуска сборщика мусора при нажатии кнопки паузы, никогда не догадался бы так делать) там не найти

Ответить
2

Для нас да. Но новичками может и пригодиться.

Ответить
0

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

У меня и моих знакомых ещё где-то в середине нулевых выработался рефлекс при тормозах ставить игру на паузу на 15-20 секунд.

Ответить
0

В то время игры были на C++, там GC нету. Разве что, при паузе разработчики какие-то ресурсы из памяти выгружали.

Ответить
–1

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

Ответить
2

Вся графика из Metal Slug на аркадах поместится в один 8к (или 4к? не помню уже) текстурный атлас одного босса в Cuphead

Ответить
1

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

Ответить
2

Раньше и шейдеров то не было так то, если уж совсем быть предельно честными :3

Ответить
1

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

Ответить
0

Андрей старый, ему можно и разорвать. Понимаю что сейчас последует картинка Фрейда. Но вы же прекрасно понимаете что я имел в виду, то что он и так об этом прекрасно осведомлен, а не то что там все подумают Kappa

Ответить
0

Андрей старый

Мне только 30 скоро будет.

Ответить
0

Опять вы все истолковываете превратно, а не так как я это задумывал... Ахахаха, прекратите!

Ответить
0

(¬‿¬ )

Ответить
0

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

Почти 30 лет - это когда пришествие пиксельшейдеров он застал в 11-12 лет от роду. Сомневаюсь, что первый десяток лет он задумывался о технологиях рендера - а всю сознательную часть жизни он уже провел с шейдерами, так что незнание вполне объяснимо :)

Ответить
0

эх... подискутировал бы с вами на тему... но мне еще рвать шаблоны молодым... Хотя справедливо будет заметить, что я не гнушаюсь подобным относительно и людей в летах Kappa

Ответить
0

там пиксельные спрайты не очень-то высокого разрешения, а тут хайрес спрайты с кучей кадров + куча постобработки

Ответить
0

На любом СОВРЕМЕННОМ утюге, это важно. Для PS1 графику метал слагов, например, приходилось резать, равно как и в прочих портах с аркад.

Ответить
1

Чтот советы скучные, в стиле студенческих статей на хабре "сейчас я вам расскажу про синглтон".

Ответить
0

Про ассет бандлы и атласы да, но про GC и шейдеры не часто вижу статьи. Хотя, и тут, конечно, подробностей маловато =/

Ответить
1

Не знал, что игры для Свитча паяют :)

Ответить
0

"performance spikes" -> спайки. Чего не так то? Почему такая реакция только на этот англицизм? (。•́︿•̀。)

Ответить
0

Советую загуглить и посмотреть, что такое «спайки» :)
Никогда не встречался с такой неприятным англицизмом, вот и реакция.

Ответить
0

А в физиологии спайк— кратковременное колебание потенциала. Но это же совсем другая область =/

Ответить
0

Полезного мало :/ ну то есть все это и так в официальных презентациях с конференций есть.

Ответить
1

как только начинается что-то полезное (читай, технические подробности, вас тут же посылают на хабр или девелоперский форум) почти всем становится скучно :3

Ответить
0

У dtf были неплохие предпосылки, но теперь он постепенно превращается в мини-реддит.

Ответить
0

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

Ответить
0

Да и на хабре сейчас статей стоящих по пальцем пересчитать.

Ответить
0

Зачем heap переводить как "куча"? Вполне устоялось как есть.

Ответить
1

Где устоялось? В контексте Java/C# я чаще слышу именно стек/куча.

Ответить
0

Делал с нуля платформер на юнити (из любопытства) ровно один раз в жизни, и то узнал в процессе о большинстве советов выше. Ожидал каких-то более хитрых триксов, конечно

Ответить
0

Но если бы вы знали все эти нюансы вначале, то скорость разработки, скорей всего, возросла бы, не так ли?

Ответить
0

А разве это...Не эксклюзив?)

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fjog" } } }, { "id": 10, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-250597-0", "render_to": "inpage_VI-250597-0-1134314964", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=clmf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudo", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fzvc" } } } ]
В Steam появилась функция продажи
подержанных цифровых копий игр
Подписаться на push-уведомления