由来...

2年前,我终于换掉了我的10年前的古老的台式机,更换了一部性能还彳亍的笔记本电脑。它的配置如下:

名称 型号 备注
CPU Intel(R) i7-9750H 6c12t
GPU0 Intel(R) UHD 630 ...罪魁祸首(
GPU1 Nvidia(R) GTX 1660Ti with Max-Q
RAM 8+8GB ADATA 2666MHz 后来被我换成16+16的金士顿了
Disk 256东芝(铠侠)固态+1TB西数机械 东芝改名成铠侠了

我想了又想,这配置总该屙屎能超过1000fps吧,结果迫不及待地安装并打开屙屎后,我大跌眼镜:

打图最高只有300-330fps,再也上不去了!

百思不得其解的我随后去了包括度娘谷歌娘bing等等搜索引擎去查找相关信息。终于,我梳理出来为何我的屙屎那么慢。在这里也分享给大家。

注意:本文只适合于osu! legacy(以下简称osu)。osu! lazer暂时不适用,后续会解释为何。

其零:为什么osu需要高帧率(1000fps以上)

有些人可能会有这个疑问:你要那么高帧率干啥?你显示屏最高300Hz撑死,这就是大土豪才用300,一般人165 144 120就非常不错了,太高帧率容易导致画面撕裂,咋了你要那么高帧率?

答案:因为osu是个音游。

osu作为音游,对任何形式的延时都会令玩家非常难受。而且,osu的绘图线程和判定线程没有分离,这是一堆音游的通病。所幸osu! lazer将判定线程和绘画线程分离了,有一定改善,但是延迟的问题是个硬伤。这个我们后面再说。

另外,画面撕裂比起刷pp来说算个屁(跑)

在这里强调一句,帧生成时间不是延迟。

7dp7QS.png

红色箭头所指的时间数字4.3ms,不是延迟!不是延迟!不是延迟!

这个数字的名字,叫帧生成时间(Frame Time)。

这代表你的计算机渲染每一帧所花费的时间大小。而在osu中,由于判定线程与绘制线程没有分离,你也可以将它理解为你操作的“普朗克常量”。

举个例子:

7d92lT.png

拿我们最喜欢打(?)的OD10来说。OD10的300判定,显而易见只有+-19.5ms,也就是允许你39ms的左右误差。如果你使用60fps来游玩OD10,帧生成时间大约为1000/60=16.67ms,只允许你2个普朗克常量的操作误差,也就是你得在某两个帧之间让计算机得到你的操作反馈,难度可想而知。如果帧生成时间为0.5ms(约合2000fps),那么,你仅需要在某78个普朗克常量(78帧)的操作误差内让计算机得到你的操作反馈。是不是比较简单(迫真)了?

现在,让我们深入分析为什么双显卡电脑osu帧数那么低。

其一:应用渲染的原理——独显渲染核显输出

如果你的笔记本电脑和我一样不幸,不支持独显直连内屏的话,那么,一定有人会说 “外接一个显示器,关掉内屏,帧数马上飙升,或者直接核显运行”。为什么呢?

首先,众所周知,windows下,应用无法直接与硬件交互。尝试进行渲染工作的应用,首先要通过操作系统发送指令给GPU进行相关的渲染操作。而渲染完成的数据如何显示到显示屏上呢?通过显存。显存也就是显卡的内存,显卡将渲染出的数据先行输出到显存,然后通过接口输出到显示器。

懂了这一点之后,我们来看独显渲染核显输出的路径:

首先,独立显卡渲染显示数据。渲染出的显示数据首先进入独立显卡的显存。但是,由于独立显卡无法输出,只能将显存中的数据“搬迁”到内存中。这一段,可以在任务管理器独显中有个叫Copy的栏目体现。之后,依照CPU,核显将内存(核显的显存一般都是内存充当的)中的数据输出到显示器。

这样,能够保证应用比较高的性能(对于大型3A游戏是这样的)。

其二: 局限性——导致osu帧数降低的元凶

但是,我们运行的是大名鼎鼎的屙屎,即使是GTX970都能跑1000多fps的屙屎!

所以,这种独显渲染核显输出的方式非但不能提升性能,反而会大大降低性能。

这种渲染方式的瓶颈在三个地方:内存,CPU,核显。

内存

如果你的内存不是双通道(俩内存条插slot0和slot1),那么尽快组成双通道

我的内存比较慢,只有2666MHz。其读写性能当然比不上3200等等的内存条。所以,我选择双通道内存。双通道内存显然会比单通道内存快很多,因为双通道内存是两个内存条同时工作,带宽基本可以翻倍算。这样,当搬迁数据的时候,速度比起单通道来说可以翻倍算。

我的独显的显存频率有6001MHz,所以大家就没必要为了独显的显存速度担心了,(在配置一定的情况下)显存吊打内存是没问题的(

CPU

CPU在这之中起着主控的作用,因此CPU频率的高低也非常影响Copy性能的高低。我使用ThrottleStop将CPU的PL1温控解除,并强制最高睿频工作。。但是,要注意温度!小心过热蓝屏...

核显

核显在这里的限制可以说是最大的了。让我们看看GPU-Z的数据:

7dFWCR.png

哦买噶的,像素填充速度只有可怜的9.2GP/s,贴图填充也只有可怜的18.4GT/s,总线也只有42.7GB/s。

对比一下独显:

7dEi3n.png

,,,

64.2GP/s,128.4GT/s,288GB/s...

真是被秒成渣。

让我们算一算,1080p下,核显的最高输出速度

9.2G/(1920*1080)=4436.7283...

那么720p呢?

9.2G/(1280*720)=9982.63889...

翻了一倍吔!

(但1080p也有4436fps,这...)

别忘了,这是让核显以最高像素填充速度计算出来的理论值!它的带宽只有42.7GB/s,只有24个Shader单元,并且由于dwm和windows还有其他因素的影响,这一参考数值实际上没啥意义(跑),但是,这也说明,降低分辨率确实是个提升帧数的好办法。

回答上面的问题

为什么外接显示器可以让帧数上升?

这个得分你接的哪个接口。如果你的独显直接接在HDMI接口上,那使用HDMI接口运行osu确实可以提升帧数,因为去掉了Copy这一大限制,数据直接通过独显输出到了显示器。但我现在的外接显示器接在USBC-DP接口上,而这个DP接口接的显卡也是核显(干您*的戴尔),所以...

为什么只用核显也可以提升帧数?

跟上面一样,CPU和核显不用做Copy的工作了,帧数自然也就上去了。当然,仅限于osu这种很容易渲染的游戏来说。

你以为这就完了?

一通操作下来,全屏分辨率720p,CPU拉满,...
一看帧数,我去,怎么才450?而且右下角的框框都是红的,帧率还很不稳定?我被骗了?
莫急!windows自身和osu的渲染引擎也有一定的原因!

自Windows8以来,dwm(桌面窗口管理器)慢慢接管了所有程序的最终渲染。这虽说方便了全屏游戏内输入法的显示,但是也变相降低了性能——围绕dwm出的bug可不算少,包括内存泄漏...而且,dwm总是会占用一些GPU,使用高帧率的应用或者窗口(基于Opengl和DirectX的)开多了尤为如此。所以我们不想让dwm干扰我们的osu,我们只想使用legacy的全屏api让osu运行在一个没有别的应用打扰的地方。

7dZ9ln.png

如图,禁用掉osu的全屏优化。

再打开osu,诶为啥帧数没啥变化?

因为你的osu运行在opengl模式下啊。

双显卡下的opengl非常玄学。它会变相地增加输入延迟,以至于使用opengl玩osu的时候会感受到巨大的不跟手感,这一现象在osu!lazer中尤为严重。github上也有关于这个问题的issue,不过很遗憾的是,ppy似乎并不把它当回事(ppy懂个屁的osu!)

https://github.com/ppy/osu/issues/8165

等待osu lazer团队能否做出关于这个问题的突破吧。

7dZytg.png

7dZ4BV.png

解决模式也很简单,打开兼容模式(游戏主页->Options->兼容模式,不是右击osu.exe属性那个兼容模式!)。此时,你的osu运行在directX下。

保证你的屙屎运行在兼容模式与独占全屏的模式下。

验证方式

关闭osu,打开osu,如果你的电脑屏幕是首先变黑一段时间再出现的画面,那么恭喜,应该没有什么问题了。打图的帧数运气好一点甚至能跑满960fps。

小问题

当切换到其他窗口时,再切换会osu你会发现没办法切换回去,窗口会闪几下然后马上回到桌面。

这种情况下,鼠标切换到osu后立即多点几下,然后就可以继续游玩了。

小彩蛋

70Bye1.png

注:osu的分辨率为3440*1440。
所以还是独显直接连接屏幕上吧,润了(


欢迎来到Osu!SkinsV2站!