Pinpointing iOS Scroll Stutter with Xcode's Animation Hitches
Hitches give a frame-level audit trail that ends the "it feels slow" argument with hard timing data, and the hitch-type taxonomy tells you immediately whether to profile your own code, audit your layer tree, or suspect thermal throttling.
A late frame is a hitch, and Instruments records exactly how late it was, which phase blew the budget, and what the CPU was doing during that window. The tool breaks each frame's lifecycle into User Events, Commits, Renders, and GPU segments, then overlays Thread State Trace and Thermal State to distinguish app-level bottlenecks from system pressure.
A real list-scrolling investigation walks through the workflow: run under Profile, capture a scroll session in Animation Hitches, inspect Frame Lifetimes to isolate the pre-commit region where the budget ran out, and switch to Time Profiler on that interval. The culprit was a main-thread `UIGraphicsImageRenderer` call that forced synchronous JPEG decode and bitmap draw.
The piece also catalogs every hitch type — Pre-Commit latency, Expensive Commit, Commit-to-Render gap, Expensive Rendering, CPU-to-GPU latency, Expensive GPU, and Delayed Frame Swap — with the typical causes for each, so a developer knows which track to inspect next.
Animation Hitches turns a subjective performance argument into a precise, timestamped breakdown of which pipeline stage missed its deadline and by how many milliseconds.
The hitch-type classification is cumulative, not isolated: 'Expensive Commit' doesn't mean the commit phase alone was slow, only that the budget was exhausted by the time commit finished.
Overlapping Frame Lifetimes are not a bug; they are the expected signature of a pipelined rendering architecture where App, Render Server, and GPU work on different frames simultaneously.
Thread State Trace fills the diagnostic gap that Time Profiler cannot cover: a blocked main thread consumes no CPU and leaves no hot stack, but the trace records exactly how long it sat waiting.
Thermal State is a confounding variable, not a root cause; a profile captured under Serious thermal pressure should be discarded and re-collected after the device cools.
Apple's Instruments treats SpringBoard commits as separate entries in the Commits track, reminding developers that system UI layers also participate in frame budgeting.