XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8

C# 桌面的原生分辨率启动链

XFESystem C# 内核使用原生 framebuffer 像素作为输出。桌面逻辑缩放与输出分辨率分别记录;例如 3840 × 2160 / 200% 表示原生输出仍为 4K,布局坐标为 1920 × 1080。

启动顺序

UEFI → EFI/BOOT/BOOTX64.EFI(XFE 显示初始化助手)
     → EFI/XFE/Limine.efi → System/Kernel.elf(C# NativeAOT)

显示助手已迁移为 Source/XFESystem.Boot 中的 C# UEFI 实现,使用固定 bflat 8.0.2 编译,仅在退出固件 Boot Services 之前枚举和设置 GOP。内核为 C# NativeAOT;助手不提供进程、文件系统或应用运行时。旧语言助手只保留在历史发行和 Git 历史中。

助手从显示器 EDID 与 GOP 可用模式的交集中选取最高像素面积,没有有效 EDID 时使用最高可用 GOP 模式。QEMU 的原始完整 EDID 从经过厂商、设备和设备路径核验的 VGA MMIO 区域读取。共享同一 framebuffer 的重复 GOP 只保留一个,优先保留带完整 EDID 和设备路径的记录,避免控制台聚合句柄再次覆盖原生模式。

Limine 当前只读取 EDID 基础块中的首个首选时序。对于使用 DisplayID 扩展的高刷新率模式,助手向引导器提供临时的几何提示,原始 EDID 始终保留在独立的 XFEDISP1 诊断交接中。该临时提示的合成像素时钟不能用作显示器刷新率来源。 内核应使用原始交接 EDID,最后再回退到其他已验证的显示信息。

QEMU 启动参数

Tools/OpenCSharp.ps1 只读调用 Windows EnumDisplayDevicesW 和 EnumDisplaySettingsExW,记录全部已连接显示器的当前模式、最高有效分辨率及该分辨率下的最高刷新率,默认选主屏。2026-10-14 本机实测:

显示器 原生分辨率 当前 / 同分辨率最高刷新率
主屏 DISPLAY1 3840 × 2160 240 / 240 Hz
副屏 DISPLAY2 3840 × 2160 160 / 160 Hz

启动器为虚拟 VGA 分别设置首选和最高分辨率:xres=3840,yres=2160,xmax=3840,ymax=2160,edid=on,vgamem_mb=64。QEMU 的 refresh_rate 单位为 毫赫兹,因此 240 Hz 使用 refresh_rate=240000。只设置 xres/yres 不会过滤 QEMU 默认宣告的更大 CTA 模式。QEMU EDID 属性、EDID 生成实现。

GTK 默认 zoom-to-fit=on 并请求普通最大化窗口,将完整桌面和底部任务栏显示在可用客户区内。宿主视口适配会重采样画面;它不修改来宾原生 framebuffer 或来宾逻辑缩放。需要原样像素时显式使用 -NativePixels,此时较小窗口可能裁掉边缘。-FitToWindow 保留为显式适配选项,与 -NativePixels 互斥;-Fullscreen 仍为显式全屏选项,默认启动不使用全屏。

启动计划分别记录 ViewportPolicy、HostViewportResampling、NativePixelSamplingRequested 和 GuestFramebufferResolutionUnchanged,避免把宿主采样或窗口尺寸当成来宾降分辨率。Windows DPI 由 GTK 和 Windows 管理,脚本不修改系统 DPI 设置。Tools/CSharpBoot/TestLauncherViewport.ps1 在 Windows PowerShell 5 中验证默认、适配、原样像素、显式全屏及参数互斥;PlanOnly 只保存计划,不启动窗口,不能替代实际可见视口检查。

EDID 刷新率只是显示模式信息和渲染目标。GOP 不提供 vblank 中断;QEMU TCG、GTK 合成器和宿主呈现仍会影响实际输出。设置 240000 不等于已经测得每秒 240 次完整呈现,也不等于已实现显卡 VSync。

构建与检查

Tools/CSharpBoot/BuildBootShim.ps1
Tools/CSharpBoot/BuildKernel.ps1
dotnet run --project Tools/CSharpBoot/PackImage.csproj -c Release -- <Kernel.elf> <新的System.img>

原生内核的依赖由构建脚本固定恢复到项目内的 .tools/CSharpBoot/NuGetPackages,默认使用已提交的锁文件;不依赖宿主全局包缓存中的原生包副本,也不修改或清理该缓存。只检查恢复可执行 Tools/CSharpBoot/BuildKernel.ps1 -RestoreOnly,它使用同一默认锁定恢复路径,不编译内核或安装工具。确需更新锁文件时显式添加 -UpdateLock,检查包标识、版本及内容哈希后再提交。直接调用 dotnet restore 排查原生项目时,也应传入相同的 --packages .tools/CSharpBoot/NuGetPackages --configfile Tools/CSharpBoot/NuGet.Config 参数。

镜像默认 0x0 自动分辨率;显式小分辨率只用于对应测试。显示助手构建记录保存在 build/CSharpBoot/BootShimBuild/BootShimReceipt.json,含实际产物 SHA256、目标、工具链及源文件 SHA256。打包器拒绝源文件与助手构建记录不一致的情况;镜像内 System/BootShim.json 同样保留来源,不替换或伪造旧版引导文件。

Tools/CSharpBoot/ReadImage.py 独立验证主/备 GPT、FAT 镜像、引导扇区及 FSInfo 副本,以及 EFI 助手、Limine、内核和来源元数据。

Tools/CSharpBoot/TestDisplayChain.py <System.img> 使用独立镜像和变量文件,在无 GUI 的 QEMU 中检查默认模式、串口桌面就绪标记和原生截图尺寸;--refresh-hint 160 检查副屏模式信息,--diagnose-handoff 额外只读验证原始交接。测试关闭自己启动的 QEMU 并检查源/会话镜像未改变。

本轮实际启动链通过记录:build/CSharpBoot/DisplayChain-1791940070062807100/Result.json。截图为 3840 × 2160,原始 DisplayID 时序约 239.999344 Hz,GOP 请求和最终模式均为 33,QEMU 正常退出 0,完整镜像未改变。标准 DisplayID 解码采用时钟字段加一时约为 240000 毫赫兹;这是 QEMU 写入取整的细微差异。

EFI 助手宿主测试 3/3 通过,固定交接布局和最大模式选择。Windows PowerShell 5 已分别执行显示助手构建、只读显示模式探测和 OpenCSharp.ps1 -PlanOnly;计划文件为 build/CSharp/Interactive-1791940141054/LaunchPlan.json,ProcessStarted=false。该启动链检查不替代新的桌面功能验收,也没有操作用户窗口或物理磁盘。

历史优化前的桌面采样(保留对照)

Tools/TestDesktopUi.py 在自己的无 GUI QEMU 中先执行原有 13 组系统/应用检查及 10 组 HTTP 检查,再执行 12 组窗口、快捷键和性能检查。实际通过记录:build/CSharpBoot/Proof-1791940598582195700/Result.json。该次内核 SHA256 为 eceb26876b6651c51cc9e222574d41c24ff89dde1f39219307c0a97b6bad2dc8,完整磁盘镜像 SHA256 为 5539714c07db569b4d8babf30bc61b99e81335b13898e86f98f33dd4c6a9e33a,输出始终为 3840 × 2160 / 200%。

实际 QMP 键鼠输入覆盖:标题双击最大化及精确还原、拖动窗口、右下缩放、任务栏最小化/还原、三个窗口间连续 Alt+Tab 并释放 Alt 提交、反向切换、Win+D、独立 Win 键打开入口后按 Enter、Alt+F4。创建 80 行各不相同的文本,并保存验证全部 480 字符后,连续滚轮测试 3.1 秒。箭头、文本和缩放光标均保留原生截图。

采样 帧数 / 串口计数器时间窗 实际渲染率 平均输出像素/帧 最后单帧渲染耗时
只移动光标 593 / 4.003 秒 148.13 帧/秒 5,960.81(全屏的 0.072%) 0.428 ms
长文滚动 180 / 4.006 秒 44.93 帧/秒 1,650,360(全屏的 19.90%) 15.381 ms

计数器每秒输出一次,所以时间窗包括输入结束后约 0.9 秒的空闲;连续活动的一秒区间约为光标 190 帧/秒、滚动 58 帧/秒。两种采样的所有帧均使用局部复制,整屏复制回退均为 0。这次 TCG 验收没有达到实际持续 240 帧/秒,也没有验证物理屏幕 VSync。 QEMU 以退出码 0 关闭,镜像保持不变;该测试没有连接、控制或关闭用户已有的虚拟机窗口。

上述结果是优化前的历史记录,不能替代下面最终镜像的测量。该轮输入目标为每秒 240 次,后续改用每秒 500 次输入来避免输入频率限制渲染测量。

Preview2 同镜像验收与加速模式(历史记录)

Preview2 镜像 SHA256 为 246073dfdf299515d2a1044bff55afb5550ed6d14503f4cc04e765d968233274,内核为 3cdd10593e79914c64ba99f8fdf6ca88280c03a4256d1595f423b5008db4fe5f,完整源快照为 f022edf96b89dcb201ad449398e2168ef9067acb8abf10f5dd60314192365eb4。该快照重新捕获了打包工具最后修改后的全部 Tools,包括 Windows PowerShell 5 中文脚本所需的 UTF-8 BOM 编码修正,没有沿用旧快照冒充当前源文件字节。本节保留上一版证据;Preview3 使用下一节的新镜像和快照。

  • WHPX 完整验收:build/CSharpBoot/Proof-1791942225056738000/Result.json,13 组基线、10 组 HTTP 和 12 组窗口/性能检查全部通过。
  • TCG 同镜像窗口对照:build/CSharpBoot/Proof-1791942347118085900/Result.json,验证启动及 12 组窗口/性能检查。该轮明确没有重复 HTTP 交互;HTTP 通过依据是上面的同镜像 WHPX 完整验收。

两轮均从独立磁盘/固件变量副本启动,分辨率为 3840 × 2160、布局缩放为 200%,正常退出码 0,完整镜像未改变。TCG 的编译源快照直接复用经过哈希验证的 WHPX 快照,当前测试脚本另行保存,避免错误地将后来修改的源代码当作镜像的编译输入。

下面使用连续输入中两个完整的一秒计数器区间;每项实际输入持续至少 3.1 秒,每秒约 498 次鼠标移动/滚轮更新。滚轮更新包含按下和释放两条原始按钮事件,其数量与发送次数分别记录。

加速模式 / 采样 活动区间最小–最大提交率 活动区间中位数 平均复制像素/帧 最后单帧渲染耗时
WHPX / 光标 233.78–234.00 帧/秒 233.89 帧/秒 6,068.24 0.054 ms
WHPX / 80 行不同文本滚动 236.96–237.72 帧/秒 237.34 帧/秒 76,800 0.554 ms
TCG / 光标 231.47–233.94 帧/秒 232.71 帧/秒 6,063.91 0.542 ms
TCG / 80 行不同文本滚动 201.48–204.59 帧/秒 203.04 帧/秒 76,800 3.156 ms

滚动将此测试文档的复制区域由优化前的 1,650,360 像素缩小到实际可见文本区域的 76,800 像素,约为全屏的 0.926%。这与缓存字形、只修复指针覆盖区及跳过不变指针一起减少了 CPU 绘制和内存复制;长行内容的区域仍会按真实文字宽度扩大。两轮所有采样帧均为局部复制,整屏复制回退为 0。

活动区间采用来宾单调计数器;JSON 同时保留宿主墙钟时间、发送速率、含尾部空闲的完整窗口均值,二者不能混用。WHPX 的完整计数器窗口约 4.003–4.004 秒,宿主观察窗口约 4.140–4.157 秒;TCG 分别约 4.006–4.008 秒和 4.031–4.032 秒。结果会随宿主调度负载变化,本表保留最后一次完整源绑定的实际测量,不挑选早先较高的数值替代。这些结果描述软件渲染提交,没有证明物理屏幕持续 240 帧/秒,也没有实现或验证 GPU VSync。

宿主 WHPX 可用性来自只读检查:build/CSharpBoot/AcceleratorProbe-1791940841190/Result.json。WHvGetCapability 成功且报告 HypervisorPresent,独立无盘 QEMU 的 -accel whpx -cpu max 探测以及后续完整真实启动均通过。没有启用 Windows 功能或重启宿主。

启动器支持 -Acceleration auto|tcg|whpx,默认 auto 采用该镜像验收记录中的已验证模式;老记录没有此字段时使用 TCG。WHPX 验收记录可直接作为 -VerifiedBootResult 使用。Windows PowerShell 5 的自动 WHPX 计划检查记录为 build/CSharp/Interactive-1791941154063/LaunchPlan.json,没有启动 GUI。CI 测试默认仍为 TCG,测试脚本可显式使用 --accel whpx 和 --input-rate 500;--desktop-ui-only 是明确标记的定向检查,不会把未执行的基线或 HTTP 检查算作通过。

Preview3 最终同镜像、外观和视口验收

本版镜像 SHA256 为 5f6edc8eb78cf84c2e1db410a0b3e8899d2b92b80090460117cd7de6b9d2c5cd,C# 内核 SHA256 为 c4c23984d7958c5a8c701b6a9eb6ce6503dd87a7f40326189af07561c4ade77d,完整源快照为 094a6aa8bd7bdd9f35ddda848d7f843dfefabe7a51094dba9616941c07a06e57。

  • WHPX 完整 46 项:build/CSharpBoot/Proof-1791944375217929600/Result.json,13 项基线、10 项 HTTP 和 23 项桌面/外观/性能全部通过。
  • 同镜像 TCG 23 项桌面对照:build/CSharpBoot/Proof-1791944517922980900/Result.json。该轮没有重复 HTTP;HTTP 依据为前述同镜像完整 WHPX 验收。
  • Windows PowerShell 5 六项启动计划检查:build/CSharpBoot/ViewportPlan-DesktopPreview3.json,使用本版镜像和通过记录,验证默认适配、显式 FitToWindow、NativePixels、Fullscreen、参数互斥及 BOM/语法;没有启动 GUI、自动输入或物理磁盘访问。

两次真实引导均输出 3840 × 2160 / 200%,QEMU 退出码 0、完整镜像未改变、源快照一致。五类入口的悬停和按下像素比较均先排除指针范围;其中桌面按钮悬停/按下分别改变 21066/20718 个原生像素,Files 工具栏为 2651/2635。标题最小化位置上方不再有旧最大化方框,原生窗口圆角有 30 种颜色;箭头覆盖 729 个变化像素、33 种混合颜色,其中 138 个为蓝色核心像素。

Light/Dark、自定义 #14A8B4、无效短颜色拒绝、恢复 Blue 和重新打开设置均通过真实键鼠与截图检查。深色背景像素为 (9,18,27),浅色为 (238,239,248);自定义强调色使标题品牌区域 1796 个像素改变。设置存于当前 RAM 会话,Persistent=0,没有将关闭后的持久化算作通过。

原生截图底部任务栏完整存在,底部面板与桌面像素不同;这是来宾 framebuffer 的证据。PlanOnly 验证了 zoom-to-fit=on 和普通最大化窗口请求,仍不能替代实际宿主窗口内任务栏可见性的观察。NativePixels 关闭宿主视口适配,可能出现裁切;所有选择仍使用相同的来宾原生分辨率。

加速模式 / 采样 活动区间最小–最大提交率 活动区间中位数 平均复制像素/帧 最后单帧渲染耗时
WHPX / 光标 220.99–233.74 帧/秒 227.36 帧/秒 2,291.72 0.008 ms
WHPX / 文档滚动 223.60–239.93 帧/秒 231.77 帧/秒 76,800 0.328 ms
TCG / 光标 231.70–233.53 帧/秒 232.62 帧/秒 2,285.30 0.065 ms
TCG / 文档滚动 216.88–218.83 帧/秒 217.85 帧/秒 76,800 3.015 ms

两轮采样均为局部复制、整屏回退 0,每秒实际输入约 498 次。来宾完整计数器窗口均约 4.003–4.006 秒,包含约 0.9 秒尾部空闲;WHPX 宿主窗口约 4.234 秒,TCG 约 4.016 秒。表中活动中位数来自输入期间两个完整计数器区间,不与含空闲或宿主窗口均值混称。以上是无 GUI 来宾的软件提交率;没有实现或验证物理屏幕持续 240 Hz 呈现或 GPU VSync。

Preview4 最终窗口动画与运动验收

Final镜像 SHA256 为 417dbc5b3cdc1ccfcfb68428c1fa7326d0c8fbbc41622c705c48a5e0fc50d145,C# 内核为 2234b9457a662e386f46bd790a9062324aaeec18edc3ba9fbbd87e80bc1fcf5e,完整源快照为 cce4ce9dd1910a690578daf18e5d220b091a4b1b0970a6f48a9f725513f56678。Source 和全部 Tools 冻结后重新打包及验收,没有沿用修改前快照。

  • 宿主检查419项:build/CSharp/HostTests-1791948108242/Result.json,另有独立宿主 DOM 检查4项:build/CSharpDocuments/Browser-rtz1hI/Result.json。
  • WHPX 完整51项:build/CSharpBoot/Proof-1791949054028844600/Result.json,包含13项基线、10项HTTP、28项桌面。
  • 同镜像TCG桌面28项:build/CSharpBoot/Proof-1791949204993440000/Result.json,明确没有重复HTTP,HTTP依据是前述完整WHPX验收。
  • Windows PowerShell5启动计划8项:build/CSharpBoot/ViewportPlan-DesktopPreview4-ManifestFinal.json,包含匹配TCG记录、显式WHPX计划,以及错误镜像TCG记录拒绝;不启动GUI。

原候选包顶层清单在PS5中被 @(… | ConvertFrom-Json) 嵌套为一个数组元素,导致整份清单参与Display匹配,实际文件哈希正确仍被拒绝。Final只修正这一解析行,并增加 TestPackagedLauncher.ps1。build/CSharpBoot/PackagedLauncher-Preview4-Fix.json 在独立候选包副本中使用真实Start入口、原10条清单和修正启动脚本,6项检查覆盖自动发现成功、篡改、重复/缺失条目、不同镜像拒绝及源包不变;不启动GUI。上述新原生验收重新绑定了最终Tools,磁盘内容和内核未改;旧候选包、ZIP、报告与Proof均保留。

两模式均经独立磁盘和固件变量副本实际启动,输出 3840×2160 / 200%,退出码0、完整镜像不变、编译源快照相同。显示链、原始EDID和240Hz目标来源与前述相同。桌面移除顶部系统栏,最大化使用 (0,0) 到任务栏之上的工作区;Settings 为第五个桌面入口,底部入口保留。默认终端仍为前景 #75C9F5、背景 #0C1321。

最小化胶囊旋转0→90°,白色圆内关闭X旋转0→180°,均采用180ms平滑动画;中途移开从当前进度反向。QMP先捕获原始PPM再压缩PNG,避免压缩延迟把中间帧误采成终点。两模式进入、反向及完成帧均存在真实像素差,诊断进度有非零的下降中间值,恢复帧与初始帧逐像素差为0。标题双横线与两个按钮同处水平中心线,图元均在原生像素上抗锯齿。

运动采样使用至少3.1秒、实际约498次/秒的输入。下表采用活动期间两个完整的一秒区间,完整窗口包含约0.9秒尾部空闲的均值仍保存在JSON,不与本表混称。

加速模式 / 采样 活动区间最小–最大提交率 活动区间中位数 平均复制像素/帧 最后单帧渲染耗时
WHPX / 光标 219.78–237.00 帧/秒 228.39 帧/秒 2,292.57 0.009 ms
WHPX / 文档滚动 224.77–233.69 帧/秒 229.23 帧/秒 76,800 0.316 ms
WHPX / 拖动窗口 214.65–234.91 帧/秒 224.78 帧/秒 1,995,767.42 1.932 ms
WHPX / 调整窗口大小 222.71–236.89 帧/秒 229.80 帧/秒 687,594.26 2.077 ms
TCG / 光标 229.88–232.93 帧/秒 231.41 帧/秒 2,289.19 0.084 ms
TCG / 文档滚动 148.71–152.96 帧/秒 150.83 帧/秒 76,800 4.875 ms
TCG / 拖动窗口 58.61–59.75 帧/秒 59.18 帧/秒 2,003,571.61 15.848 ms
TCG / 调整窗口大小 69.40–69.45 帧/秒 69.42 帧/秒 702,381.93 12.354 ms

拖动复用上一帧不含指针的不透明内文;缩放只复用仍安全的交集,右侧保留96逻辑像素(代码文本160),底部保留64逻辑像素,避开长行截断和行数阈值变化。Settings 的条件布局禁用此复用。只有窗口位置未变、上帧和当前指针范围都不碰交集时,才跳过该交集的缓冲及线性framebuffer复制;否则仍正确复制。相应密集行、代码关键词边界、指针排除和不复制分支均有宿主回归。

WHPX拖动/缩放分别实际复用679/695帧,TCG为186/213帧。TCG串口整个验收结束的 ScanoutPixelsSaved 累计为287,084,184;这是从启动以来的累计量,不是单帧或仅某个性能窗口。两模式全部采样均为局部复制、整屏回退0。拖动和缩放后的稳定全幅截图分别与Win+D强制完整重绘比较,窗口状态相同、所有原生像素差均为0。

本轮优化前证据保留在 Proof-1791947178982005100(WHPX)及 Proof-1791947353762317100(TCG)。两轮使用旧镜像 1960e6e483913b50bd93c34fb6babdcfc67bd851a702cef04870d587a9e2ad00,不能与本节混为同镜像。TCG缩放中位数由38.73提高到69.42提交/秒,平均复制由2,042,992.07降至702,381.93像素/帧(减少约65.6%),末帧由23.875降至12.354ms。其他工作负载保留本次真实测量,不挑选历史较高值替换。本次仍未证明持续240帧可见呈现或GPU VSync,TCG大窗口拖动也仍有性能限制。

Preview4交互启动的 auto 改为核对同镜像、内核及源快照的TCG通过记录,再使用TCG。原因是本机Preview3实际GTK+WHPX在UEFI阶段90秒没有内核标记,而相同GTK适配/最大化配置使用TCG约8秒就绪;根因尚未定位。显式 -Acceleration whpx 保留为实验选项,无GUI的WHPX通过不冒充GTK已就绪。包内TCG记录同时核对清单SHA;不同镜像、记录损坏或缺失时拒绝auto/TCG。

默认GTK视口适配完整桌面,普通最大化而非预启动全屏;宿主重采样与来宾原生4K/200%独立。-NativePixels 关闭适配,可能裁切;与 -FitToWindow 互斥。PlanOnly通过只证明配置策略,原生底部任务栏截图也只证明来宾framebuffer,实际宿主可见性须由交互窗口确认。

文件和外观设置仍为RAM live,关机后消失。网站Markdown管线在来宾只呈现清理后文本,完整HTML/CSS/数学/图表在宿主另验;受限JavaScript与受控HTTP不等同完整现代浏览器。完整CoreCLR/.NET10、Framework4.8、原生HTTPS、多屏管理及实体GPU/输入设备驱动尚未完成。详见 Preview4操作说明 和 验收报告。

GTK 可见呈现节奏的只读核查

本机二进制报告 QEMU emulator version 11.1.0 (v11.1.0-12130-ge470268ff4),捆绑的 GTK/GDK DLL 为 3.24.52。官方 GitHub/GitLab 的 e470268ff4 源地址未能取得,因此以下 QEMU 源码解释使用官方 v11.1.0 标签作参考,不能当成该私有构建的逐字复现。DLL 版本、命令行帮助和 GDK 显示器查询均来自本机文件;查询没有创建可见窗口。

QEMU 的 GUI_REFRESH_INTERVAL_DEFAULT 确实是 30 毫秒,但 GTK 的 gd_update_monitor_refresh_rate 会读取 GDK 识别的显示器毫赫兹,并取 min(1000000 / refresh_rate, 30) 毫秒作为 listener 间隔。本机 GDK 识别主屏 AG326UZD2 为 240000 毫赫兹、副屏 U27G3X 为 159992 毫赫兹,所以该参考实现主屏会使用 4 毫秒。不能由 30 毫秒常量推断 GTK 一定被限制在每秒 33 帧。 QEMU GTK 实现、控制台计时器、默认间隔定义。

GTK 自身还有独立的绘制时钟:3.24.52 的 GdkFrameClockIdle 默认间隔为 16667 微秒,仅在上一帧有有效 refresh_interval 反馈时替换。所检查的同版本 Win32 window、events、display 和 GL 后端未找到这项反馈的赋值;因此存在 GTK 软件时钟仍使用约 60 Hz 默认值的风险。这是源代码推断,尚未通过当前 QEMU 可见窗口的逐帧呈现测量确认,不能报告成实际 60 帧上限。GTK 绘制时钟、Win32 窗口后端。

本机 -display gtk 帮助及对应 QAPI 未提供 GTK refresh 参数;display-update/display-reload 用于 VNC,SPICE 的刷新配置也不作用于 GTK。gl=on 本身不能证明 240 Hz 可见呈现。本轮没有改写 QEMU/GTK 二进制、强行添加未经支持的参数或把无 GUI 来宾提交率当作前端呈现率。QAPI 显示配置。

后续需要单独记录 QEMU 绘制回调、GTK frame-clock 和宿主实际 presentation 时刻,才能区分来宾、虚拟 VGA、GTK 和 DWM 的限制。若确认 Win32 GTK 使用默认间隔,可在可追溯的 GTK 源构建中将其接到所在显示器时序并处理跨屏变化;固定改成 4167 微秒仍不等同 VSync。该工作属于前端验证和重建,不通过修改来宾 EDID 或放大软件帧计数替代。