From 30f47ca4f4accc9dffd2ec218612da8ac9561525 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 15:46:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(vkernel/desktop):=20=E6=97=B6=E9=92=9F?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=8C=89=E6=97=B6=E9=97=B4=E6=AF=8F=E7=A7=92?= =?UTF-8?q?=E5=88=B7=E6=96=B0=20RTC=EF=BC=8C=E4=B8=8D=E5=86=8D=E7=BB=91?= =?UTF-8?q?=E5=88=B0=E6=B8=B2=E6=9F=93=E9=80=9F=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:任务栏时间区域不会自己走,必须鼠标移过去才刷新。 根因:_draw_taskbar 里 RTC 缓存按“渲染次数”节流重读 —— if _render_count % 30 == 0: rtc.rtc_read_time() 而渲染频率完全取决于活动量:空闲约 1 帧/秒 → 要 30 秒才重读一次 RTC;鼠标一移动渲染 变快,_render_count 迅速累加,很快命中 %30==0 → 时钟立刻跟上。这正是“必须鼠标移动 才刷新”的成因。 修改: - desktop_thread 的“每秒”分支(cur_sec != _last_clock_sec)里先 rtc.rtc_read_time() 再标脏任务栏行 —— 时钟严格按秒刷新,与渲染速率解耦。 - _draw_taskbar 移除 _render_count % 30 的 RTC 重读,只取缓存值绘制。 --- VKernel/Kernel/services/desktop.vp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/VKernel/Kernel/services/desktop.vp b/VKernel/Kernel/services/desktop.vp index baa302a..c77fbdc 100644 --- a/VKernel/Kernel/services/desktop.vp +++ b/VKernel/Kernel/services/desktop.vp @@ -1448,9 +1448,10 @@ def _draw_taskbar(back: uint32*): _draw_char(back, w, h, ch_x, ch_y, first_ch, ch_col) icon_cnt += 1 - if _render_count % 30 == 0: - rtc.rtc_read_time() - + # RTC 缓存由桌面线程的“每秒”分支负责重读(见 desktop_thread 内 _last_clock_sec 那段)。 + # 此前是在这里按 `_render_count % 30 == 0` 重读 —— 会把时钟刷新频率绑到渲染速率上: + # 空闲时约 1 帧/秒 → 时钟 30 秒才动一次;鼠标一动渲染变快,时钟立刻跟上(表现为 + # “必须鼠标移动才刷新”)。 hr: uint8 = rtc.rtc_get_hours() mn: uint8 = rtc.rtc_get_minutes() sc: uint8 = rtc.rtc_get_seconds() @@ -1723,6 +1724,9 @@ def desktop_thread(arg: rawptr) -> int: cur_sec: uint32 = timer.timer_get_seconds() if cur_sec != _last_clock_sec: _last_clock_sec = cur_sec + # 每秒重读 RTC 缓存后再标脏任务栏:RTC 只有重读才会变,而此前重读是按渲染次数 + # 节流的(见 _draw_taskbar),导致空闲时时钟几十秒不动、鼠标一动就刷新。 + rtc.rtc_read_time() _mark_rows_dirty(_screen_h - tb_h_dt, tb_h_dt) if _mouse_moved: _mouse_moved = 0