Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 旨在避免 Windows 启动阶段显示子系统初始化与 Sunshine 同时枚举/恢复显示配置发生互相阻塞,从而缓解部分机器“开机黑屏一段时间”的疑难问题。
Changes:
- 将
session_t::init()中的显示设置恢复从“立即执行”改为“通过定时器延迟执行”。
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| // 延迟恢复显示设置,避免在系统启动期间与显示子系统初始化互相阻塞 | ||
| auto &session = session_t::get(); | ||
| { | ||
| std::lock_guard lock { session.mutex }; | ||
| session.timer->setup_timer([&session]() { | ||
| BOOST_LOG(info) << "尝试恢复显示设置..."; | ||
| session.restore_state_impl(); | ||
| return true; // 单次执行 | ||
| }); |
There was a problem hiding this comment.
这里复用 session_t 的 StateRetryTimer 做启动延迟恢复会被后续的 timer->setup_timer(...) 覆盖/取消(例如 configure_display 在成功路径会调用 timer->setup_timer(nullptr)),导致启动时的 crash recovery 可能根本不执行。更严重的是:如果旧的 persistent file 还没被 restore/revert 清理掉,就先进入 apply_config,有可能覆盖掉旧持久化数据,从而丢失“原始显示拓扑”信息。建议把“启动恢复”从共享 retry timer 中解耦(独立的一次性延迟任务/线程,或在第一次 configure_display 前强制完成一次恢复/至少加载并清理旧持久化文件),以保证恢复逻辑必定发生且不会与后续重试定时器互相踩踏。
|
复用 StateRetryTimer 有三个致命问题: 改造复杂度过高,建议是模仿上游,直接重构屏幕组合模块 |
e6bbe21 to
d74f9ed
Compare
CCD全称是Connecting and Configuring Displays,是Windows用来记录显示器分辨率、刷新率和多屏布局的一套机制。所谓的“CCD锁”通常是指系统把显示器配置死死记在了注册表里,导致你换设备串流或者用虚拟屏时,分辨率死活对不上或者画面错位。搞串流的经常得去注册表里把那几个CCD相关的项删了重置,才能解决这些奇葩显示问题
win启动后初始化显示器,sunshine同时获取显示器列表,二者互相冲突,导致个别电脑,开机黑屏一段时间。说不定也可能是显示器的问题。
疑难杂症