parseTimelineFrames function

List<FrameData> parseTimelineFrames(
  1. List<Map<String, dynamic>> events
)

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,
      ),
  ];
}