diff --git a/TeXmacs/progs/texmacs/texmacs/tm-view.scm b/TeXmacs/progs/texmacs/texmacs/tm-view.scm index 00a24823b2..8d3580b4b6 100644 --- a/TeXmacs/progs/texmacs/texmacs/tm-view.scm +++ b/TeXmacs/progs/texmacs/texmacs/tm-view.scm @@ -177,8 +177,7 @@ (save-zoom (get-init-page-rendering)) (set! saved-informative-flags (get-init "info-flag")) (init-env "info-flag" "none") - (full-screen-mode #t #f) - (fit-to-screen-width)))) + (full-screen-mode #t #f)))) (tm-define (toggle-full-screen-edit-mode) (:synopsis "Toggle full screen edit mode") diff --git a/devel/0319.md b/devel/0319.md new file mode 100644 index 0000000000..6ed9d50689 --- /dev/null +++ b/devel/0319.md @@ -0,0 +1,42 @@ +# [0319] 优化全屏模式 + +## 1 相关文档 +- [dddd.md](dddd.md) - 任务文档模板 + +## 2 任务相关的代码文件 +- `src/Edit/Editor/edit_typeset.cpp` +- `TeXmacs/progs/texmacs/texmacs/tm-view.scm` + +## 3 如何测试 + +### 3.1 确定性测试(单元测试) +```bash +./bin/test_all +``` + +### 3.2 非确定性测试(文档验证) +使用 Marketing/客户服务/蒋浩然教授/3DEC 三维离散元法讲义.tmu 进行测试,打开文档并尝试进入演讲模式,不应该存在长时间卡顿与多次重排,应在1秒钟左右进入全屏模式,且编辑区域不会出现缩放应不变,不会出现页面过大的情况 + +## 4 如何提交 + +提交前执行以下最少步骤: + +```bash +git diff HEAD +git commit -a -m "[0319] 优化全屏模式切换性能并修复连带的缩放问题" +``` + +## 5 What +1. 优化了环境改变时的更新机制,当 `info-flag` 发生改变时,不再触发高耗时的整树排版环境更新(`THE_ENVIRONMENT`)。 +2. 作为该性能优化的连带修复,移除了在进入全屏模式时自动调用 `fit-to-screen-width` 的行为,避免因环境同步时序变化引发的异常缩放 Bug。 + +## 6 Why +**核心问题:性能瓶颈** +原先在进入和退出全屏(如演讲模式)时,系统会修改 `info-flag` 的值。底层在处理环境变动时,默认会对这类变动发起 `notify_change(THE_ENVIRONMENT)` 通知,导致排版引擎进行阻塞式的“整树重排”。对于大型演示文档(如拥有上百页幻灯片的讲义),这会引发严重的卡顿,体验极差。为了提升性能,必须屏蔽由 `info-flag` 触发的这部分无谓排版开销。 + +**衍生问题:缩放失真** +在实现了 `info-flag` 的性能优化后,全屏操作变得极其顺滑且无阻塞。但随之而来的是,Scheme 层在触发 `full-screen-mode` 后立即执行的 `fit-to-screen-width` 会在操作系统的物理窗口来得及改变前,读取到处于“窄屏幕尺寸”下的旧窗口宽度。再结合内部排版映射率(因剥离了重排阻塞而未刷新),导致计算出的缩放比例(Zoom Factor)大得离谱,使文档过分放大。鉴于基于异步延迟执行(如 `delayed`)的 Workaround 并不可靠,因此决定直接移除全屏模式进入时的自动缩放计算。 + +## 7 How +1. **C++ 层(性能优化):** 在 `src/Edit/Editor/edit_typeset.cpp` 的 `edit_typeset_rep::init_env` 和 `edit_typeset_rep::init_default` 函数中,特别加入了针对 `info-flag` 的条件判断:当变量名为 `info-flag` 时,跳过 `notify_change (THE_ENVIRONMENT)`,直接返回,切断不必要的整树重排链条。 +2. **Scheme 层(解决Bug):** 在 `TeXmacs/progs/texmacs/texmacs/tm-view.scm` 文件中的 `toggle-full-screen-mode` 函数中,原本在执行完 `(full-screen-mode #t #f)` 后会调用 `(fit-to-screen-width)`。将其移除,全屏切换时只负责全屏化操作,不再主动触发缩放计算,从而从根本上避免了此 Bug 的发生,并将这个逻辑统一应用到所有全屏模式。 diff --git a/src/Edit/Editor/edit_typeset.cpp b/src/Edit/Editor/edit_typeset.cpp index 25e6254086..df013e6208 100644 --- a/src/Edit/Editor/edit_typeset.cpp +++ b/src/Edit/Editor/edit_typeset.cpp @@ -989,6 +989,7 @@ edit_typeset_rep::init_env (string var, tree by) { if (init (var) == by) return; init (var)= by; if (var == "full-screen-mode") return; + if (var == "info-flag") return; if (var != PAGE_SCREEN_WIDTH && var != PAGE_SCREEN_HEIGHT && var != ZOOM_FACTOR) require_save (); @@ -1001,7 +1002,7 @@ edit_typeset_rep::init_default (string var) { init->reset (var); if (stydef->contains (var)) pre (var)= stydef[var]; else pre->reset (var); - notify_change (THE_ENVIRONMENT); + if (var != "info-flag") notify_change (THE_ENVIRONMENT); } /******************************************************************************