测量· 10 轮 · 约 4 分钟

桌宠 2.0 在游戏里为什么更卡

PresentMon帧率源码阅读
一句话结论体感「2.0 更卡」,数据也是:卡顿每分钟 43 次 vs 9 次。原因不是显卡弱,而是游戏把显卡占满、2.0 每帧开销约是 1.1 的 3 倍且掉帧后不追帧。

实测 推测 查不了 更正dij 的话照录原文;Claude 的回复是节选,有删减;虚线框是 10-15 回看时补的批注。

01先看清改了什么

dij

还记得我们之前修改的bongcat吗,这里有个这个的作者,它们建立一个群,里面发布了它们最新2.0版本的模型,你看看,我已经将它保存在Bogocat-two文件中,并使用了这个模型,我直观是看不出来有什么差别,你看看,还有它们的优化要比之前的1.1要好了不少,不过我还没有实测在游戏上的具体优化,你先看看文件,后面在细说其他的内容

实测推测
Claude

你看不出差别是对的:2.0 的模型文件和 1.1 基本是同一套,真正换掉的是底下的程序。

  • 模型:导入的两个模型,moc3、贴图、物理文件的 SHA256 和 1.1 完全一样;自带的三只猫贴图逐像素相同,只是重新压缩过。
  • 程序:1.1 是 WebView2 + PixiJS 画猫;2.0 的 exe 导入表里有 D3D11CreateDevice、RegisterRawInputDevices,没有键盘钩子。实测猫显示时,名下一个 WebView2 进程都没有。

Claude 评:理论上对游戏有利。但上次查出的根因是游戏把整张显卡占满,猫分不到时间片,换引擎改变不了这个局面。能不能更好,只能实测。

dij

不急,现在可以尝试测试一下它的数据,但看你说测量方法需要改变,需要做什么,我打算实测一下具体的现象和帧率和之前相比,你看看如何解决

推测
Claude

上次测 1.1 是往 WebView 里注入脚本数帧数,2.0 没有 WebView,此路不通。

读了 2.0 的渲染循环源码:它每一帧都会调用 DXGI 的 Present。所以改用 Intel 官方的 PresentMon,通过系统事件追踪被动记录,不往任何进程里注入东西——还能顺便记录游戏本身的帧率,看挂着猫对游戏有没有影响。

先在桌面上校准:2.0 限 60 应该测出约 60;改成 240 应该测出约 240;1.1 抓不抓得到要试。两边设置调成一致(同一模型、同帧率上限、2.0 缩放调到 80% 让窗口一样大)。

下载 PresentMon,核对大小、SHA256 和 Intel 签名;桌面校准通过;dij 各用一个版本打了一局

02两局之后的数据

dij

两把已经测试完成,使用2.0时,可以明显感觉到帧率的波动和卡顿(但同时这个模型质量是最好的),第二个没有第一个明显,还可以但模型质量要次于第一个

实测推测
Claude

体感和数据完全对得上:2.0 在游戏里确实更卡,1.1 更稳。两只猫都没有拖慢游戏本身的帧率。

猫帧率中位数fps,越高越好2.0:461.1:56明显卡顿次/分钟,越低越好2.0:431.1:9每帧 GPU 时间毫秒(估算),越低越好2.0:0.351.1:0.10
2.01.1 补丁版
指标2.01.1 补丁版
帧率 ≥ 55 的时间占比27%54%
1% low19.123.6
游戏帧率中位数153152
整卡利用率99%98%

为什么 2.0 更卡

  1. 每帧 GPU 时间约是 1.1 的 3 倍(实测推算)。源码里两处写法会加重负担:每个带遮罩的部件都单独配一张窗口大小的遮罩纹理、每帧清空重画;模型贴图没生成 mipmap(MipLevels: 1)。推测 这两处是主要来源,还没逐个单独验证。
  2. 一掉帧就掉得很深(实测):帧间隔两极分化,78.7% 是正常的 16.7 ms,其余直接跳到 29–55 ms,20–29 ms 这一档是 0%。源码是单线程、2 个缓冲区、等垂直同步,晚了也不追帧;1.1 用的 Chromium 晚一帧后会连发几帧追回来。
展开细节

数据的局限

  • 每个版本只测了一局,地图和时长都不一样。
  • 我的采样器有 bug(变量名大小写冲突),「游戏 GPU 占用」这一列丢了——已修复并验证,改用整卡利用率判断负载。
  • 2.0 的窗口比 1.1 多 6% 的像素。
  • 有一次 2.0 只占 0.99% GPU,原因至今没弄清。
dij

从你上面给的数据,看出这个主要的瓶颈在我的笔记本的显卡上,这个如果换上更好的电脑和显存,应该可以直观的解决这个问题吧

实测更正
Claude

这里要小小纠正一下:瓶颈确实在显卡,但卡的不是「显卡太弱」,而是「显卡被游戏占满、没有余量」。显存也不是问题。

  • 两局显存用量 6.5–6.9 GB,总共 8 GB,没有用满。
  • 游戏限帧 160,实际中位数 152–153,连 160 都没稳住,整卡利用率 98–99%。

所以换电脑能不能解决,取决于换了之后有没有余量:要是把限帧提到 240、画质拉满,游戏又会吃掉全部显卡,问题照旧。

不花钱的验证:把游戏限帧降到 120,相当于「模拟一张更强的显卡」。上次已经证明过这个机制:给游戏限帧后,1.1 的猫从 33 fps 升到 88.6 fps。

dij

暂时先这样,桌宠打游戏也没有太大的需求,主要是日常使用电脑的时候会使用它

实测
Claude

日常桌面用的话,2.0 正合适:桌面上显卡余量很足,实测稳定在 60.01 fps;和 1.1 比,CPU 占用从 64% 降到 28%,物理内存从 763 MB 降到 168 MB。

10-15 回看
回看批注

这一段我喜欢的地方是:dij 先说了体感,数据随后证实了体感;而 dij 的下一个推断(「换显卡和显存就好」),数据又帮着修正了一半。体感负责发现问题,测量负责说清楚问题在哪。