90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <!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>
 |