本文转自NGA:CanuHodl。wlk开放以来,看到了不少反馈游戏卡顿相关的帖子。有的说 tbc 团本还能稳定100多帧,到了wlk 25naxx就只有50多帧。还有的把这一切归结于detail。众说纷纭。但这类帖子多数不了了之 或者 附上一个“插件内存占用图” 然后不了了之。
于是便想写这么一个简易的自查攻略,帮助受此类问题困扰的玩家排查出卡顿所在并得以解决。
一、占用内存多的插件一定会引起卡顿吗?
不兜弯子,结论是插件的内存占用不会引起卡顿,或者说二者没关系。一些人有这个误区可能是因为看到插件内存占用里,第一的插件用掉了100MB+甚至更多内存,而第二第三只有几十MB或仅仅几MB,难免会觉得占用第一的那个插件是不是多少有些“问题”。 其实完全不是,造成卡顿的话 20行代码足够了,我把这20行代码做成了一个wa,载入后,在主城人多的地方,开启友方血条(默认键是 shift + v),你的帧数应该会瞬间暴跌,配置差的应该可以暴跌到个位数帧率,而这20行代码以及它工作时所占用的内存几乎小到可以忽略不计(1~2kB)。
卡顿体验WA
!WA:2!TA13VTnrC8LvqmLIqSWycK4bRs1uIye1og9HPH2QdjRDknP44UUbbLEX(C8rDo7D35M290icjg)AGQaEyIjOrtGqcPH6tWgsm1)cSIqiH4TPLX41(pW47zhN2UoaHeNAJ)(R77V8h)9Uefs1mLzkZlnAhIHlTIRpZa)C7PlYxy7Yk7jiUuEs2kLTS4yXu36LU6O7bwRJOgG(zDjur9C5lPNxRRHRRJPBlALwep8cBeZM3Sb2wv68fAlyKgnWm(tCiwFYVwvSIhw1Nse32NJRHCAHwHly(4fUn3VoEjmvuX3YIS861Ynzf9Av0NutxluENCUutsygoW2zzyWwTkZMVyX2CpSJZ0M8KTLUwgJfcE86EoOvWmnkQjMNSJjUo4EDijytLV4SfMR4Q(0(jxsV9JmeKLW6r8Z4AI)U9SjuZygf5CgOsGGV4MlIXEtcbZqOHG0XEvo2XkS3e8Oqa4iHpdjW2DGSud3qMWh7Gbd3fyRJmwSbZ1NAEPd4LsGxwuJBJG(2zJ64j8E2qHH)y5YAIad6tOsDP4vhO2709(O1(Z1(5wOQ0Q0Ex(M35g3O31UYFCL3P3x8939Z)X035hUzVV8YzQsV7h(EvSjwIxyPE)0f79jxV3h)bG(7T2fV7vx7Ex)ZG)8EYTLk5CDCzNorIedD7iPXvN6KZPx27PcfcagxiNigZtmf2AfilJn3mkRLKHsf7RBeU5C9lUncn4T85cI1kQfZxqVdZvaTkDqUAPYLYhmmd6ssZ6eARryUmeSwTFlbaG37TF)Ex7B3r7locDdL1YLzopd51E((erbEjcNu3bVq)QDByAV9pDPs51QPwwxV8mAtFQP07oiEvixa)89RKZUJ4i1gcLkpNEXPlL)x72WXTvbg(8(yQXkZ(iJL9iVCujjvSU8Nyp0wYi3C36(cHlT8sygGu7ifxetBiSF6q7JRSvLm5g0o2aG4NkwITQuPDy01TjglsXC(qH7OIbYbhrwKaI3FyauH(cMzx3gtAylM6K1x)3oX9V)9vDCrMfQlGTqfhuRPVJGKuvI0pyWRLuZWbX5skvo0sKeDyHWBzzeSVJ4tmx3AMXNa(65m5lmXQikrcrCPtOXfiMOWgyehxrWclVhly4Gr7Ak)ubmPMCUaJJH5gM82s7cD6OQnreAHGxp06G3iOAWBgmADlcLWTFqXRtOrFPa(lzhJbtlsYKFwdeteCUcRA6wZaqGUnxOE0ZL3lYXfAtkwkVIsoggWJfyW0I0JyjFmsMKjJ0la9J1NMSnAn85NekdDstCO0Kw(0WaQOJ5I0zsQaRx8fv8yaulTiIx6mHYlOmEihK3klEyf5qQzDGeqHqv8qegpDUALIfM9uyXagE6mzumDd3TCfLqXCpykflpkHLJgva5dcx25ajHfDwPUbM3YM4GL((4khDmiAkd0SL2ThQJRm(yJTBd3kYYiEyf5Pdq4LbvU10YycsZSRnTZYy7CXnU4fMAUdEz7GSlRiwHzGIWgt3Dko4vK0Mm)TUpMw(u(p8((yvWIkgmINi9iLPZ5zc90roC4RFa9alnUCMV3XMwEwIfYaxDsttarwDEmArzrXRoRBlmlKCgSjbvTICh8QgiXrY62OrBa3g6e7GAjvb8V4qbg2bMlN4e)BO3yil5FeDkxrL)4JN5)jq5wTZhgmlZdyhzBiGWKLSZ3GqsY4zltRvYtdBXWC7Yud8dZ9z(V8cs9cUUntWwo(opt(nddx5jrhHRXsrh5VVLU1ieZ6rN3QT1zsEPGPW56FXh42cW1bWlSz0jfH5HCgw9k50YNVKgYXZgnuDa6BrAKekyPZX2ATKhvo1jn(9p9RK30k8TgmJejqdTUjHlV(Y0WMEM9M6DBhFjlBVdetkp68vjCeCWMPDkU2rZoE2JMAPF5S)f所以现在你可以打消这个顾虑了,内存买来就是要用的,在允许的限度内,程序/插件把更多的数据往内存里填,加快它的处理速度才是正常且预期的。对于密集数据处理型插件,如Detail,通过增加内存使用来降低CPU占用,进而减少卡顿,是一种以 “空间换时间”,十分好的处理方式。退一步说,现在应该也没多少人会缺内存容量了,关心占用了多少内存,不如去关心关系你的内存频率。
二、使用Interface Usage找到卡顿的元凶
插件所带来的卡顿,几乎全部集中在CPU上,尤其在多人的团本中。所以这里我们需要借助一个叫Interface Usage的插件来揪出过度占用CPU的元凶。
1、插件下载
通过curse官网,或各类插件下载器下载,目前它的版本只有正式服,下载后放到怀旧服的插件文件夹内加载使用即可。
安装插件后 输入 /iu, 会调出如图的界面,选择Addon CPU Usage,勾选右下角,然后观察红框的两列。第一列是瞬时cpu占用时间,第二列是瞬时cpu占用时间的叠加,点Reset按钮后可以重置。
2、具体怎么使用呢?
a. 比如你遇到的是这个帖子的问题, [刀扇卡顿],即 特定情景的卡顿,这类卡顿十分好重现,如释放某个技能时卡,开启某个界面时卡,进入某个区域时卡等等。这时候调出上面/iu的界面,去重现卡的场景,同时观察第一列瞬时占用就可以了,卡的时候你会很容易看到一个插件瞬时占用飙升到第一名,并且大幅领先第二。那么禁用它即可,问题迎刃而解。
b. 另一种情形没这么直观排查,比如25人团本卡,怪多的时候卡,AOE场景卡等等。这时建议选取一个场景复杂的BOSS来测试,如25naxx尾王,还是同样/iu调出界面,在团长开怪倒数的时候点击 Reset,然后正常打BOSS即可,打完后去观察上面的第二个红框 ,点击标题栏由高到低排列,此时不出意外,排名前三的插件 比 其他所有插件的cpu占用时间总和 还要多的多的多。禁用或换替代插件即可,问题迎刃而解。
通常来说,占用高的插件都是密集数据处理型的插件。如WA,Detail,Exrt,姓名板插件(Plater等),光环类(EAM等)。非密集数据处理的如 地图插件,背包整合,掉落查询等几乎在25人团本战斗时不会产生任何占用。这里需要额外多说几句的是WA,WA是一个十分优秀的插件,但分享给你WA字符串的人可就未必了,比如我上面那个20行可以把你帧数卡炸的字符串。实际情况中,如果你团本卡顿,通过上面的 方法b 做排查,占用第一的很有可能是 WA,这时需要通过WA内置的性能分析做进一步排查,方法是右键点击WA的图标,会弹出如下的界面,它会列出你的每一个子WA,也就是你字符串所导入的每一个“项”的占用。
使用方法与 Interface Usage大同小异,就不赘述了,通常来说 光环类WA,和属性统计类WA都有很高的开销。所以用什么载什么,不要去网上把别人的字符串一股脑的全闭眼载到自己电脑里。那种团本/5人本整合WA,也就是光环类WA,最好找原创或一手汉化的使用,不要使用各种魔改版本。 因为传播者/魔改者水平有限,改出了卡顿他自己往往都不知道,还是回到那句话,WA是个十分优秀的插件,但分享给你WA字符串的人就未必了
最后,排查完毕 记得禁用iu,或者取消勾选它右下角的 'Enable Script Profiling',因为 iu 保持监测状态的本身同样会二次消耗大量的cpu,不用时记得关闭。
三、进阶内容
使用Interface Usage找到卡顿的元凶,续:理性看待cpu占用。如果你有兴趣更深入的研究卡顿的本质,可以展开来看,该部分内容的关键字:帧生成时间,受限于篇幅,此部分内容全部从简。
1、什么是卡顿?什么又是流畅?
直接上结论。“卡顿的本质是帧生成的时间不连续”。 简单说,以100fps为例。 cpu与gpu协同,每10ms处理完1帧,总共用1秒连续处理了100帧,这叫100fps。 另一种每5ms处理完1帧,先处理了99帧,而最后1帧用了505ms才处理完,总共也是用1秒处理了100帧,这也叫100fps。 但前者的体验是流畅,后者就是炸裂般的卡顿。
2、120帧一定比60帧流畅吗?
从上面结论看,答案是否定的。帧生成时间的稳定,才是流畅的基础。稳定的60帧,体验要远远好于帧生成时间不稳定的120帧。这是大多数游戏直播只有30帧,但你观看起来依然不会觉得卡的一个原因之一,因为当推流编码不过载时推流帧是匀速的。 与此同时越来越多的游戏硬件评测里 加入 帧生成时间 指标参测也是这个道理。
3、插件造成卡顿的本质
本质是 某一帧,或集中于连续的几帧,插件对CPU造成了过高的处理请求,从而导致这一帧,或这几帧的帧生成时间大幅增加。 这在游戏中十分常见,1. 比如背包整合插件bagnon在点下“整理”按钮时的卡顿便是如此。2. 比如团队成员状态监控类WA,在有人进团和退团瞬间的卡顿,因为进团,退团会触发对应事件(event) 使这类wa在这一帧 遍历所有团队成员的光环等数据,导致这一帧的CPU处理压力激增。3. 比如正式服双王或典狱长被控制时,全团队友血条变红名那一瞬间的卡顿,大概率是姓名板插件触发大量 NAME_PLATE_UNIT_ADDED 事件进行 init 操作从而导致这一帧的CPU处理压力激增。这样的例子太多,篇幅所限不再展开。所以知道了卡顿的本质后,在排查时需要结合上面的 a, b 方法一起来用,因为 通过方法 b 排查出来的整体占用率低的插件,不代表他们在工作的那一小会没有带来短暂尖峰的CPU的激增占用,而这种短而激增的占用,往往才是把我们帧数从稳定瞬间拖垮的关键。所以有条件的选一个卡顿的BOSS战斗场景在做上面 b 方法测试的时候,可以同时开启录屏 (使用Nvidia ShadowPlay 或 OBS NEVNC 编码器录屏,这俩对系统资源占用极低,对游戏帧数影响极低),然后回看你录制的视频,找到是你帧数突降的时刻,这时去观察瞬时占用,大概率会揪出一个 瞬时占用激增的插件,这便是卡顿的核心。
4、回到这一节的主题 “ 续:理性看待cpu占用 ”
前面三段都是为了铺垫这一节内容,即何为理性看待,总结,通过上面的方法 b 测出了某个插件对CPU有大量的占用后,先不要急着下结论删插件,先禁用此插件试试,看帧率是否有大幅提升。如果没有大幅提升,看到了这里你估计也能猜到原因了。 假设你的游戏帧率运行在100 fps, 那么每帧只要在10ms内处理完毕即可,假设没开启该插件的话,cpu每帧只用了3ms即处理完毕,其余7ms处于空载(idle)等待GPU输出,开启了该插件后,cpu每帧开销翻了3倍,到达了9ms,从结果看,这个插件的开启带来了大量的cpu开销,但结果是它依旧没有超过100fps的门限阈值,即每10ms生成一帧,所以这时即使开启这个插件,造成了大量cpu占用,但帧数依旧没有变化。
因而我们优化的重点是,那些在某段时间内占用并不多,但在他工作的那一小会使cpu压力激增,进而造成了大量的帧生成时间压力,这种插件,是我们卡顿感的主要来源。而一些长时间持续对cpu保持稳定占用的插件,虽然同样会带来不小的开销,也可能把我们的帧数从130帧拉低到了100帧,但他们并不会造成我们卡顿的感受,因为他们拉低后的100帧,帧与帧生成间隔依旧稳定平滑。
所以现在,我们来总结何为 理性看待cpu占用 ,那就是,cpu和内存一样,买来就是用的,就是要用它来开插件,开wa,开这开那的。所以我们优化的目的是,找出并优化/删除那些 造成 偶发帧生成压力激增 的插件/WA,以及删除占用严重不合理的插件/WA(该类插件/WA通常 不规范的使用魔兽的 OnUpdate 对象事件,造成过度的性能开销)。 而对于正常使用,对帧数影响不大,但在测试结果里cpu开销不小的插件不要有心里压力和精神洁癖,大胆的开就是了
四、题外话,适当提升你的CPU
至此,已经阐明了什么是卡顿,插件是怎样引起卡顿,以及如何自我排查解决卡顿。但我还想在最后补充一点,那就是适当提升你的CPU。切记,魔兽世界是一个重单核性能的CPU游戏,尤其在多人游戏场景中(团本),显卡不够特效开低点就是,但在今天的插件生态加持下,cpu变得越来越力不从心,所以不要低估魔兽对CPU的性能需求。这一点在我的9600k / 12490f / 12700k 三台机器上体验尤其明显。曾经在买9600k ,乃至更早的7700k时,在当时都是还不错的cpu,但放到今天,把9600k超到冒烟,无论是游戏里的low帧表现还是游戏外的跑分数据,连i3 12100的背影都摸不到。
写这段是想说,如果你怎么优化都不行。一个插件都开不动,开个Detail帧数直接掉一截的话。考虑换个CPU,哪怕是换入门级的 i3 12100F, 都要比花时间折腾优化插件来的更实在 (intel看到请把广告费补上), 这是不同型号cpu的单/多核性能排行 。
五、总结
1. 通常说的游戏卡顿 99% 是由插件造成的
2. 插件造成的卡顿 与 插件占用的内存 没有直接关系
3. 插件造成的卡顿 主要体现在插件对CPU资源的 “不合理” 占用
4. 插件造成的卡顿 本质是,在某一帧对CPU造成过高的处理请求,导致该帧的生成时间过长
5. 对CPU持续占用率高的插件,未必会引起卡顿,要理性看待
6. WA,EXRT, Detail,姓名板(Plater等),光环类(EAM, BigDebuff等)等密集数据处理型插件通常是CPU开销大户,但要结合上面的 4,5 理性看待
7. WA 是个好插件, 但分享给你WA字符串的人未必
8. 魔兽是一个CPU游戏,当CPU过低时,首要考虑的应该是提升CPU