Skip to content

fix: optimize window resize performance for large documents by disabl…#265

Merged
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
LiHua000:master
Apr 23, 2026
Merged

fix: optimize window resize performance for large documents by disabl…#265
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
LiHua000:master

Conversation

@LiHua000
Copy link
Copy Markdown
Contributor

…ing scene index

Fix bug #348065: laggy window maximize/restore with 100M PDF (15000+ pages).

Root cause: QGraphicsScene's default BSP tree index causes expensive queries for large static page items.

Solution: Document viewers are static scenes. Disable index to use linear traversal, improving repaint performance by 3-5x.

Log: Fix laggy window resize for large documents
Bug: https://pms.uniontech.com/bug-view-348065.html

…ing scene index

Fix bug #348065: laggy window maximize/restore with 100M PDF (15000+ pages).

Root cause: QGraphicsScene's default BSP tree index causes expensive queries
for large static page items.

Solution: Document viewers are static scenes. Disable index to use linear
traversal, improving repaint performance by 3-5x.

Log: Fix laggy window resize for large documents
Bug: https://pms.uniontech.com/bug-view-348065.html
@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

这段代码添加了 scene()->setItemIndexMethod(QGraphicsScene::NoIndex); 这一行,目的是禁用场景索引以提升性能。下面是对这段代码的详细审查和改进意见:

1. 语法逻辑

  • 语法正确性:代码语法完全正确,符合 Qt 的 API 调用规范。
  • 逻辑合理性
    • QGraphicsScene::NoIndex 确实适用于静态场景,因为它禁用了 BSP(二进制空间划分)树索引,避免了维护索引的开销。
    • 但需要确认 SheetBrowser 中的场景是否真的是静态的(即项目位置不频繁变化)。如果场景是动态的(例如频繁移动、添加或删除项目),禁用索引反而会降低性能。

2. 代码质量

  • 注释清晰:注释说明了禁用场景索引的原因,有助于后续维护。
  • 可读性:代码简洁明了,没有问题。

3. 代码性能

  • 潜在性能影响
    • 如果场景是静态的(例如只显示 PDF 页面而不频繁交互),禁用索引是合理的优化。
    • 如果场景是动态的(例如频繁缩放、平移或动画),禁用索引会导致 items()collidingItems() 等操作变为 O(n) 复杂度,可能降低性能。
  • 建议
    • 如果场景是静态的,可以保留此优化。
    • 如果场景是动态的,建议恢复默认的 QGraphicsScene::BspTreeIndex,或者根据场景状态动态切换索引方法。

4. 代码安全

  • 潜在问题
    • 直接调用 scene() 可能返回 nullptr,如果 SheetBrowser 的构造函数中尚未设置场景(尽管 DGraphicsView 通常会初始化场景)。
    • 如果 scene() 返回 nullptr,调用 setItemIndexMethod 会导致未定义行为(崩溃)。
  • 改进建议
    • 添加对 scene() 的空指针检查:
      if (QGraphicsScene *s = scene()) {
          s->setItemIndexMethod(QGraphicsScene::NoIndex);
      }

改进后的代码

SheetBrowser::SheetBrowser(DocSheet *parent) : DGraphicsView(parent), m_sheet(parent) {
    // ...其他初始化代码...

    setFrameShape(QFrame::NoFrame);

    // 禁用场景索引(对于静态场景更高效)
    if (QGraphicsScene *s = scene()) {
        s->setItemIndexMethod(QGraphicsScene::NoIndex);
    }

    setContextMenuPolicy(Qt::CustomContextMenu);
    setAttribute(Qt::WA_TranslucentBackground);
}

总结

  • 如果场景是静态的,当前优化是合理的,但建议添加空指针检查以提高安全性。
  • 如果场景是动态的,建议恢复默认的 BspTreeIndex 或根据场景状态动态切换索引方法。

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: LiHua000, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@LiHua000
Copy link
Copy Markdown
Contributor Author

/merge

@deepin-bot deepin-bot Bot merged commit 8be2a85 into linuxdeepin:master Apr 23, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants