В прошлой статье мы говорили об элементе WebView андроид-приложений для реализация «костыля» по запуску HTML5 приложений на движке J2ds (Canvas API).
Сегодня речь пойдет снова об этом же элементе, а так же немного об оптимизации самих игр в HTML5.
HTML часть
В современных браузерах для отрисовки в canvas используются мощи видеокарты, но, не всегда по умолчанию они включены. Можно залезть в настройки браузера и проверить. Для того, чтобы элемент вызывал такую обработку, можно в HTML добавить элементы 3D трансформации объекта. Окей, лезем в исходники J2ds, и видим там строчки:
Ладно, допустим, включает.
Я рассматриваю все с точки зрения разработки с использованием фреймворка, вы же можете работать с чем-то другим, но, обратите внимание на эти нехитрые параметры, если ваш движок их не задает, то вы можете присвоить их элементу canvas через CSS, как классом, так и инлайн методом, ну или через JS.
Оптимизируйте ваш JS код. Избегайте частого обращения к DOM вашего приложения. Опять же, используя J2ds обращений к DOM нет вообще, и это, пожалуй, один из минусов движка, ибо он вообще отключает DOM при инициализации игровой сцены. Перенимает все обработчики и блокирует даже такие функции, как скроллинг страницы.
Не используйте setInterval / setTimeout / while(1) {}
Для анимации в HTML5 был введен requestAnimationFrame, введен был специально для анимации, поэтому он для этого и оптимизирован. Обратите внимание, как ваш движок использует обновление кадров, учитывает ли он fps, и как обрабатывает deltaTime.
deltaTime — это временной фактор, который является переменной величиной времени, прошедшего с последнего кадра. Опять же, так как стандартный WebView в Android не слишком быстр (в отличии от WebView+ от Chromium), то ограничивать FPS в игре лучше в пределах 25 — 40 кадров в секунду.
Android часть
Так же, в прошлой статье я уделял внимание созданию обертки для вашей игры в Android Studio, и, не отходя от этого подхода, рассмотрим вариант создания именно такого приложения.
Тут с оптимизацией все немного проще, в алгоритмы лезть не нужно, да и работа сводится к тому, что просто добавляем некоторые параметры для Android-приложения.
В манифест игры нужно добавить следующий флаг:
Это подключит видеокарту для обработки всего происходящего на экране, но, прежде чем включить ее в релиз, сперва хорошо протестируйте, для некоторых приложений может сделать только хуже.
Следующее, что можно сделать — это отключить акселерацию в элементе WebView:
Чтобы работало корректно, нужно в список импортов добавить View.
Такие вот несложные средства оптимизации я накопал. На этом пока все.
Прошлая статья: Создание HTML5 игры в Android Studio
И позапрошлая: Создание HTML5 игры в Intel XDK
Сегодня речь пойдет снова об этом же элементе, а так же немного об оптимизации самих игр в HTML5.
HTML часть
В современных браузерах для отрисовки в canvas используются мощи видеокарты, но, не всегда по умолчанию они включены. Можно залезть в настройки браузера и проверить. Для того, чтобы элемент вызывал такую обработку, можно в HTML добавить элементы 3D трансформации объекта. Окей, лезем в исходники J2ds, и видим там строчки:
canvas.style.WebkitTransform= 'translate3d(0,0,0)';
... много подобных параметров
canvas.style.transform= 'translate3d(0,0,0)';
Ладно, допустим, включает.
Я рассматриваю все с точки зрения разработки с использованием фреймворка, вы же можете работать с чем-то другим, но, обратите внимание на эти нехитрые параметры, если ваш движок их не задает, то вы можете присвоить их элементу canvas через CSS, как классом, так и инлайн методом, ну или через JS.
Оптимизируйте ваш JS код. Избегайте частого обращения к DOM вашего приложения. Опять же, используя J2ds обращений к DOM нет вообще, и это, пожалуй, один из минусов движка, ибо он вообще отключает DOM при инициализации игровой сцены. Перенимает все обработчики и блокирует даже такие функции, как скроллинг страницы.
createScene(); // После вызова этой функции отключается скролл, элемент канвас становится единственным активным объектом
initInput(); // после вызова этой команды отключается обработка всех событий, на них реагирует только движок
pauseGame(); // Возвращает все обратно
stopGame(); // Аналогично, возвращает все обратно, но уничтожает все данные, что накопились за игру
Не используйте setInterval / setTimeout / while(1) {}
Для анимации в HTML5 был введен requestAnimationFrame, введен был специально для анимации, поэтому он для этого и оптимизирован. Обратите внимание, как ваш движок использует обновление кадров, учитывает ли он fps, и как обрабатывает deltaTime.
deltaTime — это временной фактор, который является переменной величиной времени, прошедшего с последнего кадра. Опять же, так как стандартный WebView в Android не слишком быстр (в отличии от WebView+ от Chromium), то ограничивать FPS в игре лучше в пределах 25 — 40 кадров в секунду.
startGame(GameState, 25); // стартует игровую сцену в игровом состоянии GamState с 25 fps
Ну или...
… если разрабатываете игру для компьютера, можете указать 60fps.
Android часть
Так же, в прошлой статье я уделял внимание созданию обертки для вашей игры в Android Studio, и, не отходя от этого подхода, рассмотрим вариант создания именно такого приложения.
Тут с оптимизацией все немного проще, в алгоритмы лезть не нужно, да и работа сводится к тому, что просто добавляем некоторые параметры для Android-приложения.
В манифест игры нужно добавить следующий флаг:
android:hardwareAccelerated="true"
Это подключит видеокарту для обработки всего происходящего на экране, но, прежде чем включить ее в релиз, сперва хорошо протестируйте, для некоторых приложений может сделать только хуже.
Следующее, что можно сделать — это отключить акселерацию в элементе WebView:
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Чтобы работало корректно, нужно в список импортов добавить View.
Такие вот несложные средства оптимизации я накопал. На этом пока все.
Мнение автора счет всей этой идеи
Вообще, HTML5 для Android очень сырой, во всех смыслах, и если в браузерах его использование еще оправдано, то вот в мобильниках — нет. Для этого лучше всего использовать стандартные средства Android.
Там так же есть CANVAS, Bitmap, Paint и куча методов для рисования, построить на их основе несложный класс и пользоваться им для рисования — очень просто, и (что важно) очень производительно.
Кроме того, через WebView есть проблема работы со звуком. Ее там просто нет. То есть она есть, если вы откроете игру, как обычную страницу, к примеру, в браузере на каком-нибудь сайте, но через WebView ее нет.
Тема использования HTML5 в Android больше актуальна для простых приложений, в которых есть красивый интерфейс, который средствами Android не так-то и просто реализовать по сравнению с HTML/CSS, однако для игр его использовать еще рано, но, вполне реально.
Я уверен, что в будущем ситуация пересилит в сторону нормальной работы WebView, или предложит его альтернативу.
Там так же есть CANVAS, Bitmap, Paint и куча методов для рисования, построить на их основе несложный класс и пользоваться им для рисования — очень просто, и (что важно) очень производительно.
Кроме того, через WebView есть проблема работы со звуком. Ее там просто нет. То есть она есть, если вы откроете игру, как обычную страницу, к примеру, в браузере на каком-нибудь сайте, но через WebView ее нет.
Тема использования HTML5 в Android больше актуальна для простых приложений, в которых есть красивый интерфейс, который средствами Android не так-то и просто реализовать по сравнению с HTML/CSS, однако для игр его использовать еще рано, но, вполне реально.
Я уверен, что в будущем ситуация пересилит в сторону нормальной работы WebView, или предложит его альтернативу.
Прошлая статья: Создание HTML5 игры в Android Studio
И позапрошлая: Создание HTML5 игры в Intel XDK