Skip to content

Releases

窗口插帧助手 1.6.1 · 自动视频节奏识别(24 / 25 / 30fps)

Choose a tag to compare

@lrylnx lrylnx released this 29 Oct 13:20
  • 新增并默认选择「自动视频」:在捕获入口比较画面多个区域的变化时序,多个区域持续支持同一节奏后自动套用常见 24 / 25 / 30fps,不必事先知道原视频帧率。识别期间显示捕获原帧;静止时保留已识别结果,持续不匹配或换视频时重新判断。
  • 新增视频 24 / 25 / 30fps 内容模式:整帧确认相同的捕获跳过重复插值,再按指定节奏恢复均匀时间轴;状态栏显示变化帧率与跳过重复数。
  • 视频 4× 复用播放器的三级联中点请求;macOS 27+ 优先保持捕获尺寸(最多约 1080p 预算),实际失败时报告并回退兼容配置。视频原帧与中间帧统一转换/缩放路径,约 140ms 排程缓冲为全尺寸插帧留余量。
  • 修正静态细节保护的时间参考:4× 的三张中间帧改用各自 ¼ / ½ / ¾ 时间点的参考亮度,降低缓慢变化阴影提前跳变的问题。
  • 新增窗口采集上限(自动 / 24 / 25 / 30 / 50 / 60fps),支持播放时切换;状态栏区分窗口采集 FPS 与呈现 FPS。
  • 本机 1920×800、25fps 实际视频测试:运动段呈现中位约 100fps,确有重复画面被跳过。仍不是解码器级 PTS 同步;50/60fps、变帧率、很小的视频区域或低运动内容可能无法可靠识别,未锁定时显示原帧。
  • 需要 Apple Silicon 与 macOS 26 或更新系统,运行时尚需处理器报告支持低延迟插帧。macOS 15 用户可使用 v1.4.2 历史版本。

自动节奏识别与页面动画干扰检查见 自动节奏验证,视频模式见 视频模式验证,细节保护时序见 暗部时序与帧率验证。

SHA256 见附件 SHA256SUMS-1.6.1.txt。

窗口插帧助手 1.5.3 · 苹果原生 4× / 外接高刷屏

Choose a tag to compare

@lrylnx lrylnx released this 23 Oct 16:16
  • 苹果原生模式新增 4×:单次处理请求生成 0.25、0.5、0.75 三张中间帧。
  • 根据倍率限制采集频率;144Hz 外接屏的 4× 捕获上限为 36fps。
  • 保留原帧 Retina 分辨率、静态细节保护和防抖几何还原。
  • 为 4× 增加有界输出缓冲池容量,避免高刷排程时耗尽缓冲。
  • 本机外接 Q24T09、2560×1440 / 144Hz,640×400 和 2560×1340 动态测试窗口均测得约 140fps 的呈现中位数;存在长帧及启动丢帧,不保证恒定 144fps。
  • 验证实际生成三张不同且按时间推进的中间帧、暂停恢复、抓取方式切换、2×/4× 热切换及进程清理。详见 4× 验证记录。

窗口插帧助手 1.5.2 · 苹果原生 2× / Retina 静态细节保护

Choose a tag to compare

@lrylnx lrylnx released this 23 Oct 14:45

默认改用苹果 VideoToolbox 低延迟 2× 插帧。苹果模式需要 Apple Silicon、macOS 26+,并以运行时处理器支持状态为准。

  • 按源帧时间戳输出原帧与中间帧,修正启动时钟偏移和过深队列导致的持续卡顿。
  • 使用独立捕获缓冲,及时归还 ScreenCaptureKit 的系统帧。
  • 修正对齐后的插帧尺寸还原方式,消除比例不一致造成的上下跳动。
  • 默认完整 Retina 分辨率采集与输出,避免缩小再放大造成文字变软。
  • 静态区域保留高清原帧细节;运动边缘及快速物体经过区域继续使用插帧结果。
  • 运动判断使用小网格内的最大像素差,降低大窗口处理开销,并避免平均颜色掩盖细小运动。
  • 保留窗口跟随、输入穿透、暂停恢复、CAS 锐化热更新和抓取方式切换。原生界面固定 2×。

