| <!DOCTYPE html> |
| |
| <script> |
| 'use strict'; |
| |
| const RENDER_THREAD_NAME = "RenderThread"; |
| const UI_THREAD_NAME = "UI Thread"; |
| const DRAW_FRAME_SLICE_TITLE = "DrawFrame"; |
| const BINDER_SLICE_TITLE = "binder transaction"; |
| const RECORD_SLICE_TITLE = "Record View#draw()"; |
| const DEQUEUE_BUFFER_SLICE_TITLE = "dequeueBuffer"; |
| |
| function getTimeInBinder(slice) { |
| if (slice.title === BINDER_SLICE_TITLE) { |
| return slice.duration; |
| } |
| let result = 0.0; |
| for (let subslice of slice.subSlices) { |
| result += getTimeInBinder(subslice); |
| } |
| return result; |
| } |
| |
| function getTimeInDequeueBuffer(slice) { |
| if (slice.title === DEQUEUE_BUFFER_SLICE_TITLE) { |
| return slice.duration; |
| } |
| let result = 0.0; |
| for (let subslice of slice.subSlices) { |
| result += getTimeInDequeueBuffer(subslice); |
| } |
| return result; |
| } |
| |
| tr.mre.FunctionRegistry.register( |
| function AvgDrawFrame(result, model) { |
| let canonicalUrl = model.canonicalUrl; |
| |
| for (let p of model.getAllProcesses()) { |
| //calc stats for processes that have UI and render threads and at least 10 frames |
| let renderThread = p.findAtMostOneThreadNamed(RENDER_THREAD_NAME); |
| let UIThread = p.findAtMostOneThreadNamed(UI_THREAD_NAME); |
| if (renderThread && UIThread) |
| { |
| let numDrawFrames = 0; |
| let drawFramesWallDuration = 0.0; |
| let binderDuration = 0.0; |
| let dequeueBufferDuration = 0.0; |
| |
| let numRecordViewDraw = 0; |
| let recordViewDrawWallDuration = 0.0; |
| |
| renderThread.sliceGroup.slices.forEach(function(slice) { |
| if (slice.title === DRAW_FRAME_SLICE_TITLE) { |
| drawFramesWallDuration += slice.duration; |
| numDrawFrames++; |
| binderDuration += getTimeInBinder(slice); |
| dequeueBufferDuration += getTimeInDequeueBuffer(slice); |
| } |
| }); |
| if (numDrawFrames < 10) continue; |
| UIThread.sliceGroup.slices.forEach(function(slice) { |
| if (slice.title === RECORD_SLICE_TITLE) { |
| recordViewDrawWallDuration += slice.duration; |
| numRecordViewDraw++; |
| } |
| }); |
| |
| let avgDrawFrameDuration = undefined; |
| if (numDrawFrames > 0) { |
| avgDrawFrameDuration = (drawFramesWallDuration-dequeueBufferDuration)/numDrawFrames; |
| } |
| let avgRecordViewDrawDuration = undefined; |
| if (numRecordViewDraw > 0) { |
| avgRecordViewDrawDuration = recordViewDrawWallDuration/numRecordViewDraw; |
| } |
| |
| result.addPair('result', { |
| canonicalUrl: canonicalUrl, |
| processName: p.name, |
| avgDrawFrameDuration: Number(avgDrawFrameDuration).toFixed(3), |
| avgRecordViewDrawDuration: Number(avgRecordViewDrawDuration).toFixed(3), |
| avgRecordAndPlay: Number(avgDrawFrameDuration+avgRecordViewDrawDuration).toFixed(3) |
| }); |
| } |
| } |
| }); |
| |
| </script> |