FrameTimingMetric


public final class FrameTimingMetric extends Metric


Metric which captures timing information from frames produced by a benchmark, such as a scrolling or animation benchmark.

This outputs the following measurements:

  • frameOverrunMs (Requires API 31) - How much time a given frame missed its deadline by. Positive numbers indicate a dropped frame and visible jank / stutter, negative numbers indicate how much faster than the deadline a frame was.

  • frameDurationCpuMs - How much time the frame took to be produced on the CPU - on both the UI Thread, and RenderThread. Note that this doesn't account for time before the frame started (before Choreographer#doFrame), as that data isn't available in traces prior to API 31.

  • frameCount - How many total frames were produced. This is a secondary metric which can be used to understand why the above metrics changed. For example, when removing unneeded frames that were incorrectly invalidated to save power, frameOverrunMs and frameDurationCpuMs will often get worse, as the removed frames were trivial. Checking frameCount can be a useful indicator in such cases.

Generally, prefer tracking and detecting regressions with frameOverrunMs when it is available, as it is the more complete data, and accounts for modern devices (including higher, variable framerate rendering) more naturally.

Summary

Public constructors

@ExperimentalMetricApi
FrameTimingMetric(
    @NonNull String processNameSuffix,
    @NonNull String metricNameSuffix
)

Public constructors

FrameTimingMetric

Added in 1.1.0
public FrameTimingMetric()

FrameTimingMetric

Added in 1.4.0
@ExperimentalMetricApi
public FrameTimingMetric(
    @NonNull String processNameSuffix,
    @NonNull String metricNameSuffix
)
Parameters
@NonNull String processNameSuffix

A suffix appended to the app's package name for subprocesses. This is useful when there are separate subprocesses of the app.

@NonNull String metricNameSuffix

A suffix appended to the metric names. Use this to distinguish metrics collected from different subprocesses in the app. Defaults to processNameSuffix with ":" replaced by "_".