Мобайл Lina Kuzmina
801

Как уместить Египет в телефоне?

Или опыт оптимизации компьютерной игры для мобильных устройств на примере Egypt: Old Kingdom.

В закладки
Аудио
Скриншот мобильной версии Egypt: Old Kingdom. Результат, которого мы достигли спустя более 30 билдов.

Всем привет! С вами Clarus Victoria. Мы - российская инди-студия, которая занимается созданием исторически достоверных игр. Все наши игры выходили как на ПК, так и на мобильных устройствах, и мы рады поделиться своим опытом и рассказать о проблемах, с которыми мы столкнулись.

Релиз Egypt: Old Kingdom на ПК состоялся 24 мая 2018 года. В минимальных системных требованиях значилось: 2GB памяти на жёстком диске и 4GB оперативки. Почти сразу после релиза мы занялись портированием игры на мобильные устройства. Результатом адаптацииигры мы оказались довольны только спустя более 30 билдов.

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

Была поставлена задача - добиться такого уровня оптимизации, чтобы игра занимала максимально 2GB, а в идеале 1GB оперативной памяти. Мы очень хотели сделать мобильную версию Egypt: Old Kingdom доступной для максимального количества мобильных устройств.

Ответ на вопрос "Что ужимать?" зависит от особенностей каждой конкретной игры. Оперативная память в играх расходуется на обработку графики, запоминание текущих состояний, поддержку интерфейса и др. Графика обычно первый кандидат "под нож", но если ПК-версия игры имеет большой и сложный мир, то его поддержка и обработка занимает больше памяти. Тогда разработчикам придётся задуматься о сокращении игрового контента. Так, например, пришлось поступить разработчикам Майнкрафт - уменьшить миры и урезать количество видов блоков. В таких ситуациях может пострадать логика игры и игровые механики, если они связаны с теми объектами, которые приходится урезать.

Так сложилось, что вEgypt: Old Kingdom действие происходит на небольшой территории Египта, и этот мир оказался не настолько большим, чтобы пришлось сокращать контент. Поэтому нам удалось полностью сохранить игровой процесс, включая все режимы DLC Master of History.

В случае с нашей игрой больше всего оперативной памяти занимала обработка 3D графики - более 2GB оперативной памяти. Сказалось и то, что это был наш первый опыт работы с 3D. Неоптимизированная версия игры при первом запуске на мобильных устройствах выдавала всего один кадр в 3 секунды на среднем планшете, и как выяснилось, всё это из-за наличия нескольких источников динамического освещения и отрисовки теней.

Карты Egypt: Old Kingdom создавались на более ранней версии Unity 5.5.6f1. Если описывать процесс создания карты упрощённо, то он будет выглядеть так: Unity имеет инструмент terrain (англ. - местность, ландшафт), который создаёт абстрактную ограниченную модель территории. Выглядит это, как простой прямоугольник. Затем в Unity можно загрузить карту высот требуемой местности - в нашем случае, карту высот Мемфиса. Результат всё ещё не похож на карту, ведь там нет никаких текстур. Полученная территория раскрашивается текстурами, настраивается освещение, дорабатываются разные мелочи, чтобы всё выглядело красиво, и после многих других манипуляций получается готовая карта. Чем больше на карте текстур и объектов и сложнее освещение, тем больший объём памяти занимает её рендеринг.

Инструмент Terrain и карта Мемфиса в Unity. Общий вид.

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

Что касается большой карты Египта, то там изменений террейна не было вовсе, а значит, нечего было рендерить. В результате мы заменили карту Египта на2D изображение, что облегчило жизнь вычислительным мощностям.

Белые точки на карте - это камеры, с позиции которых происходит рендеринг

Несмотря на принятые меры, в нужное количество памяти ужаться так и не получалось. Проблемы возникали при продолжительной игре, когда построек на карте становилось много, и они занимали всё больше памяти. Тогда мы решили - раз уж дома всё равно по сути плоские (при этом некоторые регионы занимали в районе 2Мб), то надо написать скрипт, который будет рендерить дома района, вырезать из рендера по маске фон и сохранять его. В результате самый большой регион стал занимать в районе 100Кб, а учитывая то, что всего у нас более 100 вариаций районов и построек, суммарно получился вполне ощутимый результат. И это позволило нам, наконец, втиснуться в память устройств.

Отрендеренный район города без подложки

В итоге мы достигли того, что игра стала занимать где-то 1.5GB, и сочли это достаточно хорошим результатом, пригодным для большинства мобильных устройств. В системных требованиях к Egypt: Old Kingdom мы указали 2GB, так как у устройства есть операционка и фоновые процессы, которые тоже где-то живут и занимают память.

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

Мы многому научились в процессе работы над этой оптимизацией и позже на основе полученного опыта сделали обновление и оптимизацию ПК-версии. Были оптимизированы части кода, загрузки данных в параллельных потоках, сборщики мусора и др.

Мобильная версия Egypt: Old Kingdom уже доступна в AppStore и Google Play, и мы сделали всё, что в наших силах, чтобы вам приятно было в неё играть!

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

