parseTimelineFrames function
Fallback timeline parsing: modern engines emit frame phases as COMPLETE
events (ph: "X" with a dur), not the Begin/End pairs keyed by
frame_number that older code assumed. Build ("Frame") and raster
("GPURasterizer::Draw"/"Rasterizer::DoDraw") run pipelined on separate
threads, so we pair them by order of appearance.
Implementation
List<FrameData> parseTimelineFrames(List<Map<String, dynamic>> events) {
final buildsUs = <int>[];
final rastersUs = <int>[];
for (final event in events) {
if (event['ph'] != 'X') continue;
final dur = event['dur'];
if (dur is! int) continue;
final name = event['name'] as String? ?? '';
if (name == 'Frame') {
buildsUs.add(dur);
} else if (name == 'GPURasterizer::Draw' || name == 'Rasterizer::DoDraw') {
rastersUs.add(dur);
}
}
return [
for (var i = 0; i < buildsUs.length; i++)
FrameData(
buildMs: buildsUs[i] / 1000.0,
rasterMs: i < rastersUs.length ? rastersUs[i] / 1000.0 : 0,
),
];
}