103 lines
3.2 KiB
Diff
103 lines
3.2 KiB
Diff
From 0e0574a0b448a28235ec056f2397c4568f5c9338 Mon Sep 17 00:00:00 2001
|
|
From: Daniel van Vugt <daniel.van.vugt@canonical.com>
|
|
Date: Fri, 23 Nov 2018 16:43:34 +0800
|
|
Subject: [PATCH 18/25] iconGrid: Eliminate JavaScript for painting/picking
|
|
|
|
The only reason for `vfunc_paint` and `vfunc_pick` existing was to
|
|
implement a culling optimization. Although that optimization actually
|
|
made performance worse than none at all because it forced the painting
|
|
and picking cycles to spend more time calling into JavaScript.
|
|
|
|
Turns out we don't have to choose between native code and culling though.
|
|
Just reimplement the culling using native ClutterActor functions and we
|
|
get the benefits of both.
|
|
|
|
Performance on an i7-7700:
|
|
|
|
Moving the cursor over the icon grid:
|
|
Before: 70% CPU, 5.5ms per frame
|
|
After : 60% CPU, 4.5ms per frame
|
|
|
|
Scrolling the icon grid:
|
|
Before: 60% CPU, 4.4ms per frame
|
|
After : 50% CPU, 3.3ms per frame
|
|
|
|
Helps with https://gitlab.gnome.org/GNOME/gnome-shell/issues/174
|
|
---
|
|
js/ui/iconGrid.js | 29 ++++-------------------------
|
|
1 file changed, 4 insertions(+), 25 deletions(-)
|
|
|
|
diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js
|
|
index 94387a333..82b335cc5 100644
|
|
--- a/js/ui/iconGrid.js
|
|
+++ b/js/ui/iconGrid.js
|
|
@@ -344,10 +344,10 @@ var IconGrid = new Lang.Class({
|
|
|
|
if (this._rowLimit && rowIndex >= this._rowLimit ||
|
|
this._fillParent && childBox.y2 > availHeight - this.bottomPadding) {
|
|
- children[i]._skipPaint = true;
|
|
+ children[i].hide();
|
|
} else {
|
|
children[i].allocate(childBox, flags);
|
|
- children[i]._skipPaint = false;
|
|
+ children[i].show();
|
|
}
|
|
|
|
columnIndex++;
|
|
@@ -365,24 +365,6 @@ var IconGrid = new Lang.Class({
|
|
}
|
|
},
|
|
|
|
- vfunc_paint() {
|
|
- this.paint_background();
|
|
-
|
|
- this.get_children().forEach(c => {
|
|
- if (!c._skipPaint)
|
|
- c.paint();
|
|
- });
|
|
- },
|
|
-
|
|
- vfunc_pick(color) {
|
|
- this.parent(color);
|
|
-
|
|
- this.get_children().forEach(c => {
|
|
- if (!c._skipPaint)
|
|
- c.paint();
|
|
- });
|
|
- },
|
|
-
|
|
vfunc_get_paint_volume(paintVolume) {
|
|
// Setting the paint volume does not make sense when we don't have
|
|
// any allocation
|
|
@@ -412,9 +394,6 @@ var IconGrid = new Lang.Class({
|
|
if (!child.visible)
|
|
continue;
|
|
|
|
- if (child._skipPaint)
|
|
- continue;
|
|
-
|
|
let childVolume = child.get_transformed_paint_volume(this);
|
|
if (!childVolume)
|
|
return false
|
|
@@ -714,7 +693,7 @@ var IconGrid = new Lang.Class({
|
|
},
|
|
|
|
visibleItemsCount() {
|
|
- return this.get_children().filter(c => !c._skipPaint).length;
|
|
+ return this.get_children().filter(c => c.is_visible()).length;
|
|
},
|
|
|
|
setSpacing(spacing) {
|
|
@@ -859,7 +838,7 @@ var PaginatedIconGrid = new Lang.Class({
|
|
for (let i = 0; i < children.length; i++) {
|
|
let childBox = this._calculateChildBox(children[i], x, y, box);
|
|
children[i].allocate(childBox, flags);
|
|
- children[i]._skipPaint = false;
|
|
+ children[i].show();
|
|
|
|
columnIndex++;
|
|
if (columnIndex == nColumns) {
|
|
--
|
|
2.20.0
|
|
|