概要
Windows 托盘点击“开始串流”后,可能需要约 10 秒才有反应。其中一个主要原因是托盘路径会在开始播放前同步执行接收端发现。
当前行为
StartStreaming 被处理后,托盘 worker 会调用 facade.play_capture()。如果 state.last_receivers 为空,ensure_receivers() 会同步调用 discover()。
当前 mDNS 发现会串行扫描两类服务:
_raop._tcp.local.
_airplay._tcp.local.
每类默认超时 2 秒,因此首次开始串流时,光发现阶段就可能固定阻塞约 4 秒。
相关代码
src/ui/tray/mod.rs: TrayWorker::start_streaming
src/app/facade.rs: AppFacade::play_capture
src/app/facade.rs: AppFacade::ensure_receivers
src/discovery/browser.rs: DISCOVERY_TIMEOUT
src/discovery/browser.rs: MdnsDiscoveryService::discover_devices
期望行为
从托盘开始串流时应该立即有响应;当已有缓存或已选接收端时,不应强制执行完整 mDNS 发现。
建议修复
- 对托盘已选目标优先使用缓存 receiver。
- 将 mDNS 刷新放到后台执行,不阻塞
StartStreaming。
- 并行执行 RAOP 和 AirPlay 两类 mDNS 发现。
- 只有缓存无法解析或目标缺失时,才回退到完整发现。
概要
Windows 托盘点击“开始串流”后,可能需要约 10 秒才有反应。其中一个主要原因是托盘路径会在开始播放前同步执行接收端发现。
当前行为
StartStreaming被处理后,托盘 worker 会调用facade.play_capture()。如果state.last_receivers为空,ensure_receivers()会同步调用discover()。当前 mDNS 发现会串行扫描两类服务:
_raop._tcp.local._airplay._tcp.local.每类默认超时 2 秒,因此首次开始串流时,光发现阶段就可能固定阻塞约 4 秒。
相关代码
src/ui/tray/mod.rs:TrayWorker::start_streamingsrc/app/facade.rs:AppFacade::play_capturesrc/app/facade.rs:AppFacade::ensure_receiverssrc/discovery/browser.rs:DISCOVERY_TIMEOUTsrc/discovery/browser.rs:MdnsDiscoveryService::discover_devices期望行为
从托盘开始串流时应该立即有响应;当已有缓存或已选接收端时,不应强制执行完整 mDNS 发现。
建议修复
StartStreaming。