Differential D11938 Diff 29768 files/0002-Fix-perf-regression-when-avoiding-scrollbar-flipping.patch
Changeset View
Changeset View
Standalone View
Standalone View
files/0002-Fix-perf-regression-when-avoiding-scrollbar-flipping.patch
- This file was added.
| From ffc9323671d045e3566980d9ed4567f071004e65 Mon Sep 17 00:00:00 2001 | |||||
| From: Volker Hilsheimer <volker.hilsheimer@qt.io> | |||||
| Date: Thu, 28 Oct 2021 16:55:33 +0200 | |||||
| Subject: Fix performance regression when avoiding scrollbar flipping | |||||
| Amends 6c4dc722cb9bf765904feefff4fb00bdb0b3dc9f. | |||||
| Don't search for the optimal size of the scrollarea's widget if it can't | |||||
| be found anyway. Try the size with scrollbar first, which covers the | |||||
| vast majority of sizes. | |||||
| Optimizing the loop with e.g. a binary search adds no value, as the size | |||||
| is often just a pixel too small. | |||||
| Since we can't rely on the number of height-for-width calls, we can't | |||||
| meaningfully test this behavior. The number of calls is still very high | |||||
| during showing and resizing; optimizing this further is for a separate | |||||
| commit. | |||||
| Fixes: QTBUG-97811 | |||||
| Pick-to: 6.2 5.15 | |||||
| Change-Id: If145302e6414b32cf1ce7251ff33b0039f584867 | |||||
| Reviewed-by: Jonas Kvinge <jonas@jkvinge.net> | |||||
| Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io> | |||||
| --- | |||||
| src/widgets/widgets/qscrollarea.cpp | 11 +++++++---- | |||||
| 1 file changed, 7 insertions(+), 4 deletions(-) | |||||
| diff --git a/src/widgets/widgets/qscrollarea.cpp b/src/widgets/widgets/qscrollarea.cpp | |||||
| index f880240ea7..e8fdadb648 100644 | |||||
| --- a/src/widgets/widgets/qscrollarea.cpp | |||||
| +++ b/src/widgets/widgets/qscrollarea.cpp | |||||
| @@ -203,10 +203,13 @@ void QScrollAreaPrivate::updateScrollBars() | |||||
| if (vbarpolicy == Qt::ScrollBarAsNeeded) { | |||||
| int vbarWidth = vbar->sizeHint().width(); | |||||
| QSize m_hfw = m.expandedTo(min).boundedTo(max); | |||||
| - while (h > m.height() && vbarWidth) { | |||||
| - --vbarWidth; | |||||
| - --m_hfw.rwidth(); | |||||
| - h = widget->heightForWidth(m_hfw.width()); | |||||
| + // is there any point in searching? | |||||
| + if (widget->heightForWidth(m_hfw.width() - vbarWidth) <= m.height()) { | |||||
| + while (h > m.height() && vbarWidth) { | |||||
| + --vbarWidth; | |||||
| + --m_hfw.rwidth(); | |||||
| + h = widget->heightForWidth(m_hfw.width()); | |||||
| + } | |||||
| } | |||||
| max = QSize(m_hfw.width(), qMax(m_hfw.height(), h)); | |||||
| } | |||||
| -- | |||||
| cgit v1.2.1 | |||||
Copyright © 2015-2021 Solus Project. The Solus logo is Copyright © 2016-2021 Solus Project. All Rights Reserved.