本机 3420×2138 捕获测试的显示回调统计中位数约 59fps;不是所有设备、内容或刷新率的保证。动态区域的光流工作预算仍约 720p,完整 Retina 合成会增加 GPU 与内存带宽开销。尚未实测整机功耗或 ANE 执行比例。

已验证真实中间帧生成、静态细节恢复、运动边界、几何对齐、播放时钟、暂停恢复、热更新、窗口跟随及工作进程清理。详见 本机验证记录。

下载包仅含苹果原生版,不包含 LSFG、MoltenVK 或 DLL。源码保留 --backend lsfg 诊断路径,需自行提供已有的引擎资源。

窗口插帧助手 1.4.2(渲染取帧时序 / 窗口跟随 / 暂停竞争修复)

Choose a tag to compare

@lrylnx lrylnx released this 18 Oct 17:23

修掉几处「看着像卡住、像点了没反应」的状态竞争。没有新功能,插帧算法与引擎二进制都没动。

这次修的是什么

  • 过期帧与最后一帧丢失。 以前渲染线程先取走一帧、再等 GPU 名额:GPU 忙时呈现的是已经过期的画面;更糟的是等待失败会把最后一帧丢掉,之后没人重新唤醒渲染。现在等到真正可写的 drawable 再取最新帧,输入画面活到 GPU 完成。
  • 拖动窗口后画面回跳。 实时跟随走的是便宜的按窗口查询,但 5 秒兜底检查复用了启动时缓存的坐标 —— 拖动或缩放后覆盖层会跳回旧位置。现在兜底也读实时 frame;恢复采集、预热新引擎时重新读取源窗口尺寸与所在显示器。目标窗口关闭会提示并停止。
  • 暂停 / 继续互相覆盖。 重复点「继续」会重启一次采集;「继续→暂停」抢跑时,未完成的异步 startCapture 会在暂停之后把采集又打开。现在暂停请求带递增版本号,后台旧遥测不能覆盖最新操作,快速切换会让旧请求失效。
  • 控制窗被后台引擎拖住。 引擎不读命令时写管道会卡住界面,父进程还留着多余读端、引擎死了也不报 EPIPE。现在命令写入走串行后台队列并关掉多余读端,卡死引擎按时回收。
  • 画质容错。 CAS 编码失败时回退原始画面(不再呈现没写入的中间纹理);GPU 提交失败会提示并停止会话。
  • 锐化强度显示百分比,提示从 20–40% 开始。

验证

  • dev/verify-local.sh:消息分帧、环境隔离、满管道不阻塞主线程、卡死引擎回收、画质档源码级判据(只允许 1:1 下真实生效的档),以及就地抽取真实 CAS shader 执行(零强度 MAE 0.000、非零强度有锐化响应)。
  • 真实 LSFG 动态验证:2× / 3× / 4× / 12×、性能模式、窗口与整屏切换、暂停竞争、暂停中换倍率、失败回退、进程清理。
  • 真实窗口跟随:暂停期间移动缩放后恢复,跨多个 5 秒检查周期 samples=240, staleBounds=0, missing=0。

适用与边界

Apple Silicon / macOS 15+。下载 ZIP 解压后运行「窗口插帧助手.app」,首次需要授予屏幕录制权限。

本版没有做优化前后的延迟 / 功耗 A/B 测量,不宣称任何性能提升;快速运动、遮挡、字幕与切镜头的插帧伪影取决于源内容与引擎,本轮未改。

SHA-256:daf31974a85d7cee5360c505b249c88af81f2b98af5a69cbc92cbf3a29cd58b0

窗口插帧助手 1.4.1(撤掉两个从未生效的画质档)

Choose a tag to compare

@lrylnx lrylnx released this 15 Oct 17:36

撤掉 v1.4.0 里两个永远不生效的画质项,并补上一条会拦住同类问题的判据。

这次修的是什么

v1.4.0 发出去后,真机实测反馈「几乎没有任何区别」。查下去发现不是效果弱,而是那两个档一帧都没跑过:

  • 「MetalFX 空间放大」和「按屏幕分辨率重建」都以「输出尺寸 > 采集尺寸」为前提,而本工具的采集尺寸恒等于输出尺寸(= 源窗口尺寸 × 屏幕缩放因子,上限是面板物理像素)⇒ 那个前提永远不成立,它们与「原始画质」逐像素完全相同。
  • 根因是一行硬编码常量:let workResolution = 0 —— 它是「采集尺寸 / 输出尺寸」唯一的差来源。
  • 真实日志佐证:每次启动都是 采集 640x400 → 输出 640x400,workRes= 只出现过 0,MetalFX 出现 0 次。

改了什么

  • 删除「MetalFX 空间放大」档、SpatialPass 实现与 import MetalFX。
  • 删除「按屏幕分辨率重建」开关及整套 --output-scale 管线(含子进程透传、已生效比对、失败回退),并把尺寸计算的三个函数收成一个 —— 让「输出 ≠ 采集」在结构上不可能再出现。
  • 「Lanczos 重采样」档一并从下拉去掉(1:1 下它与「原始画质」逐像素相同,留着同样是骗人);但保留 Lanczos 作为尺寸不匹配时的内部兜底,并给它加了按尺寸去重的日志 —— 兜底悄悄在跑正是最难查的那类问题。
  • 现在「画质」下拉只有两项:原始画质 / 自适应锐化,两项都真实生效。
  • 新增源码级判据(dev/verify-local.sh):断言 ReconstructMode 的取值集合只允许 off / cas,并断言代码里没有 SpatialPass / import MetalFX / --output-scale 残留。写完后做了反向注入(临时加一个 case metalfx)确认它会变红 —— v1.4.0 正是漏了这条。

一句实话:为什么这里没有「超分」

在「贴住源窗口」这个模型里,采集到的画面已经是 1:1 原生像素 ⇒ 没有任何放大空间,FSR / MetalFX / DLSS 这类上采样结构性用不上。要让它们有活干,只能先故意压低采集分辨率(就是小黄鸭那个 FSR 档的用法),但那是拿画质换性能,方向正好相反。本工具能做的「画质」只剩后处理(锐化)。另外,如果源窗口里播的本来就是低清内容(720p 视频铺满全屏),那点细节在源 App 把画面交出来之前就已经没了 —— 加什么滤镜都补不回来。

验证

verify-local.sh 全绿(含上面那条新判据的反向注入验证);代码签名、ZIP 完整性、解包后与源 .app 逐字节比对通过;产物 otool -L 已不再链接 MetalFX(独立证据,不是"代码删了框架还链着")。

适用

Apple Silicon / macOS 15+。自签名未公证,首次打开需右键 → 打开,或:

xattr -dr com.apple.quarantine "窗口插帧助手.app"

v1.4.0 里那个真正有价值的修复 —— 产物最低系统要求从 macOS 27 降到 macOS 15 —— 在本版保留。
(1.1.x–1.3.0 的成品包都只能在 macOS 27 启动;1.4.0 修好了,但顺带加进了上面那两个死档。)

开发记录

SHA-256:a1dc7bb8805af9b321a1f6726a8e34d75395896f99edabed9ee98a973823d486

窗口插帧助手 1.4.0(MetalFX 空间放大 / 屏幕分辨率重建)

Choose a tag to compare

@lrylnx lrylnx released this 15 Oct 17:20

⚠️ 这一版里的「MetalFX 空间放大」和「按屏幕分辨率重建」从未生效 —— 它们的前提(输出尺寸 > 采集尺寸)在本工具里永远不成立,
实际与「原始画质」逐像素完全相同,一帧都没跑过。
已在 v1.4.1 中移除。
本版唯一真正有价值的修复是「产物最低系统要求从 macOS 27 降到 macOS 15」,那个在 1.4.1 里保留。


以下为原始说明(未修改)

新增 MetalFX 空间放大画质档与「按屏幕分辨率重建」开关;并修掉一个一直存在的部署目标问题 —— 此前所有成品包(1.1.x–1.3.0)都被编成了只能在 macOS 27 启动。

本次改动

  • 画质新增「MetalFX 空间放大」(系统自带的 MTLFXSpatialScaler):现有几档里唯一不经过 Lanczos 的 —— 采集画面原样交给 MetalFX 放大,再由 Core Image 收尾。只在输出尺寸大于采集尺寸、且两者宽高比一致时生效,否则自动退回 Lanczos 并在日志里写明原因。
  • 控制窗新增「按屏幕分辨率重建」(命令行 --output-scale fill):内部按屏幕物理分辨率渲染。窗口比屏幕小时,配合 MetalFX 档才看得出效果;它只改内部渲染分辨率,覆盖层仍精确贴住源窗口、点击落点不变。
  • 修复:产物的最低系统要求。build.sh 现在显式指定 -target arm64-apple-macos15.0。此前不指定时 swiftc 会拿构建机的系统版本当部署目标,编出来的二进制最低要求是 macOS 27,而 Info.plist 里写的 15.0 并不生效 —— 在 macOS 15–26 的机器上双击会直接报「需要 macOS 27」。
  • 新增离线画质 A/B(dev/verify-metalfx-ab.swift,已接进 verify-local.sh),并更新控制窗截图。

验证

verify-local.sh 全绿:CAS 的零强度恒等与锐化响应;MetalFX 档的准入判定、纹理尺寸与方向(穷举 flipVertical 两种取值)。方向这条只能实测 —— 这条渲染链相对「关闭」档自带一次上下翻转,按「与 CAS 档对称」去推会得到恰好相反的结果、整个画面颠倒;脚本已把两种取值都固化成断言。代码签名、ZIP 完整性、解包后与源 .app 逐字节比对均通过。

画质 A/B(320×180 → 640×360,合成测试图):

用例 档位 相对双线性的锐度 过冲(振铃)
硬内容 Lanczos 1.768 0.065
硬内容 MetalFX 2.895 0.200
软内容 Lanczos 1.638 0.000
软内容 MetalFX 3.192 0.066

MetalFX 的锐度增益约为 Lanczos 的 1.8–2 倍,代价是边缘更容易出现光晕,且内容越「硬」越明显。这是两种风格取向,不是「哪个更好」 —— 结论随内容变,两组输入缺一不可。

适用

Apple Silicon / macOS 15+。下载 ZIP 解压后运行「窗口插帧助手.app」。自签名未公证,首次打开需右键 → 打开,或:

xattr -dr com.apple.quarantine "窗口插帧助手.app"

首次运行还需授予屏幕录制权限(菜单栏 ⚡ → 权限设置 → 勾上 → 重新打开本应用)。

压缩包里打包了 LSFG 引擎二进制(liblsfg_metal.dylib / liblsfg_extended.dylib / libMoltenVK.dylib / lsfg-vk.dll),属于第三方专有组件,不在本项目许可证范围内 —— 本项目只打包了本机已有的文件,完整说明见仓库 README 的「第三方来源与许可」。

开发记录(FSR4 / Magpie 调研、MetalFX 落地与离线画质 A/B)

SHA-256:d6cb6608e9da2f479f0cb9b624c41fb7466e45641af79c9057ae4fbe3e72fa3e

窗口插帧助手 1.3.0(免重启设置 / 实时画质)

Choose a tag to compare

@lrylnx lrylnx released this 15 Oct 15:40

修改设置不再重启整个应用,新增实时画质调节,并包含此前 1.2.0 的控制窗改版与 Dock 重新打开修复。

  • 控制窗口常驻;倍率、性能模式、抓取方式在后台自动应用。新引擎实际生成帧后才交接,旧画面继续保留;连续修改自动合并,失败保留原引擎。
  • 新增「原始画质 / Lanczos / Lanczos + 自适应锐化」及锐化强度滑块,运行中实时更新,无需更换引擎。
  • 限制 GPU 在途任务,丢弃过期帧;合并、顺序执行尺寸配置更新;减少日常诊断扫描及重复资源创建。
  • 修复整屏输出尺寸,并排除所有本工具进程,防止重复采集输出画面。
  • 复用已有签名证书,改善重建后的应用身份稳定性。

验证:本机真实 ScreenCaptureKit + LSFG 动态测试通过,覆盖 2× / 3× / 12×、性能模式、实时画质、暂停恢复、整屏切换、连续修改、失败回退、停止与退出清理;控制进程 PID 始终保持不变。管道测试、Metal 锐化恒等/方向测试、代码签名和 ZIP 完整性检查通过。

适用:Apple Silicon / macOS 15+。下载 ZIP 解压后运行「窗口插帧助手.app」。引擎切换需要后台预热,时间依分辨率和倍率而变化;画质仍为 SDR / 8-bit,不包含 HDR 支持。

优化、GitHub 调研与验证记录

