Тест Icy Rocks для Android: пришло время реальных испытаний

в 14:31, , рубрики: android, Icy Rocks Workload, Блог компании Intel, Разработка под android, тестирование, Тестирование мобильных приложений, метки:

Android OS, если сравнить её с Windows, Linux или OSX, система молодая. Однако, ей пользуются более миллиарда человек. Как именно они работают с Android? Как сделать систему быстрее и удобнее? Новизна платформы не позволяет дать чётких ответов на эти вопросы. Более того, сценарии взаимодействия пользователей с Android-устройствами и приложениями постоянно меняются, нередко – довольно сильно и неожиданно.

Тест Icy Rocks для Android: пришло время реальных испытаний - 1


Для исследования особенностей взаимодействия пользователей с различными программными и аппаратными комплексами создают особые тесты, так называемые варианты или сценарии использования систем (use cases). Их ещё называют «рабочими нагрузками» (workloads). Всё это – модели реально существующих сценариев работы, настоящими приложениями они не являются. В применении к Android, подобные тесты можно использовать для измерения и улучшения производительности.

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

Как результат, разработчики, оперируя результатами таких испытаний, не в состоянии выяснить, какие ощущения вызовет работа с тем или иным устройством у реального пользователя. Если оптимизировать систему, опираясь на подобные тесты, можно добиться впечатляющих показателей, что называется, «на бумаге» и оставить открытым главный вопрос: «А что это даст пользователям?».

Обзор Icy Rocks

Большинство тестов для Android исследуют систему в одном из двух основных направлений. Некоторые сконцентрированы на ограниченном наборе аппаратных особенностей устройств. Они разработаны для того, чтобы получить некие данные по конкретным компонентам или наборам компонентов SoC-платформ. Другие не привязаны к аппаратному обеспечению. Они сосредоточены на уровне Java-окружения, по факту, используя ограниченное количество функций. И те, и другие – это синтетические рабочие нагрузки, они не делают того же самого, что происходит в коде типичного реального приложения.

Стек исполнения приложений в Android отличается сложностью, поэтому при анализе производительности этой системы стоит отойти от устаревших узконаправленных методов и переключиться на новые. На те, которые более точно отражают особенности поведения людей. Если наша цель – ощутимо улучшить восприятие приложений человеком, нужны тесты, которые реализуют реалистичные сценарии работы с системой. А именно, нужно учитывать то, как пользователь работает с приложением, и то, как приложение взаимодействует с операционной системой, и, в конечном счёте, с аппаратным обеспечением.

Icy Rocks Workload – это графическое приложение, разработанное Intel, которое имитирует реальную игру на платформе Android. В проекте использованы физическая библиотека с открытым кодом JBox2D и графический движок Cocos2D. За вывод графики в Cocos2D отвечает OpenGL. Симуляцией перемещения объектов занимается JBox2D. На нём построена физика игрового мира, он ответственен за обновление позиций объектов и их взаимодействие.

В ходе теста измеряются несколько показателей. Первый – среднее количество кадров в секунду (Frames Per Second, FPS). FPS обычно используется для оценки плавности вывода графики. Среднее количество анимаций в секунду (Animation Per Second, APS) позволяет оценить производительность физического движка. Другие показатели – это среднее время обновления кадра (Frame Update Time), количество пропущенных кадров в секунду (Janks Per Second, JPS). Итоговые данные, собранные программой, выводятся на экран и записываются в лог-файл на устройстве.

Симуляция игры

Тест Icy Rocks для Android: пришло время реальных испытаний - 2

Icy Rocks в действии

Главный экран Icy Rocks насыщен спрайтами. Здесь льдины, хлопья снега, снеговик и катапульта. Катапульта бросает в снеговика куски льда. Их разделяет ущелье, туда скатываются снежинки и льдины. В нижней части ущелья стоит вращающаяся мешалка, которая не даёт скучать всему тому, что попало на дно. Нагрузка, которую игра создаёт на систему в ходе симуляции, постепенно возрастает. Достигается это добавлением кусков льда и снежинок.

Icy Rocks может выполняться в двух режимах. Первый – режим демонстрации, второй служит для тестирования. В демонстрационном режиме пользователь может добавлять на экран льдины и хлопья снега, касаясь экрана. В режиме тестирования всё выполняется автоматически. Куски льда и снежинки добавляются каждые 20 секунд с соотношением 2:5, программа не реагирует на касания экрана. Всего выполняется пять проходов теста, после чего выводятся итоговые результаты.

Три варианта Icy Rocks

Icy Rocks существует в трёх вариантах. Первый – для платформы Android, второй – для Oracle Java (JDK 8), третий представлен нативным приложением на C++. Внешний вид и анимация во всех трёх вариантах аналогичны.

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

Icy Rocs для платформы Android – это эталонная реализация. Icy Rocks для Java можно запустить на любом ПК под управлением Linux с установленной Java 8. Нативный вариант Icy Rocks использует C++-версии Box2D и Cocos2D-X.

Icy Rocks для Android и для Java можно запускать как в графическом режиме, так и в режиме CPU (non-GL). Последний вариант ещё называется Icy Rocks Workload for Kernel. Его применение позволяет оценить автономную производительность физического движка.

Запуск Icy Rocks

Icy Rocks для Android поставляется в виде одного пакета GameWorkload.apk. После установки и запуска приложения можно выбрать режим тестирования (benchmark) или демонстрационный (demo). В режиме тестирования всё выполняется автоматически, в конце работы сообщаются результаты. В демонстрационном режиме пользователь может взаимодействовать с программой.

Распределение нагрузки во времени в автоматическом режиме

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

Icy Rocks измеряет среднее число кадров, выводимых в секунду (FPS) при нагрузке различной интенсивности, затем вычисляется среднее геометрическое показателя на разных уровнях нагрузки. В ходе теста так же замеряется число пропущенных кадров в секунду (Jank Per Second, JPS) в различные моменты анимации. Термином «Jank» в Java-среде принято обозначать «рваную», «скачкообразную» анимацию.

Типичная продолжительность одного сеанса игры на Android – около 10 минут, поэтому тест рассчитан на выполнение примерно в течение 11 минут. Сюда входят и 10-секундные паузы между проходами теста. В рамках одного прохода нагрузка на систему, за счёт добавления кусков льда и снежинок, увеличивается. В начале на экране нет ни того, ни другого. Потом добавляется 20 льдин и 50 снежинок – и так далее. Когда нагрузка возрастает до заданного предела, делается 10-секундный перерыв и всё повторяется. Предусмотрено пять проходов теста, каждый занимает примерно две минуты. Вот как это выглядит на схеме.

Тест Icy Rocks для Android: пришло время реальных испытаний - 3

Схема проведения тестирования

При выполнении каждого из проходов теста подсчитываются упомянутые выше показатели. А именно:

Основные показатели (primary metrics).
— Количество анимаций в секунду.
— Частота кадров.

Дополнительные показатели (secondary metrics).
— Время обновления экрана в секундах на кадр.
— Количество пропущенных кадров.

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

Тест Icy Rocks для Android: пришло время реальных испытаний - 4

Результаты тестирования

Механизм работы Cocos2D для Android (Java)

При использовании Cocos2D для платформы Android игру приводит в движение главный цикл, в котором осуществляется обработка действий пользователя, реализация игровой логики (перемещение объектов, например), подготовка анимации и GL-команд, и, наконец – рисование нового кадра.

Тест Icy Rocks для Android: пришло время реальных испытаний - 5

Схема работы типичной игры

Механизм работы JBox2D

JBox2D – это библиотека симуляции взаимодействия твёрдых тел. С её помощью можно моделировать реалистичное поведение игровых объектов. JBox2D используется как подсистема реализации игровой логики в Cocos2D.

В играх, в качестве шага игрового мира, обычно используют 1/60 секунды. За моделирование физических взаимодействий в игровом мире отвечает JBox2D.

Всё начинается с определения всех объектов в игровом мире и установки прослушивателей событий. Затем выполняется инициализация сцены с точки зрения физического движка и подготовка функций обратного вызова. На каждом шаге игры, когда главный цикл вызывает JBox2D для обновления мира, осуществляется обновление позиций и скорости объектов.

Тест Icy Rocks для Android: пришло время реальных испытаний - 6

Схема работы физического движка

Игровые потоки

Типичное игровое приложение имеет два потока: главный (main thread) и поток вывода графики (renderer thread). Главный поток инициализирует приложение и игровой экран, а затем запускает главный цикл. Поток вывода графики вызывается при каждом рисовании сцены, так же он ответственен за вызов обработчиков событий. Вот некоторые сведения по этим двум потокам:

Главный поток
— Инициализация приложения (MainActivity.java).
— Инициализация игрового экрана (GameLayer.java).
    — Инициализация физических объектов в JBox2D и спрайтов в Cocos2D.
    — Установка прослушивателей событий столкновений объектов.

Поток вывода графики
— Стандартная функция обновления игрового мира (update() в GameLayer.java).
    — Выполнение шага игрового мира.
    — Проход по всем физически объектам и установка положения и угла поворота для соответствующих им спрайтов.
— Прослушиватель событий столкновений (postSolve в GameLayer.java) используется для реализации специальных эффектов.
    — Льдина разбивается на мелкие части, когда сталкивается с массивными объектами.
    — Анимированное отображение набранных очков при попадании льдины в снеговика.
— Обработчик касания экрана (ccToucherEnded в GameLayer.java) используется для добавления на экран снежинок и кусков льда.
— Функция для вывода статистики (showFPS в CCDirector.java).

Тест Icy Rocks для Android: пришло время реальных испытаний - 7

Схема работы Icy Rocks

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

Когда вывод изображения завершён, возможен небольшой период ожидания — пока не наступит время FrameTime. Это ожидание нужно для того, чтобы обеспечить стабильную частоту кадров. Например, если приложение способно выдавать 100 FPS, оно, благодаря такому подходу, само замедлится до требуемых 60 FPS. А оставшееся время можно потратить на реализацию более продвинутой игровой логики, на подготовку данных и прочие подобные задачи.

Обзор производительности Icy Rocks

Icy Rocks можно рассматривать как однопоточный Android-тест, работающий в потоке «GLThread» Android. В течение теста основное время уходит на исполнение кода из Android Runtime (ART) и на работу в низкоуровневых библиотеках OpenGL. Немного времени проходит в машинном коде Android, вызываемом через Java Native Interface (JNI) и System.arraycopy.

В ходе теста, фактически, исследуются возможности Android Runtime, графические возможности стека Android и аппаратные возможности SoC-платформы.

Тест Icy Rocks для Java требователен к арифметико-логическим операциям (ALU), к подсистеме прогнозирования ветвлений (сравнение чисел с плавающей точкой), к производительности буфера ассоциативной трансляции данных (DTLB) и кэш-памяти второго уровня (L2).

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

Что мы узнали и сделали благодаря Icy Rocks

В ходе экспериментов с Icy Rocks мы обнаружили, что физический движок JBox2D использует собственную реализацию методов стандартной библиотеки java.lang.Math. В ней задействованы огромные структуры данных для поддержки работы функций Math.sin() и Math.cos(). Мы рекомендуем внести в код JBox2D изменения, использовать стандартные методы java.lang.Math для достижения оптимальной производительности.

Кроме того, обнаружилось, что JBox2D объединяет объекты в пул для того, чтобы во время выполнения программы не тратить время на выделение памяти под них и на сборку мусора. Такой подход способен ухудшить производительность сборщика мусора, вызвать фрагментацию кучи, ухудшить локальность ссылок на объекты. Наша рекомендация заключается в том, что стоит использовать стандартный сборщик мусора, а не объединять объекты в пул. Мы ожидаем дальнейшего улучшения локальности ссылок и сборщика мусора благодаря использованию механизма выделения памяти под объекты, который основан на Thread-Local Allocation Buffer (TLAB) в ближайшем будущем.

Благодаря исследованию Android с использованием Icy Rocks, Intel внесла вклад в Android Open Source Project (AOSP) в виде нескольких улучшений. Так же было внесено множество оптимизаций в код Intel ART.

Итоги: пришло время новых тестов

Мы открыли код Icy Rocks. Это часть стратегии Intel, направленной на изменение подхода к измерению производительности Android-устройств. Существующие синтетические тесты производительности, по большей части, не имеют ничего общего с реальностью, не отражают особенностей настоящих приложений. Данные, которые они выдают, могут быть искажены ещё сильнее при оптимизации. Мы, например, недавно «улучшили» таким образом CFBench и Quadrant.

Мы хотим убедить Android-сообщество отказаться от синтетических тестов, далёких от реальности и подверженных манипуляциям, и заменить их на более правдоподобные рабочие нагрузки. Такие, как Icy Rocks.

Автор: Intel

Источник

Поделиться новостью

* - обязательные к заполнению поля