Частота кадров

Средняя частота кадров

Плавная и стабильная частота кадров имеет решающее значение для обеспечения высококачественного игрового процесса на устройствах Android. При измерении производительности игры следует использовать средний FPS в качестве базового показателя , чтобы получить базовое представление о качестве игрового процесса. Для обеспечения отличного игрового процесса следует оптимизировать игру, чтобы достичь средней частоты кадров в 60 FPS.

P90 и P99 FPS для стабильности

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

Таким образом, стабильность кадров так же важна, как и отслеживание средней частоты кадров. Именно здесь следует измерять показатели частоты кадров P90 и P99 в качестве стабильного базового уровня и индикатора заикания соответственно. Эти показатели фиксируют «хвостовую часть» производительности, что позволяет оптимизировать плавность игрового процесса.

Метрики

  • Средний FPS (базовый уровень) : Этот основной показатель дает общее представление о производительности вашей игры. Хотя это стандартный бенчмарк, расчет среднего значения означает, что периодические просадки кадров и микрозаикания не могут быть обнаружены, поэтому он недостаточен для адекватного представления игрового опыта.
  • P90 FPS (стабильный базовый уровень на 10-м процентиле) : это означает, что 90% ваших кадров превышали этот стабильный базовый уровень, и только 10% самых медленных кадров требовали больше времени для рендеринга. Если ваша частота кадров P90 высока и близка к среднему значению, игра работает стабильно хорошо на протяжении большей части сессии.
  • P99 FPS (индикатор заикания на 1-м процентиле) : Этот показатель указывает на то, что 99% ваших кадров превысили этот индикатор заикания, конкретно выделяя 1% самых медленных кадров. Этот показатель важен для выявления микрозаиканий, задержек загрузки ресурсов и внезапных скачков рендеринга ресурсоемких объектов, вызывающих видимые рывки.

Примеры

Сравнивая средний показатель FPS с метриками P90 и P99, вы можете точно определить основные закономерности поведения игры.

Сценарий 1: Оптимальная кривая (Оптимизированная игра)

  • В среднем : 60 кадров в секунду (16,6 мс)
  • P90 : 58 кадров в секунду (17,2 мс)
  • P99 : 52 FPS (19,2 мс)
  • Анализ : Показатели очень хорошо сбалансированы. Игра работает невероятно плавно и стабильно. Отсутствуют микроподтормаживания, и даже самые заметные 1% кадров практически не видны невооруженным глазом.

Сценарий 2: Узкое место нагрузки (ограничение производительности ЦП/ГП)

  • В среднем : 45 кадров в секунду (22,2 мс)
  • P90 : 40 кадров в секунду (25,0 мс)
  • P99 : 38 кадров в секунду (26,3 мс)
  • Анализ : Средняя частота кадров ниже, но стабильно низкая. Показатель P99 не сильно падает по сравнению со средним. Это указывает на то, что система, по сути, перегружена графическими настройками или ограничениями разрешения. Игра не будет тормозить, а скорее будет работать медленно. Снижение графических настроек, как правило, равномерно увеличивает эти показатели.

Сценарий 3: Нестабильная частота кадров 60 FPS (зависания из-за компиляции шейдеров / потоковой передачи ресурсов)

  • В среднем : 60 кадров в секунду (16,6 мс)
  • P90 : 45 кадров в секунду (22,2 мс)
  • P99 : 15 кадров в секунду (66,6 мс)
  • Анализ : Это наихудший сценарий. Хотя средняя частота кадров кажется отличной, P99 выявляет критическую проблему. Значение P99 в 66,6 мс означает, что игра полностью зависает на несколько кадров подряд. Это указывает на серьезные отклонения — обычно вызванные узкими местами процессора, задержками потоковой передачи ресурсов (например, медленной оперативной памятью или хранилищем) или сбоями, вызванными компиляцией шейдеров.

Измерение

Для эффективного измерения средней частоты кадров (Average FPS), P90 и P99 можно использовать команду Android dumpsys surfaceflinger timestats. Этот инструмент предоставляет среднюю частоту кадров и гистограмму времени presentToPresent для всех слоев, которые отображаются. Время presentToPresent кадра — это интервал между текущим кадром и предыдущим кадром, который отрисовывается.

Вот пошаговая инструкция по сбору и расчету этих показателей для вашей игры:

  1. Начать сбор данных : Выполните следующую команду с флагами enable и clear, чтобы начать сбор информации:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Вывод информации : Когда игра продлится достаточно долго, запустите команду еще раз с флагом dump, чтобы вывести информацию:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. Фильтрация по слою : Выведенная информация содержит данные по всем слоям, отображаемым SurfaceFlinger. Вам необходимо найти раздел, соответствующий вашей игре, отфильтровав данные по layerName (например, layerName = SurfaceView[com.example.yourgame...]).

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. Определение среднего значения FPS : Среднее значение FPS для каждого слоя рассчитывается автоматически и отображается непосредственно в выходных данных дампа (например, averageFPS = 30,179).

    ...
    averageFPS = 30.179
    ...
    
  5. Расчет FPS для P90 и P99 : Для определения метрик P90 и P99 необходимо проанализировать гистограммы времени totalFrames и presentToPresent , представленные в дампе.

    totalFrames = 1000
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0
    66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    А. Концептуальный пример (таблица кумулятивного распределения) Предположим, что в вашей игровой сессии было зафиксировано 1000 кадров. Чтобы найти P90 и P99, необходимо вычислить пороговые значения в миллисекундах, при которых кумулятивное количество кадров достигает 900 кадров (90%) и 990 кадров (99%) соответственно, начиная с наименьшего значения в миллисекундном интервале.

    Время кадра (мс) Количество кадров (гистограмма) Общее количество кадров Процентный статус / Расчет
    16 мс 850 850 85,0%
    33 мс 100 950 95,0%
    ( Цель P90 в 900 достигнута! → 1000/33 = 30,3 FPS )
    50 мс 35 985 98,5%
    66 мс 10 995 99,5%
    ( Цель P99 — 990 достигнута! → 1000/66 = 15,1 FPS )
    102 мс 5 1000 100%

    B. Логика реализации (псевдокод) Если вы автоматизируете этот анализ с помощью скрипта Python или парсера логов, логика извлечения значений P90 и P99 из гистограммы может быть реализована следующим образом:

    # Define target thresholds based on total frame count
    p90_target = totalFrames * 0.90
    p99_target = totalFrames * 0.99
    
    cumulative_frames = 0
    p90_fps = None
    p99_fps = None
    
    # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond)
    for ms_bucket, frame_count in present_to_present_histogram:
        cumulative_frames += frame_count
    
        # Capture P90 when cumulative frames cross the 90% threshold
        if p90_fps is None and cumulative_frames >= p90_target:
            p90_fps = 1000 / ms_bucket
    
        # Capture P99 when cumulative frames cross the 99% threshold
        if p99_fps is None and cumulative_frames >= p99_target:
            p99_fps = 1000 / ms_bucket
            break # Optimization: stop iterating once both targets are found
    
  6. Остановить сбор данных : После сбора всей необходимой информации следует отключить сбор статистики времени, используя флаг disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Медленные сессии

Функция «Медленные сессии » выявляет распространенные проблемы с производительностью в реальных условиях. Сессия считается «медленной», если более 25% кадров падают ниже порогового значения (например, 20 FPS). Хотя эта метрика полезна для выявления критических проблем сборки, сама по себе она не может гарантировать высококачественный и стабильный игровой процесс. Игра может не достигать порога «Медленной сессии», но при этом страдать от микрозаиканий, которые мешают плавной работе с частотой 60 FPS.

Хотя оба показателя основаны на времени отрисовки кадров, «Медленная сессия» и «Частота кадров» выполняют разные функции. Метрики «Средняя частота кадров», «P90» и «P99 FPS» измеряют качество и стабильность производительности, выявляя мгновенные падения и непостоянство темпа, которые метрика «Медленная сессия» может упустить из виду.

Заключение

Для успешной оптимизации производительности необходима комплексная стратегия. Разработчикам следует использовать «медленные сессии» в качестве основного индикатора для выявления серьезного снижения производительности, а затем анализировать средний FPS, P90 и P99, чтобы диагностировать основные причины и проверить фактическую плавность игрового процесса. Интеграция этих метрик позволит обеспечить стабильно стабильное и исключительное качество работы приложения для пользователей.

Дополнительные ресурсы

Чтобы узнать больше о передовых методах профилирования, реализации API Frame Pacing и стратегиях оптимизации, специфичных для конкретного движка, ознакомьтесь с официальной документацией для разработчиков Android:

  • Основные моменты Android: Медленные сессии : Поймите, как Google Play измеряет и сообщает о длительных периодах медленной отрисовки, что напрямую влияет на пользовательский опыт. «Медленная сессия» определяется как пользовательская сессия, в которой более 25% кадров обрабатываются медленно (например, более 50 мс, что эквивалентно 20 кадрам в секунду).
  • Разработчики Android: Оптимизация производительности игр : Изучите центральный раздел по оптимизации игр для Android. Это исчерпывающее руководство охватывает лучшие практики, инструменты профилирования (такие как Android Performance Analyzer (APA) и Perfetto ), которые помогут вам максимально повысить общую производительность вашей игры.