Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: Source/devtools/front_end/timeline/PaintProfilerView.js

Issue 429883004: DevTools: add pie chart to the paint profiler overview. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebaselined Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 18 matching lines...) Expand all
29 */ 29 */
30 30
31 /** 31 /**
32 * @constructor 32 * @constructor
33 * @param {function(string=)} showImageCallback 33 * @param {function(string=)} showImageCallback
34 * @extends {WebInspector.HBox} 34 * @extends {WebInspector.HBox}
35 */ 35 */
36 WebInspector.PaintProfilerView = function(showImageCallback) 36 WebInspector.PaintProfilerView = function(showImageCallback)
37 { 37 {
38 WebInspector.HBox.call(this); 38 WebInspector.HBox.call(this);
39 this.element.classList.add("paint-profiler-view"); 39 this.element.classList.add("paint-profiler-overview", "hbox");
40 this._canvasContainer = this.element.createChild("div", "paint-profiler-canv as-container");
41 this._pieChart = new WebInspector.PieChart(55, this._formatPieChartTime.bind (this));
42 this.element.createChild("div", "paint-profiler-pie-chart").appendChild(this ._pieChart.element);
40 43
41 this._showImageCallback = showImageCallback; 44 this._showImageCallback = showImageCallback;
42 45
43 this._canvas = this.element.createChild("canvas", "fill"); 46 this._canvas = this._canvasContainer.createChild("canvas", "fill");
44 this._context = this._canvas.getContext("2d"); 47 this._context = this._canvas.getContext("2d");
45 this._selectionWindow = new WebInspector.OverviewGrid.Window(this.element, t his.element); 48 this._selectionWindow = new WebInspector.OverviewGrid.Window(this._canvasCon tainer);
46 this._selectionWindow.addEventListener(WebInspector.OverviewGrid.Events.Wind owChanged, this._onWindowChanged, this); 49 this._selectionWindow.addEventListener(WebInspector.OverviewGrid.Events.Wind owChanged, this._onWindowChanged, this);
47 50
48 this._innerBarWidth = 4 * window.devicePixelRatio; 51 this._innerBarWidth = 4 * window.devicePixelRatio;
49 this._minBarHeight = 4 * window.devicePixelRatio; 52 this._minBarHeight = window.devicePixelRatio;
50 this._barPaddingWidth = 2 * window.devicePixelRatio; 53 this._barPaddingWidth = 2 * window.devicePixelRatio;
51 this._outerBarWidth = this._innerBarWidth + this._barPaddingWidth; 54 this._outerBarWidth = this._innerBarWidth + this._barPaddingWidth;
52 55
53 this._reset(); 56 this._reset();
54 } 57 }
55 58
56 WebInspector.PaintProfilerView.Events = { 59 WebInspector.PaintProfilerView.Events = {
57 WindowChanged: "WindowChanged" 60 WindowChanged: "WindowChanged"
58 }; 61 };
59 62
(...skipping 26 matching lines...) Expand all
86 */ 89 */
87 function onProfileDone(profiles) 90 function onProfileDone(profiles)
88 { 91 {
89 this._profiles = profiles; 92 this._profiles = profiles;
90 this._update(); 93 this._update();
91 } 94 }
92 }, 95 },
93 96
94 _update: function() 97 _update: function()
95 { 98 {
96 this._canvas.width = this.element.clientWidth * window.devicePixelRatio; 99 this._canvas.width = this._canvasContainer.clientWidth * window.devicePi xelRatio;
97 this._canvas.height = this.element.clientHeight * window.devicePixelRati o; 100 this._canvas.height = this._canvasContainer.clientHeight * window.device PixelRatio;
98 this._samplesPerBar = 0; 101 this._samplesPerBar = 0;
99 if (!this._profiles || !this._profiles.length) 102 if (!this._profiles || !this._profiles.length)
100 return; 103 return;
101 104
102 var maxBars = Math.floor((this._canvas.width - 2 * this._barPaddingWidth ) / this._outerBarWidth); 105 var maxBars = Math.floor((this._canvas.width - 2 * this._barPaddingWidth ) / this._outerBarWidth);
103 var sampleCount = this._log.length; 106 var sampleCount = this._log.length;
104 this._samplesPerBar = Math.ceil(sampleCount / maxBars); 107 this._samplesPerBar = Math.ceil(sampleCount / maxBars);
105 var barCount = Math.floor(sampleCount / this._samplesPerBar); 108 var barCount = Math.floor(sampleCount / this._samplesPerBar);
106 109
107 var maxBarTime = 0; 110 var maxBarTime = 0;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 continue; 161 continue;
159 currentHeight += heightByCategory[categoryName]; 162 currentHeight += heightByCategory[categoryName];
160 var y = this._canvas.height - currentHeight; 163 var y = this._canvas.height - currentHeight;
161 this._context.fillStyle = categories[categoryName].color; 164 this._context.fillStyle = categories[categoryName].color;
162 this._context.fillRect(x, y, this._innerBarWidth, heightByCategory[c ategoryName]); 165 this._context.fillRect(x, y, this._innerBarWidth, heightByCategory[c ategoryName]);
163 } 166 }
164 }, 167 },
165 168
166 _onWindowChanged: function() 169 _onWindowChanged: function()
167 { 170 {
171 this.dispatchEventToListeners(WebInspector.PaintProfilerView.Events.Wind owChanged);
172
173 // Update pie chart
174 var window = this.windowBoundaries();
175 var totalTime = 0;
176 var timeByCategory = {};
177 for (var i = window.left; i <= window.right; ++i) {
178 var logEntry = this._log[i];
179 var category = WebInspector.PaintProfilerView._categoryForLogItem(lo gEntry);
180 timeByCategory[category.color] = timeByCategory[category.color] || 0 ;
181 for (var j = 0; j < this._profiles.length; ++j) {
182 var time = this._profiles[j][logEntry.commandIndex];
183 totalTime += time;
184 timeByCategory[category.color] += time;
185 }
186 }
187 this._pieChart.setTotal(totalTime / this._profiles.length);
188 for (var color in timeByCategory)
189 this._pieChart.addSlice(timeByCategory[color] / this._profiles.length, color);
190
168 if (this._updateImageTimer) 191 if (this._updateImageTimer)
169 return; 192 return;
170 this._updateImageTimer = setTimeout(this._updateImage.bind(this), 100); 193 this._updateImageTimer = setTimeout(this._updateImage.bind(this), 100);
171 this.dispatchEventToListeners(WebInspector.PaintProfilerView.Events.Wind owChanged);
172 }, 194 },
173 195
174 /** 196 /**
197 * @param {number} value
198 * @return {string}
199 */
200 _formatPieChartTime: function(value)
201 {
202 return Number.millisToString(value * 1000, true);
203 },
204
205 /**
175 * @return {{left: number, right: number}} 206 * @return {{left: number, right: number}}
176 */ 207 */
177 windowBoundaries: function() 208 windowBoundaries: function()
178 { 209 {
179 var screenLeft = this._selectionWindow.windowLeft * this._canvas.width; 210 var screenLeft = this._selectionWindow.windowLeft * this._canvas.width;
180 var screenRight = this._selectionWindow.windowRight * this._canvas.width ; 211 var screenRight = this._selectionWindow.windowRight * this._canvas.width ;
181 var barLeft = Math.floor((screenLeft - this._barPaddingWidth) / this._ou terBarWidth); 212 var barLeft = Math.floor((screenLeft - this._barPaddingWidth) / this._ou terBarWidth);
182 var barRight = Math.floor((screenRight - this._barPaddingWidth + this._i nnerBarWidth)/ this._outerBarWidth); 213 var barRight = Math.floor((screenRight - this._barPaddingWidth + this._i nnerBarWidth)/ this._outerBarWidth);
183 var stepLeft = Math.max(0, barLeft * this._samplesPerBar); 214 var stepLeft = Number.constrain(barLeft * this._samplesPerBar, 0, this._ log.length - 1);
184 var stepRight = Math.min(barRight * this._samplesPerBar, this._log.lengt h - 1); 215 var stepRight = Number.constrain(barRight * this._samplesPerBar, 0, this ._log.length - 1);
185 216
186 return {left: stepLeft, right: stepRight}; 217 return { left: stepLeft, right: stepRight };
187 }, 218 },
188 219
189 _updateImage: function() 220 _updateImage: function()
190 { 221 {
191 delete this._updateImageTimer; 222 delete this._updateImageTimer;
192 if (!this._profiles || !this._profiles.length) 223 if (!this._profiles || !this._profiles.length)
193 return; 224 return;
194 225
195 var window = this.windowBoundaries(); 226 var window = this.windowBoundaries();
196 this._snapshot.requestImage(this._log[window.left].commandIndex, this._l og[window.right].commandIndex, 1, this._showImageCallback); 227 this._snapshot.requestImage(this._log[window.left].commandIndex, this._l og[window.right].commandIndex, 1, this._showImageCallback);
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 }; 445 };
415 446
416 /** 447 /**
417 * @return {!Object.<string, !WebInspector.PaintProfilerCategory>} 448 * @return {!Object.<string, !WebInspector.PaintProfilerCategory>}
418 */ 449 */
419 WebInspector.PaintProfilerView.categories = function() 450 WebInspector.PaintProfilerView.categories = function()
420 { 451 {
421 if (WebInspector.PaintProfilerView._categories) 452 if (WebInspector.PaintProfilerView._categories)
422 return WebInspector.PaintProfilerView._categories; 453 return WebInspector.PaintProfilerView._categories;
423 WebInspector.PaintProfilerView._categories = { 454 WebInspector.PaintProfilerView._categories = {
424 shapes: new WebInspector.PaintProfilerCategory("shapes", WebInspector.UI String("Shapes"), "rgba(255, 0, 0, 0.7)"), 455 shapes: new WebInspector.PaintProfilerCategory("shapes", WebInspector.UI String("Shapes"), "rgb(255, 161, 129)"),
425 bitmap: new WebInspector.PaintProfilerCategory("bitmap", WebInspector.UI String("Bitmap"), "rgba(0, 255, 0, 0.7)"), 456 bitmap: new WebInspector.PaintProfilerCategory("bitmap", WebInspector.UI String("Bitmap"), "rgb(136, 196, 255)"),
426 text: new WebInspector.PaintProfilerCategory("text", WebInspector.UIStri ng("Text"), "rgba(0, 0, 255, 0.7)"), 457 text: new WebInspector.PaintProfilerCategory("text", WebInspector.UIStri ng("Text"), "rgb(180, 255, 137)"),
427 misc: new WebInspector.PaintProfilerCategory("misc", WebInspector.UIStri ng("Misc"), "rgba(100, 0, 100, 0.7)") 458 misc: new WebInspector.PaintProfilerCategory("misc", WebInspector.UIStri ng("Misc"), "rgb(206, 160, 255)")
428 }; 459 };
429 return WebInspector.PaintProfilerView._categories; 460 return WebInspector.PaintProfilerView._categories;
430 }; 461 };
431 462
432 /** 463 /**
433 * @constructor 464 * @constructor
434 * @param {string} name 465 * @param {string} name
435 * @param {string} title 466 * @param {string} title
436 * @param {string} color 467 * @param {string} color
437 */ 468 */
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 var method = logItem.method.toTitleCase(); 534 var method = logItem.method.toTitleCase();
504 535
505 var logItemCategories = WebInspector.PaintProfilerView._initLogItemCategorie s(); 536 var logItemCategories = WebInspector.PaintProfilerView._initLogItemCategorie s();
506 var result = logItemCategories[method]; 537 var result = logItemCategories[method];
507 if (!result) { 538 if (!result) {
508 result = WebInspector.PaintProfilerView.categories()["misc"]; 539 result = WebInspector.PaintProfilerView.categories()["misc"];
509 logItemCategories[method] = result; 540 logItemCategories[method] = result;
510 } 541 }
511 return result; 542 return result;
512 } 543 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/profiler/HeapSnapshotView.js ('k') | Source/devtools/front_end/timeline/TimelineUIUtils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698