Разработка и адаптация игр под мобильные платформы

Адапта́ция (от лат. adapto - приспособляю) - процесс приспособления к изменяющимся условиям внешней среды.

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

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

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







Вот и прогноз рынка персональных систем показывает, что настольные ПК выходят из моды, на смену им идут мобильные. Объемы их продаж будут расти из года в год. Так же наблюдается смещение рынка в сторону ультрабуков, как наиболее мобильных среди мобильных. По пессимистичным прогнозам их продажи к 2015 году составят более 50 миллионов штук в год. По оптимистичным - около 150-ти.







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










Первый опыт


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







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

Определение параметров системы


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


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

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

  • Определение параметров GPU, основанное на DeviceString. Эта строка может меняться в драйверах от версии к версии.




pFactory->EnumAdapters( FIRST_GFX_ADAPTER, &pAdapter ) ;

{

   DXGI_ADAPTER_DESC adapterDesc;

   pAdapter->GetDesc( &adapterDesc );


   *VendorId = adapterDesc.VendorId;

   *DeviceId = adapterDesc.DeviceId;

}









Но и данное решение является неполным. Для последних моделей Intel HD Graphics базоая частота отличается, она может составлять 350 МГц или 650 Мгц (в зависимости от модели) в нормальном режиме и 1100МГц и 1300МГц в режиме турбо. Для получения более полной картины так же необходимо учесть и частоту.


pDevice->CheckCounter( &Description, &Type, &SlotsRequired, sName, ……) ;

if ( strcmp(sName ,"Intel Device Information“) == 0 )

{

	………

	pImmediateContext->GetData(pCounter, pData, sizeof(SQueryDeviceInfo), NULL);

	*pGPUMinFrequency = (SQueryDeviceInfo*)pData[0]->GPUMinFreq;

}









Более подоробный пример с исходниками можно найти на странице GPU Detect

Рендеринг с динамическим разрешением



Разрешение экрана может стать следующим узким местом. Чем больше разрешение, тем больше ресурсов потребуется системе для вывода картинки на экран. Например, отношение количества пикселей на экране между WXGA и WQHD, равняется четырем. Т.е. потребуется рендерить в четыре раза большую сцену, потребуется в четыре раза больше памяти. Решением может стать рендеринг с динамическим разрешением. В общих чертах суть метода заключается в рендеринге сцены с меньшим разрешением с последующим масштабированием картинки до требуемого разрешения.







Более подробно об этом методе можно почитать здесь - http://software.intel.com/ru-ru/articles/dynamic-resolution-rendering-article/


Специфические советы по оптимизации 3D графики на Intel GPU, как и рассказ об особенностях, производительности и развитии Intel HD Graphics можно почитать в этой статье - http://habrahabr.ru/company/intel/blog/144486/

Жизнь на батарее



Разработчик учел все техники оптимизации и адаптации игры под мобильные платформы, и пользователь получил игру, в которую можно и хочется играть. Что дальше? Позволить играть как можно дольше, т.к. это может быть интересно не только игроку, но и разработчику. Сейчас многие игры предлагают покупку игровых объектов за реальные деньги. В таких случаях выражение "время - деньги" принимает для разработчика буквальный смысл.

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







Лидером является экран, за ним следует процессор, память и т.д. На экран, вроде бы, повлиять никак нельзя, попробуем разобраться с CPU.

Процессор может находиться в различных состояниях, которые условно можно разделить на активное и состояние простоя. Основное энергопотребление приходится на активные состояния, плюс на переход из одного состояния в другое. Логика подсказывает - для того, чтобы минимизировать потребление процессор как можно дольше находиться в состоянии простоя и как можно реже переходил из одного в другое. Добиться этого можно следуя двум правилам:

Делай как можно быстрее




  • Используя расширенные наборы инструкций (SSE, SSE2, AVX)

  • Используя параллелизм



Делай как можно реже




  • Объединяя периодические задачи

  • Уменьшая частоту выполнения задач



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







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

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

Плохой пример




while(1)

{

	if(bDoSomething == TRUE)

	{

		DoSomething();

	}

	Sleep(100);

}



Как правильно




while(1)

{

	WaitForSingleObject(someEvent);

	DoSomething();

}



Более подробно об энергоэффективности и оптимизации можно почитать в этой статье - http://habrahabr.ru/post/134559/.

Неоправданно высокий FPS



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

До ограничения











После









Если жанр вашей игры позволяет (например, не 3D шутер) - попробуйте поэксперементировать с FPS, возможно пользователь не заметит разницы, а в замен получит долшее время игры при работе ноутбука от батареи.

Адаптация к мобильности



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


  • Ноутбук может быть отключен от сети питания

  • В процессе игры может быть применена схема питания, предполагающая худшую производительность в обмен на продление времени работы от батареи

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



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

Для отслеживания подобных событий, связанных с питанием, в Windows можно отслеживать событие WM_POWERBROADCAST. Так же можно подписаться на уведомления об изменениях с помощью вызова функции RegisterPowerSettingNotification(). После вызова функции приложение будет знать о произошедших событиях и сможет их правильно обработать.

Все под контролем



С целью облегчить получение различной информации, специфичной для мобильных платформ, компания Intel предлагает бесплатный Intel Laptop Gaming TDK. Используя простое API, вы можете получать информацию о:

  • текущей схеме питания

  • состоянии батареи

  • состоянии беспроводного подключения

  • и многое другое...



Более подробно о том, что предлагает Intel Laptop Gaming TDK, можно прочитать здесь: Intel Laptop Gaming TDK

Как это можно применить в играх? Просто представьте, что в интерфейсе игры появились следующие элементы







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

Заключение



Для того, чтобы сделать вашу игру более дружественной к мобильным устройствам:


  • Тестируйте ваши игры не только на настольных, но и на мобильных платформах

  • Закладывайте адаптацию с самого начала

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

  • Учитывайте время работы от батареи

  • Не забывайте о специфике мобильности



На этом все, желаю вам удачи и творческих успехов!
For more complete information about compiler optimizations, see our Optimization Notice.
Categories: