Repository navigation
Releases
QuickLook · 看片版 4.5.0 —— 长按快进不再卡死,全屏真正铺满
QuickLook · 看片版 4.5.0(长按快进不再卡死 / 全屏真正铺满)
长按方向键快进:画面会彻底定格,松手也不恢复
这个问题很邪门——同样的片子,有时候一路顺滑,有时候按住两秒画面就死在那里,
进度条不动、松手不动,只能关掉重开。现在查清楚也修掉了。
实测(按住 1.5 秒,每 33 毫秒一次 +5 秒)
| 素材 | 修之前 | 修之后 |
|---|---|---|
| 243MB,关键帧间隔 53 帧(长 GOP) | 松手后 0 帧输出,画面永久定格 | 松手 26 帧,按住期间出帧 60 → 208 |
| 2560x1600 + 超分到 4K | 按住 1.5 秒只出 1 帧,只走了 10% | 走到 100%,出帧 56 |
| 533MB / 179 秒 | 按住出帧 202 | 按住出帧 765 |
三个原因叠在一起
- 每按一次键就去重新定位解码器,而重新定位是 100 毫秒级的活。按住时一秒按 30 次,
解码器永远在重新定位,一帧都出不来。 - 「丢掉定位前的旧帧」这个门槛只在「追上目标」时才解除。一旦片子读到视频轨末尾
(很多录制文件的视频比音频短),帧不再来了,门槛却还指着未来某个时间点,
于是所有帧都被丢掉,而且没有任何东西会再叫醒它——这就是定格。 - 每次按键都拿「当前播放到哪」加 5 秒,可那个值在定位完成前根本不动,
于是按住半天只前进 5 秒。现在改成累加「你上一下要跳到哪」。
顺带修的:定位失败时以前会把异常吞掉却照旧设门槛(定格就是这么来的),
现在会先把解码器冲一遍重试一次,还失败就把状态收干净。
按住时临时不超分:4K 输出每帧要几十毫秒,按住时跟不上。
按住期间跳过超分、松手 260 毫秒自动恢复;暂停时按方向键不会跳过
(那一帧你要看清,不能留一张糊的)。
24.9 天之后才发作的隐患也一并修了:计时用的 Environment.TickCount 是 32 位,
开机超过 24.9 天会回绕成负数,那之后 seek 的节流判断永远不成立,seek 会被一直吞掉,
而且日志里什么都看不到。现在换成单调时钟。
全屏:四周那一圈 1px 黑边
进全屏时窗口样式去掉、边框厚度没去掉。WPF 窗口默认有 1px 边框,它占的是客户区外的空间:
窗口 1920 宽,视频面板只拿到 1918,引擎按这个算输出、再被布局取整收成 1916,
于是 1920x1080 的屏幕上四周各留 1px。
修完实测:target 1916x1078 → 1920x1080,画面真正贴到屏幕边缘。
合并了上游 8 个提交
其中对我们有影响的是旋转角度的解析:90.000 在德语/俄语区域设置下会被解析成 90000 或 0,
上游改成按固定区域解析,我们直接采用。其余是文本预览、SVG 缩放、应用图标、MSI 图标。
测试工具也修了两处(它们一直在掩盖问题)
regress.sh里写死的测试片被清理掉了,之后每次回归都报「Open 失败」,
实际上是「什么都没测」。现在会自动挑一个存在的素材。- 倍速回路把期望帧率写死成 25fps,换一部 60fps 的片子就必然误报。现在以首次实测为基准。
安装
- 绿色版:解压覆盖,先退出托盘里的 QuickLook。
- 安装版:先卸载旧版再装这个(MSI 产品版本号没变,同版本不会覆盖文件)。
版本号里的 g30364df 是构建这个包时的提交。
验证过的
vsr / algo / storm / rate / nosupport 五条引擎回路 + 子进程回路 + UI 宿主真实菜单点击,
全部 GREEN,0 次卡顿、0 条错误。长按回路单独跑了两轮(进程内 / 子进程),都达标。
QuickLook · 看片版 4.5.0 —— 只重启内核,主程序不退出
QuickLook · 看片版 4.5.0(只重启内核,主程序不退出)
上一版(custom.3)修掉了「显存越用越多」,但用的办法是到期重启整个 QuickLook。
这个版本把病根拔了:解码和超分搬到独立进程,回收 = 关掉那个进程,主程序全程不退出。
上一版留下的两个打扰,没了
- QuickLook 每次重启都会弹一条「QuickLook 正在后台运行」的通知;
- 游戏++ 把 QuickLook.exe 当成游戏在监控,进程一退就弹一份性能报告。
现在主程序的 PID 从头到尾不变,这两个都不会再出现。
实测(真机,连开关 4 部片)
主程序 pid 19824 → 19824(全程没变) 线程 26 → 27~30
引擎子进程 14528:预览时存在,关掉预览 30 秒后自动退出
显存 1854MB → 1655MB(资源真的还回去了)
对比上一版:主程序每开一部片多留 55 个线程 + 250MB 显存,只能靠重启回收。
它是怎么工作的
QuickLook.exe 只看不管:面板、托盘、D3DImage
└─ VideoEngineProxy ──命名管道──┐ 命令:打开 / seek / 暂停 / 倍速 / 音量 / 换档
│
QuickLook.VideoEngineHost.exe ←────┘ 画面:共享显存,零拷贝,像素不进内存
└─ D3D11 设备 + MF 硬解 + RTX VSR + 缩放 + 音频 + 时间轴
这个版本顺手修掉的东西
- seek 泄漏:预卷丢帧那条分支直接
return,注释写着「tex 由 using 释放」但using在后面,
每丢一帧漏一张整帧纹理(长 GOP 片子 seek 一次能漏几十张)。 - 每帧新建解码纹理 → 按尺寸复用,25~60fps 下每秒几十次整帧分配没有了。
- 缩放着色器每预览编译两遍 → 进程内只编译一次。
- 音频回调句柄泄漏:
VoiceNotify没有 Dispose,GCHandle 一直挂着。 - 自重启抢单实例锁:新进程会在旧进程还没退出时弹「另一个 QuickLook 进程正在运行」。
已知情况
- 引擎子进程是 x64 的,ARM64 版暂时只能走进程内引擎。
- 首次预览多约 1 秒(拉起子进程 + 建设备 + 初始化 NGX),之后是热启动。
- 排障开关
IsolatedEngine:设成false退回「引擎跑在 QuickLook 进程内」的老跑法,
代价是显存/内存不再归还。改法见 README。
安装
- 绿色版:解压覆盖,先退出托盘里的 QuickLook。
- 安装版:先卸载旧版再装这个(MSI 的产品版本号没变,同版本不会覆盖文件)。
版本号里的 g89ec046 是构建这个包时的提交。
验证过的
vsr / algo / storm / rate / nosupport 五条引擎回路 + 子进程回路 + UI 宿主 14 次真实菜单点击
(倍速、VSR 三档上限、质量、三种缩放算法、H/W ↔ S/W 切换)全部通过,0 次卡顿、0 条错误。
QuickLook · 看片版 4.5.0 —— 显存不再累积
QuickLook · 看片版 4.5.0(显存不再累积)
这个版本只修一件事:长时间不关 QuickLook,显存会被吃光。
现象
连续预览十几个视频之后,12 GB 的卡能占掉 9 GB 以上,别的程序开始掉帧。
现场抓到的一次:进程开了 20 小时、预览过 23 个片子,稳稳占住 9.2 GB 显存,
关掉预览也不还,只有杀进程才清。每预览一次固定 +55 个线程、+250 MB 显存。
排查
能想到的都试过了,全部无效:
| 怀疑点 | 验证 | 结果 |
|---|---|---|
| 渲染线程没退出 | Join 计时 |
0–1 ms,正常退出 |
| 释放时抛异常 | 逐项 try/catch + 日志 | 0 条失败 |
| 托管对象没回收 | 强制 GC + 终结器排空 | 无效 |
| MF 平台没关 | 补 MediaManager.Shutdown |
1 ms 返回,无效 |
| WPF 还捏着表面 | 先解绑 D3DImage 再释放引擎 | 无效 |
结论:对象确实释放了,但底层原生资源(D3D11 设备上下文、解码器、共享表面)
被进程级缓存攥着,只有进程退出才还。这是驱动 / MF 的行为,改调用顺序救不回来。
这次怎么修的
- 预览关闭后自动回收:空闲 4 秒且线程数 ≥ 700 时,静默重启一次 QuickLook,
把资源一次性还回去。连续翻片不会被打断(4 秒内有新预览就跳过);
硬上限 1200 线程,连翻二十多部时关掉预览立刻重启。 - 释放加固:每个资源单独 try/catch(一个抛异常不再拖垮后面十几个);
先解绑 D3DImage 再释放引擎;补上对称的 MF shutdown;
把Join结果和线程数写进日志,下次排障直接从数据开始。
实测
| 阶段 | 线程 | 显存 |
|---|---|---|
| 空载 | 27 | 1.6 GB |
| 连预览 14 部 | 1144 | 7.5 GB |
| 停手 25 秒 | 24(进程已自动重启) | 2.0 GB |
重启之后预览照常:VSR=on、25 fps、无报错。
你会注意到的变化
托盘图标偶尔会闪一下(自动重启),1–2 秒后恢复,下一次预览多等约 1 秒预热。
正在预览时不会触发。
还没做的
设备复用(全程只用一台显卡设备、不再反复新建/销毁)才是根治,但要动引擎核心
并重测所有播放路径,留到下个版本。
安装
- 下载
QuickLook-4.5.0-10-g1249d86.msi - 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
- 未签名,SmartScreen 提示时选择「仍要运行」
便携版:解压 QuickLook-4.5.0-10-g1249d86.zip,运行其中的 QuickLook.exe。
版本号里的
g1249d86是构建这个包时的提交。
QuickLook · 看片版 4.5.0 —— RTX VSR 超分 + 键盘操作
QuickLook · 看片版 4.5.0(RTX VSR)
在上一版「方向键 + 自动聚焦」的基础上,把视频预览的整条渲染链路换掉了。
新渲染内核
MF/DXVA 解码 → D3D11 → BGRA → NGX VSR 超分 → D3D9Ex 共享表面 → WPF D3DImage
音频走独立的 SourceReader + XAudio2,按音频时钟节流,变速不变调(WSOLA)。
S/W · H/W 现在真的决定路径
| 档位 | 播放路径 | VSR |
|---|---|---|
| H/W(默认) | 新引擎:D3D11 + DXVA 硬解 | 可用 |
| S/W | 原播放器:WPFMediaKit + LAV 软解,不创建任何 D3D 对象 | 不可用 |
显卡跑不了 VSR(AMD / GTX 10 系 / 驱动过旧)时,H/W 会自动退回原播放器 + LAV 硬解,
播放本身不受影响,也不会弹错误框。运行中切换档位会带着播放位置和播放状态切过去。
超分辨率菜单
输出高度的上限:1K(1080) / 2K(1440) / 4K(2160)。
实际倍率由引擎按源高度和窗口尺寸换算,不超过上限,也不超过 NGX 规格的 4×。
预览窗口从小拉大时会按当前挡位重新算倍率,缩回 1:1 以下自动关掉,不用重开文件。
实测(848×478 源,同一帧,只改挡位)
边缘能量 = 相邻像素亮度差的平均值,越高越锐:
| 挡位 | 驱动双线性 | Spline36 | VSR | VSR / 双线性 |
|---|---|---|---|---|
| 1K · 1920×1080 | 3.089 | 3.871 | 4.296 | +39% |
| 2K · 2560×1440 | 2.360 | 2.941 | 3.323 | +41% |
| 4K · 3840×2160 | 1.592 | 1.978 | 2.159 | +36% |
VSR 不只是比双线性锐,也稳定高于 Spline36(+9% ~ +13%),说明确实在重建细节而不是插值。
细节对比图(左 → 右:驱动双线性 / Spline36 / VSR,点开看原始尺寸):
安装
- 下载
QuickLook-4.5.0-8-g19ba592.msi - 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
- 未签名,SmartScreen 提示时选择「仍要运行」
便携版:解压 QuickLook-4.5.0-8-g19ba592.zip,运行其中的 QuickLook.exe。
VSR 组件
nvngx_vsr.dll(NVIDIA RTX Video SDK)与VsrBridge.dll已随包分发。
版本号里的g19ba592是构建这个包时的提交(之后master上的文档改动不影响源码)。
QuickLook 自定义版 4.5.0 —— 视频方向键 + 自动聚焦
QuickLook 自定义版 · 视频键盘操作(4.5.0)
基于官方 master @ 2ec219a,仅改动 4 个文件(+169 / −4),其余插件零改动。
新增
←/→— 快退 / 快进 5 秒↑/↓— 音量 −5% / +5%- 空格打开视频后,键盘焦点直接落在视频上 —— 不用再点一下窗口,方向键立刻可用
ESC关闭后焦点自动回到资源管理器,方向键恢复「选择文件」
变化
- 单击不再播放 / 暂停(按需求移除);按住拖动移动窗口保留
- 顺带修掉「窗口最大化时点击崩溃」的
DragMove异常
仅视频生效
音频(mp3 / flac)、图片、PDF、Office 等其他预览类型的行为与官方版完全一致。
安装
- 下载
QuickLook-4.5.0-3-g9e4ad85.msi - 双击安装(用户级,无需管理员;会自动关闭正在运行的 QuickLook)
- 未签名,SmartScreen 提示时选择「仍要运行」
便携版:解压 QuickLook-4.5.0-3-g9e4ad85.zip,运行其中的 QuickLook.exe。
版本号里的
g9e4ad85是 rebase 之前的提交哈希,对应本仓库源码d84f26f,代码内容完全一致。


