A frame time average hides exactly the frames players notice. We logged a session with a mean of 16.4 ms and a 99th percentile of 48 ms: at 60 fps that is one visible hitch every 50 frames, which reads as “not smooth” even though every benchmark summary says otherwise.

The tail came from texture uploads during streaming. Moving the upload to a worker thread and budgeting 2 ms per frame for it cut the 99th percentile to 21 ms. The mean did not change.

If a tool only shows you averages, compute percentiles from the raw frame timestamps. The data is already there in FrameTimeline and in any trace that records Choreographer#doFrame.