SHA-256:492c92eca66681d9de777ef5288d9d21bc3675c96a26ae93a1cdff6d4d3a0568

窗口插帧助手 1.1.3(Metal HUD / 自动隐藏)

Choose a tag to compare

@lrylnx lrylnx released this 14 Oct 03:58

新增 Metal HUD 与悬浮控件自动隐藏,并包含 v1.1.1 之后的性能模式改动。

  • 控制窗、菜单栏新增「Metal HUD(帧率 / GPU 性能)」开关,实时生效并保存设置。
  • 右上角插帧角标、暂停 / 停止悬浮条:鼠标静止 3 秒后隐藏,在输出区域移动后恢复。
  • 隐藏悬浮条时撤掉鼠标命中区域,保留点击穿透,无需新增辅助功能权限。
  • 性能模式(轻量着色器)可在控制窗与菜单栏切换。

适用:Apple Silicon / macOS 15+。下载 ZIP 解压后运行「窗口插帧助手.app」。Metal HUD 默认关闭,可在控制窗或菜单栏开启。

验证:编译、代码签名检查与 ZIP 完整性检查通过。本次运行验证因屏幕录制权限未通过,未能完成实际采集及自动隐藏 / 恢复的端到端验证。

SHA-256:9e4e5bc1a60e560868d265ac90cb3a3ac36a059e9fcedba6e80ae8f50cd58636

窗口插帧助手 1.1.1(macOS arm64)

Choose a tag to compare

@lrylnx lrylnx released this 13 Oct 14:53

macOS 实时窗口插帧:给任意一个窗口做 LSFG 补帧。源窗口不动、不接管输入、不抢键盘。

下载 WindowInterp-1.1.1-macos-arm64.zip,解压得到 窗口插帧助手.app。
Apple Silicon / macOS 15+。

能做什么

  • 给任意窗口插帧 —— 窗口化游戏、播放器、模拟器都行。采集的是窗口本身,不是整块屏幕,所以窗口里放什么就插帧什么。
  • 源窗口完全不动 —— 输出是一层精确贴住源窗口的透明覆盖层。鼠标点击、滚轮、键盘照常直达源窗口,光标也跟手,不需要辅助功能权限。
  • 倍率 2 / 3 / 4 / 5… —— 自动倍率默认开启:探测屏幕刷新率与源帧率,挑最合适的一档,不达标会自动降档。
  • 抓取方式可选 —— 「窗口」或「整屏」,各有适用场景。
  • 输出重建(画质增强) —— 关闭 / Lanczos / CAS 对比度自适应锐化,三档随时切换,不用重启。
  • 省电开关 —— 采集上限、光流精度都能下调,牺牲一点画质换功耗。
  • 菜单栏常驻 —— 控制窗选目标窗口、倍率、抓取方式;全局快捷键,无需辅助功能权限。

首次打开

未签名未公证,Gatekeeper 会拦下。任选一种:

xattr -dr com.apple.quarantine "窗口插帧助手.app"

或在 Finder 里右键 → 打开 → 再点「打开」。

首次运行还要授予屏幕录制权限:菜单栏 ⚡ → 「打开『屏幕录制』权限设置」→ 勾上「窗口插帧助手」→ 重新打开本应用。授权只需一次,之后重新构建、重装都不会再问。

需要注意

  • 要高刷新率屏幕才看得出全部效果(60Hz 屏建议别超过 2×)。
  • 插帧一定会让文字变糊 —— 生成帧占比越高越明显(2× 约 50%、3× 约 66%)。看字、读文档时切回原帧模式即可,零损失。
  • 源窗口本来就铺满屏幕时,「输出重建」只有锐化那半起作用(不发生放大,分辨率不会变高)。
  • 不支持 DRM 内容、网络直播、HDR 输出。
  • 快速运动、遮挡、切镜头处可能出现插帧伪影,倍率越高越明显。

关于附件里的引擎

压缩包里打包了 LSFG 引擎二进制(liblsfg_metal.dylib / liblsfg_extended.dylib /
libMoltenVK.dylib / lsfg-vk.dll)。这些属于第三方专有组件,不在本项目的许可证范围内,
本项目只是打包了本机已有的文件。完整说明见仓库 README 的「第三方来源与许可」。

用法与边界详见仓库 README。