会话日志 wl-webrtc.log(119.4s Portal/PipeWire 会话)中:
wl-webrtc.log
WARN wl_webrtc::state_portal: compositor frame delivery stalled
resumed
capture_fps
src/state_portal.rs:357
let stall_threshold = Duration::from_millis(100).max(frame_interval * 3);
@60fps 阈值 = 100ms。
KWin(以及大多数 Wayland 合成器)采用损伤驱动(damage-driven)的帧提交——画面静态时不送新帧。这是 Wayland 的正确行为,但当前实现把它当作异常,触发 filler 帧硬怼(见 #4),导致下游一连串浪费。
encoded_fps
state_portal.rs:387
CursorFromCache
wl-webrtc --port 56666 -v # KWin / KDE Wayland session, connect a viewer, leave screen mostly static
观察 1 分钟内 compositor frame delivery stalled 出现次数与 resumed after Xms 累计。
compositor frame delivery stalled
resumed after Xms
Blocked by:
output_bps
frame_bytes_max
sws_*
修复顺序:先 #17 拿到数据,再 #18 改 filler,最后修本 issue。
No dependencies set.
The note is not visible to the blocked user.
现象
会话日志
wl-webrtc.log(119.4s Portal/PipeWire 会话)中:WARN wl_webrtc::state_portal: compositor frame delivery stalledresumed——36 次停滞在会话结束前从未恢复capture_fps在 0.3 ~ 55.8 之间剧烈抖动(目标 60)触发位置
src/state_portal.rs:357@60fps 阈值 = 100ms。
根因分析
KWin(以及大多数 Wayland 合成器)采用损伤驱动(damage-driven)的帧提交——画面静态时不送新帧。这是 Wayland 的正确行为,但当前实现把它当作异常,触发 filler 帧硬怼(见 #4),导致下游一连串浪费。
影响
encoded_fps被人工维持(见 #6),无法反映真实质量期望方案(择一/组合)
state_portal.rs:387)在 60% 停滞率下无意义;改为基于"自上次真实捕获"的时间衰减CursorFromCache/ 损伤提示:让 KWin 在光标/小损伤时仍以低频送帧复现
观察 1 分钟内
compositor frame delivery stalled出现次数与resumed after Xms累计。Dependencies
Blocked by:
output_bps/frame_bytes_max/sws_*)修复顺序:先 #17 拿到数据,再 #18 改 filler,最后修本 issue。