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

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

Плавная и стабильная частота кадров имеет решающее значение для обеспечения высококачественного игрового процесса на устройствах 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 мс означает, что игра полностью зависает на несколько кадров подряд. Это указывает на серьезные отклонения — обычно вызванные узкими местами процессора, задержками потоковой передачи ресурсов (например, медленной оперативной памятью или хранилищем) или сбоями, вызванными компиляцией шейдеров.

Измерение

Для эффективного измерения средней частоты кадров (FPS), а также показателей P90 и P99 FPS можно использовать два следующих метода. Первый метод — анализ системных трассировок с помощью Android Performance Analyzer (APA) , инструмента профилирования производительности. Второй метод — использование существующей команды adb dumpsys SurfaceFlinger --timestats .

1. Измерения проводятся в соответствии с требованиями APA.

Используя APA, вы можете записать трассировку системы и точно проанализировать данные кадров с помощью SQL-запросов. Выполните следующие шаги для измерения ваших метрик:

  1. Захват трассировки с помощью APA : Запустите игру и используйте APA для захвата системной трассировки в том сегменте, который вы хотите проанализировать (например, в точке игрового процесса, где вы подозреваете падение частоты кадров). После подключения устройства и завершения записи трассировки данные загрузятся в интерфейс APA.

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

  3. Вставьте SQL-запрос на вкладку APA SQL : скопируйте следующий SQL-запрос и вставьте его в поле ввода запроса. Этот запрос идентифицирует процесс SurfaceFlinger, вычисляет интервалы между кадрами на основе фактических временных меток обновления дисплея и определяет среднюю частоту кадров (FPS), нижние 10% (P90) FPS и нижние 1% (P99) FPS.

    WITH target_process AS (
    -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3
    SELECT upid
    FROM process
    WHERE name = '/system/bin/surfaceflinger'
    ),
    actual_present_times AS (
    -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen
    SELECT
        (ts + dur) AS present_ts
    FROM actual_frame_timeline_slice
    WHERE upid IN (SELECT upid FROM target_process)
        AND dur > 0
    ),
    present_intervals AS (
    -- 3. Calculate intervals between physical screen refreshes
    SELECT
        (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms
    FROM actual_present_times
    ),
    valid_intervals AS (
    -- 4. Filter for valid frame intervals
    SELECT p2p_ms
    FROM present_intervals
    WHERE p2p_ms IS NOT NULL AND p2p_ms > 0
    ),
    ordered_frames AS (
    -- 5. Sort in ascending order to calculate percentiles
    SELECT
        p2p_ms,
        ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num,
        COUNT(1) OVER () AS total_frames
    FROM valid_intervals
    )
    -- 6. Output final metrics
    SELECT
    (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames,
    ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps,
    ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps,
    ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;
    
  4. Нажмите «Выполнить запрос» : нажмите кнопку « Выполнить запрос» (или значок выполнения) рядом с полем ввода запроса. После завершения выполнения запроса в таблице в области результатов будут отображены измеренные значения общего количества кадров ( total_presented_frames ), средней частоты кадров ( average_fps ), частоты кадров в нижних 10% ( low_10_fps ) и частоты кадров в нижних 1% ( low_1_fps ).

    На экране отображается выполненный SQL-запрос и четыре результирующих показателя в таблице.

2. Измерения с помощью adb (dumpsys SurfaceFlinger)

Для эффективного измерения средней частоты кадров (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. Это исчерпывающее руководство охватывает лучшие практики, инструменты профилирования (такие как APA и Perfetto ), которые помогут вам максимально повысить общую производительность вашей игры.