Написать
Рубрика «Мобайл» на DTF развивается при поддержке
{ "author_name": "Lina Kuzmina", "author_type": "self", "tags": [], "comments": 15, "likes": 22, "favorites": 15, "is_advertisement": false, "subsite_label": "mobile", "id": 47286, "is_wide": false, "is_ugc": true, "date": "Thu, 18 Apr 2019 18:25:14 +0300" }
{ "id": 47286, "author_id": 59958, "diff_limit": 1000, "urls": {"diff":"\/comments\/47286\/get","add":"\/comments\/47286\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/47286"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 117230, "last_count_and_date": null }

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

Популярные

По порядку

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

Использовать terrain на мобилках сама по себе плохая идея. Проблема у вас скорее всего не в аллокациях, а вероятно в динамическом батчинге юньки, который крайне не эффективен на большом кол-ве мешрендереров. В любом случае, имеет смысл не городить костыли, а написать свой простейший батчинг по материалам при каждом изменении мира(например, при постройке нового здания) и рисовать всё это за один дип. Это серьёзно сократит кол-во переключений материалов и облегчит мобильный гпу.

Я как то клон майнкрафта по приколу пилил, запилил свой батчинг с сортировкой по материалам и рисовал весь мир в несколько дипов, получил >100 FPS даже на мобилках

Ответить
1

Извините, но в камере (по скрину) всего 30к тришек, и какой батчинг по материалам, если материал там нужен один и довольно-таки простой: текстурка + свет если в игре ночь нужна, а то можно и анлитом сделать. +даже старая версия юнити умеет в динамический батчинг с объектами до 900 вертексов, т.е. несколько кубов он прекрасно побатчит сам, а с учетом того что это статика, то кубы нужно помечать соответственно и их с еще большим профитом съест статический батчинг. т.е. велосипедов изобретать не нужно, все есть из коробки ;)

В террейне местами до 1.5кк тришек, да и в 5 версии юнити террейн не оптимизирован чуть менее чем полностью.

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

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

Ответить
0

Ну очевидно что там 30к треугольников только в кадре, остальное порезано фрустум куллингом =)

Далеко не всегда большой атлас 1024х1024 или 2048х2048 будет эффективнее сэмплится мелкой текстуры 128х128, особенно на мобилках, поэтому у меня сортировка по материалу. Динамический батчинг в юнити очень неэффективный(по крайней мере в unity 4) и сжирает весь CPU Time. В данном кейсе он делает только хуже.

Пол мира ходит с Mali 400

В террейне местами до 1.5кк тришек

Rly? Mali 400 не держит больше 150-200к треугольников. В среднем, Mali 400 соизмерим с десктоп гпу года эдак 2004, только с поддержкой sm3.

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

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

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

Ответить
0

От пост эффектов отказались в первую очередь =)

О какой сортировке по материалу речь? Если об overdraw (перерисовка одного и того же пикселя на экране несколько раз) который дико бьет по производительности на мобилках, то не в египте 2, не в примере с блоками о нем речи идти не должно, т.к. везде используется не прозрачные материалы (в блоках он материалов 1 шт), сортировать там нечего, если блоки перекрывают один - другой, то такое решается кулингом, в египте он не нужен т.к. все лежит на поверхности и никто ни кого не перекрывает.

второй скриншот блоков взят с более свежей версии юнити, где завезли gpu instancing из коробки, подобную оптимизацию можно сделать практически 1 галкой в материале.
Диванной аналитики здесь нет :) в новом проекте пока не применяя особых телодвижений в направлении оптимизации 2.7кк тришек с освещением и тенями вполне комфортно себя чувствуют.

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

Ответить
0

В своём кейсе я имел ввиду что у меня все материалы блоков - не атласы(несколько текстур в одной hw текстуре), а по материалу на блок. Таким образом, я сортировал по "текстуре" все блоки с одной текстурой, объединял их геометрию в один меш и рисовал за один дип.

Видимо сейчас уже завезли нормальный батчинг, раньше там было всё очень плохо с этим. Демка выше как раз на unity 4 =)

Но 2.4млн трисов это очень и очень много. На мали 400 игра загнётся.

Ответить
2

Зачем. Столько. Болда.

Хочется читать весь текст — читаешь бессвязные куски. В админке же куча опций для хайлайтов, ну

Ответить
0

Все повествование сводится к тому, что вы написали скрипт, который все сделал и все отлично. Куча воды и никакой конкретики, что и для чего. Тем более, зачем оставили несколько источников света с тенями, да ещё и на мобильных устройствах, не проще ли запечь все это дело?
А если у вас карта генерируется, то снова но слова об этом. Короче, куча воды с весьма пресным выводом.

Ответить
2

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

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

Ответить
0

Чем она собственно отличается от предыдущей Predynastic Egypt? Разница существенная ?

Ответить
0

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

Ответить
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" } } } ]
Гейб Ньюэлл наконец-то анонсировал то,
чего все так долго ждали
Подписаться на push-уведомления