workspace: Get some values outside the children loop when allocating

It turned out that getting properties and saving them to a variable
outside of loops instead of accessing them everytime inside the loop can
have significant impact on performance, so do that in Workspaces
vfunc_allocate().

Here the impact is not that large, about 0.05 ms with 20 open windows,
that still seems worth it though.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1743>
This commit is contained in:
Jonas Dreßler 2021-02-25 12:13:21 +01:00 committed by Marge Bot
parent 5792b98f79
commit 650e0960a2

View File

@ -609,7 +609,12 @@ var WorkspaceLayout = GObject.registerClass({
this._windowSlots = this._getWindowSlots(box.copy()); this._windowSlots = this._getWindowSlots(box.copy());
} }
const allocationScale = containerBox.get_width() / this._workarea.width; const workareaX = this._workarea.x;
const workareaY = this._workarea.y;
const workareaWidth = this._workarea.width;
const stateAdjustementValue = this._stateAdjustment.value;
const allocationScale = containerBox.get_width() / workareaWidth;
const workspaceBox = new Clutter.ActorBox(); const workspaceBox = new Clutter.ActorBox();
const layoutBox = new Clutter.ActorBox(); const layoutBox = new Clutter.ActorBox();
@ -628,16 +633,16 @@ var WorkspaceLayout = GObject.registerClass({
if (windowInfo.metaWindow.showing_on_its_workspace()) { if (windowInfo.metaWindow.showing_on_its_workspace()) {
workspaceBox.set_origin( workspaceBox.set_origin(
child.boundingBox.x - this._workarea.x, child.boundingBox.x - workareaX,
child.boundingBox.y - this._workarea.y); child.boundingBox.y - workareaY);
workspaceBox.set_size( workspaceBox.set_size(
child.boundingBox.width, child.boundingBox.width,
child.boundingBox.height); child.boundingBox.height);
} else { } else {
workspaceBox.set_origin(this._workarea.x, this._workarea.y); workspaceBox.set_origin(workareaX, workareaY);
workspaceBox.set_size(0, 0); workspaceBox.set_size(0, 0);
child.opacity = this._stateAdjustment.value * 255; child.opacity = stateAdjustementValue * 255;
} }
workspaceBox.scale(allocationScale); workspaceBox.scale(allocationScale);
@ -657,7 +662,7 @@ var WorkspaceLayout = GObject.registerClass({
layoutBox.set_size(width, height); layoutBox.set_size(width, height);
const childBox = workspaceBox.interpolate(layoutBox, const childBox = workspaceBox.interpolate(layoutBox,
this._stateAdjustment.value); stateAdjustementValue);
if (windowInfo.currentTransition) { if (windowInfo.currentTransition) {
windowInfo.currentTransition.get_interval().set_final(childBox); windowInfo.currentTransition.get_interval().set_final(childBox);