| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <!-- | 2 <!-- |
| 3 Copyright (c) 2015 The Chromium Authors. All rights reserved. | 3 Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 4 Use of this source code is governed by a BSD-style license that can be | 4 Use of this source code is governed by a BSD-style license that can be |
| 5 found in the LICENSE file. | 5 found in the LICENSE file. |
| 6 --> | 6 --> |
| 7 | 7 |
| 8 <link rel="import" href="/tracing/base/statistics.html"> | 8 <link rel="import" href="/tracing/base/statistics.html"> |
| 9 <link rel="import" href="/tracing/extras/chrome/chrome_process_helper.html"> | 9 <link rel="import" href="/tracing/extras/chrome/chrome_process_helper.html"> |
| 10 <link rel="import" href="/tracing/extras/rail/rail_interaction_record.html"> | 10 <link rel="import" href="/tracing/extras/rail/rail_interaction_record.html"> |
| 11 | 11 |
| 12 <script> | 12 <script> |
| 13 'use strict'; | 13 'use strict'; |
| 14 | 14 |
| 15 /** | 15 /** |
| 16 * @fileoverview The Animation phase of RAIL. | 16 * @fileoverview The Animation phase of RAIL. |
| 17 */ | 17 */ |
| 18 tr.exportTo('tr.e.rail', function() { | 18 tr.exportTo('tr.e.rail', function() { |
| 19 // The computeNormalizedPain regions are delineated at these FPS values. | 19 // The computeNormalizedComfort regions are delineated at these FPS values. |
| 20 var PAIN_FPS_REGIONS = [60, 40, 30, 10]; | 20 var COMFORT_FPS_REGIONS = [60, 40, 30, 10]; |
| 21 | 21 |
| 22 // A frame is long if it starts more than this much time after the previous | 22 // A frame is long if it starts more than this much time after the previous |
| 23 // frame. | 23 // frame. |
| 24 var LONG_FRAME_MS = 50; | 24 var LONG_FRAME_MS = 50; |
| 25 | 25 |
| 26 // The computeNormalizedPain regions are delineated at these relative | 26 // The computeNormalizedComfort regions are delineated at these relative |
| 27 // discrepancy values. | 27 // discrepancy values. |
| 28 var PAIN_JANK_REGIONS = [0.05, 0.1, 0.2, 0.3]; | 28 var COMFORT_JANK_REGIONS = [0.05, 0.1, 0.2, 0.3]; |
| 29 | 29 |
| 30 function AnimationInteractionRecord(start, duration) { | 30 function AnimationInteractionRecord(start, duration) { |
| 31 tr.e.rail.RAILInteractionRecord.call( | 31 tr.e.rail.RAILInteractionRecord.call( |
| 32 this, 'Animation', 'rail_animate', | 32 this, 'Animation', 'rail_animate', |
| 33 start, duration); | 33 start, duration); |
| 34 this.frameEvents_ = undefined; | 34 this.frameEvents_ = undefined; |
| 35 } | 35 } |
| 36 | 36 |
| 37 AnimationInteractionRecord.prototype = { | 37 AnimationInteractionRecord.prototype = { |
| 38 __proto__: tr.e.rail.RAILInteractionRecord.prototype, | 38 __proto__: tr.e.rail.RAILInteractionRecord.prototype, |
| 39 | 39 |
| 40 get frameEvents() { | 40 get frameEvents() { |
| 41 if (this.frameEvents_) | 41 if (this.frameEvents_) |
| 42 return this.frameEvents_; | 42 return this.frameEvents_; |
| 43 | 43 |
| 44 this.frameEvents_ = new tr.model.EventSet(); | 44 this.frameEvents_ = new tr.model.EventSet(); |
| 45 | 45 |
| 46 this.associatedEvents.forEach(function(event) { | 46 this.associatedEvents.forEach(function(event) { |
| 47 if (event.title === tr.e.audits.IMPL_RENDERING_STATS) | 47 if (event.title === tr.e.audits.IMPL_RENDERING_STATS) |
| 48 this.frameEvents_.push(event); | 48 this.frameEvents_.push(event); |
| 49 }, this); | 49 }, this); |
| 50 | 50 |
| 51 return this.frameEvents_; | 51 return this.frameEvents_; |
| 52 }, | 52 }, |
| 53 | 53 |
| 54 get normalizedUserPain() { | 54 get normalizedUserComfort() { |
| 55 return tr.e.rail.weightedAverage2( | 55 return tr.e.rail.weightedAverage2( |
| 56 this.normalizedJankPain, this.normalizedFPSPain); | 56 this.normalizedJankComfort, this.normalizedFPSComfort); |
| 57 }, | 57 }, |
| 58 | 58 |
| 59 get normalizedFPSPain() { | 59 get normalizedFPSComfort() { |
| 60 var durationSeconds = this.duration / 1000; | 60 var durationSeconds = this.duration / 1000; |
| 61 var avgFps = this.frameEvents.length / durationSeconds; | 61 var avgSpf = durationSeconds / this.frameEvents.length; |
| 62 var avgSpf = 1 / avgFps; | 62 return 1 - tr.e.rail.computeNormalizedComfort(avgSpf, { |
| 63 return tr.e.rail.computeNormalizedPain(avgSpf, { | 63 minValueExponential: 1 / COMFORT_FPS_REGIONS[0], |
| 64 minValueExponential: 1 / PAIN_FPS_REGIONS[0], | 64 minValueLinear: 1 / COMFORT_FPS_REGIONS[1], |
| 65 minValueLinear: 1 / PAIN_FPS_REGIONS[1], | 65 minValueLogarithmic: 1 / COMFORT_FPS_REGIONS[2], |
| 66 minValueLogarithmic: 1 / PAIN_FPS_REGIONS[2], | 66 maxValue: 1 / COMFORT_FPS_REGIONS[3] |
| 67 maxValue: 1 / PAIN_FPS_REGIONS[3] | |
| 68 }); | 67 }); |
| 69 }, | 68 }, |
| 70 | 69 |
| 71 get normalizedJankPain() { | 70 get normalizedJankComfort() { |
| 72 var frameTimestamps = this.frameEvents.toArray().map(function(event) { | 71 var frameTimestamps = this.frameEvents.toArray().map(function(event) { |
| 73 return event.start; | 72 return event.start; |
| 74 }); | 73 }); |
| 75 var absolute = false; | 74 var absolute = false; |
| 76 var discrepancy = tr.b.Statistics.timestampsDiscrepancy( | 75 var discrepancy = tr.b.Statistics.timestampsDiscrepancy( |
| 77 frameTimestamps, absolute); | 76 frameTimestamps, absolute); |
| 78 return tr.e.rail.computeNormalizedPain(discrepancy, { | 77 return 1 - tr.e.rail.computeNormalizedComfort(discrepancy, { |
| 79 minValueExponential: PAIN_JANK_REGIONS[0], | 78 minValueExponential: COMFORT_JANK_REGIONS[0], |
| 80 minValueLinear: PAIN_JANK_REGIONS[1], | 79 minValueLinear: COMFORT_JANK_REGIONS[1], |
| 81 minValueLogarithmic: PAIN_JANK_REGIONS[2], | 80 minValueLogarithmic: COMFORT_JANK_REGIONS[2], |
| 82 maxValue: PAIN_JANK_REGIONS[3] | 81 maxValue: COMFORT_JANK_REGIONS[3] |
| 83 }); | 82 }); |
| 84 } | 83 } |
| 85 }; | 84 }; |
| 86 | 85 |
| 87 return { | 86 return { |
| 88 AnimationInteractionRecord: AnimationInteractionRecord | 87 AnimationInteractionRecord: AnimationInteractionRecord |
| 89 }; | 88 }; |
| 90 }); | 89 }); |
| 91 </script> | 90 </script> |
| OLD | NEW |