fix(vkernel/desktop): 时钟改为按时间每秒刷新 RTC,不再绑到渲染速率

现象:任务栏时间区域不会自己走,必须鼠标移过去才刷新。

根因:_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 重读,只取缓存值绘制。
This commit is contained in:
TermiNexus committed 2026-10-14 15:46:29 +08:00
1 parent e6aabf5cf2
commit 30f47ca4f4
1 file changed
+7 -3
+7 -3
View File
@@ -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