= 创作分享 =
技术讨论
我的Mod游玩心得 篇二:性能调优
craftkuro

我的Mod游玩心得 篇二:性能调优

craftkuro 于 2019-11-17 22:54 ( 4年前 ) [教程] [复制链接] [显示全部楼层] [打印]
本帖最后由 craftkuro 于 2020-12-10 01:56 编辑

上一篇:能源系统设计



- 和上一篇文章一样,本文的大部分内容为原创。但由于掺杂的内容过多,我也不太清楚这些内容究竟是原创,借鉴,还是引用。我会尽量做好标注。
- 同样,使用CC BY-NC-SA许可证。欢迎转载,但请遵守许可证。若您受本文启发而有了新的划时代设计,也不妨将本文加入参考文献中。
- 致在遥远的未来阅读本帖的你:请注意本帖最初作于2019年9-11月,其中包含的内容可能在某个时候发生改变。在套用经验前请先验证概念。
- 本文的所有内容均关于1.12.2。对于其他版本,有的可套用,有的不可套用,请自行判断,并根据实际情况来决定是否采纳。
- 这篇文我鸽了好几个月了,也重写了好几遍,现在一想到就头疼。就这样了,各位将就看吧。要写好这样的主题我还要需要更多知识。MC作为一个闭源的游戏,其实在游戏本身上折腾的空间并不算充足,我们最应该做的还是改进装置设计以改善性能。

目录
    1. 在可能的情况下使用optifine,和使用它了解性能状况(客户端)
    2. 合理调整JVM参数(服务器&客户端)
    3. 选择合适的渲染距离(客户端)
    4. 缓解瞬间卡顿:减少区块加载/更新的数量和耗时(客户端)
    5. 减少视野范围内的方块实体数量(客户端)
    6. 减少世界物品交互(服务器&客户端)
    7. 使用开销更小的生产流程(服务器)
    8. 减少AI的使用(服务器)
    9. 克制装饰使用(客户端)(仅限科技玩家)
    10. 眼不见为净(客户端)


1. 在可能的情况下使用optifine,和使用它了解性能状况(客户端)

    虽然这个模组的许可证蛋疼,兼容性有点问题,但是在5帧和50帧的区别之下,这些都不是根本问题。因此,对于低配机器,强烈建议在任何可能的情况下安装。
    由于前面提到的许可证问题,国外的整合通常不包含此模组,导致第一次玩的时候基本不能操作(我一般在3-5fps)。国内的整合似乎不太关心这个,不少都自带了。

    什么? Fastcraft? Betterfps? VanillaFix?  太弱了,那些只能让fps从5变成15。

    如果你想玩的服务器有反作弊,我不清楚安装额外的模组是否会影响游戏。

- 我安装了optifine,如果遇到问题怎么办?
    若出现白屏黑屏等现象,那么需要检查你是否安装了其他大量使用不那么常规的渲染方式的模组(特别点名the betweenlands),然后看相关说明来禁用相关配置或者optifine
    若崩溃,emmmmmm,这就麻烦大了,调查兼容性问题,砍模组,改配置,或者放弃optifine——大多数情况下意味着这个整合包在你换电脑之前没法玩了。

- 我安装了optifine,但是帧数为什么没怎么明显提升?
    默认情况下optifine和原版区别不大,但它提供了很多有意思的选项。本文主旨是尽可能提高帧数,那么画质什么的都得先缓缓了。

    以下是用鼠标点点就能完成的极限帧数配置(以1.12.2_HD_U_E3为例):



关于快速调试信息的图(lagometer)怎么读:
    首先打开方式是alt+F3(同时适用于高版本原版和optifine),如果你在optifine的选项里设置了此项开启,则只需按F3。
    打开之后调试界面左下角会有个区域不断出现彩色的竖直条条,和一些横线。每一个条条在大多数情况下都代表一帧,其高度表示在此帧(或gc)上花费的时间(就是所谓的帧生成时间)。两个横线自然就是表示60帧的16.7 ms,和30帧的33.3ms了。
    用这个工具我们可以很方便地了解帧生成时间状况,并以此辅助性能调试。

    原版的条条里的颜色只与该帧耗时有关,低于30fps的是红色。
    Optifine里的条条每一个都可能由多种颜色组成。具体颜色的含义,在选项里的相关位置的注释里有,除了白色。从个人经验来看,白色包含渲染实体(含方块实体)和等待垂直同步或帧率限制(如果开了)的时间,以及我不知道的部分内容。

下图:某模组较少的测试包,但忘记装optifine
2019-08-30_17.52.37.png

下图:我的某自组包,单人全新世界,动画全开(条条突破屏幕范围了!)和全关的帧数差距。
2019-09-02_16.49.50.jpg

2. 合理调整JVM参数(服务器&客户端)

    我也是一知半解……所以,就不解释为什么了,直接给我正在使用的一行效果聊胜于无的参数:
    仅在java 8 (hotspot) 上的forge server测试,并通过。
  1. java -server -Xms4G -Xmx4G -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=100 -XX:+DisableExplicitGC -XX:TargetSurvivorRatio=90 -XX:G1NewSizePercent=50 -XX:G1MaxNewSizePercent=80 -XX:G1MixedGCLiveThresholdPercent=35 -XX:+AlwaysPreTouch -XX:+ParallelRefProcEnabled -jar forge-xxxxxxxxxxxxxxxxxxxx.jar nogui
复制代码

    注意这一行千万别傻乎乎地往启动器里填(不用于客户端),看不懂的就当我没写。其实我也不完全明白这些参数的全部含义。
    使用这些参数启动,jvm会吃掉你给的所有内存,因此请按照硬件允许的情况进行分配。
    在windows机器上,一定要加nogui。没加的话,因为原版mc服务器gui窗口的存在,性能会出现非常严重的问题。我也不知道为什么。
    参考资料:https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/

    对于客户端,HMCL加的默认参数用着还行,我也没什么好的方法来解决gc卡顿的问题——只能换个更好的处理器了。Journeymap在相当程度上会引起此类卡顿,但这个模组暂时没有较好的替代品。

    玩的过程中发现的一个规律是,游戏内动态的内容越多,GC发生得越频繁。因此,减少动画、粒子、光照变化、区块更新,均可在一定程度上改善此方面性能。
减少区块更新的部分做法,将在下文提及。

    除此之外,我们还可以换其他的jvm。建议尝试一下openj9,但它和部分模组存在一定程度的兼容性问题,故仅推荐用于2019年及以后出的forge和模组的1.12.2+版本。Openj9默认似乎不带openjfx,故你可能还要装一个平时用的来自oracle的jre来开hmcl,或者换个不需要javafx的启动器。
    目前来看openj9 8u212版本对于玩mc来说比较稳定。(注意文章发布日期!)
    虽然openj9的内存占用显著低于hotspot,但帧数方面我没有感受到明显差距。也许是我的机器上u或者卡太弱了。


3. 选择合适的渲染距离(客户端)

    前文在optifine的设置中提到了尽可能提升fps的视频设置,但它们仅是我的建议,不一定适用于所有机器和游戏状况。
    特别需要注意的是渲染距离。较远的距离下,视野里渲染的区块数量会快速增加,从而降低fps(受GPU性能限制为主);但是,若设置过小的距离(比如2-3),对于较大的,面积可达7x7或更多区块的基地来说,移动过程中客户端会不断进行区块加载/卸载的操作,而基地中安装有大量机器和装置的区块,加载起来耗时可达外围自然生成区块的数十倍,这段时间里,cpu会耗费大量时间在这些操作上(嗯,100%)并且频繁出现GC卡顿从而使帧数从60+降到5-10。
    具体选择多大的渲染距离,需要根据自己的基地尺寸,CPU/GPU哪个性能较强等因素不断尝试,以找到能够获得最佳体验的数值。

    其他的视频设置项目,通常不需要考虑如此多的内容,简单尝试提供的选项即可。


4. 缓解瞬间卡顿:减少区块加载/更新的数量和耗时(客户端)

    在optifine的快速调试信息(lagometer)中,与区块加载/更新的有至少3个条目:预定可执行(蓝),区块加载(紫),区块更新(红)。
    如图


2019-09-02_16.52.05.png

    前两个(蓝,紫)是真的没想出办法解决(除了加钱换u)。
    关于最后一个区块更新,一般是在区块里摆放/破坏方块时出现。
    当一个区块里有太多东西(导线机器等)时,摆放/破坏方块并进行区块更新的代价就会很高,在复杂的设计里可高达1/10秒以上。


2019-09-02_18.28.32.png

因此,为了缓解这个问题,我们需要:
    · 将每个区块的内容弄得更加简单——这意味着,将机器尽可能分开,而不是堆在一个区块内。基地应当水平展开,而不是在少数几个区块内垂直分层。
    · 一个区块内不要铺设太多ME/EIO线缆。这是刚才图里情景得出的结论。
    · 减少不必要的方块放置/破坏操作。
    · 将农业等运作时会产生大量区块更新的功能区放在其他的维度/远离工厂的地方。
    · 避免让机器轮询信息和改变输出的间隔太短。(比如前一篇中提到的比较器,原版的轮询间隔可低至一个红石刻,而每一次轮询都可能改变输出,因此在部分情况下会造成较多的区块更新)


5. 减少视野范围内的方块实体数量(客户端)

    方块实体的概念参考MC wiki。
    如何看视野中有多少方块实体呢?最简单的方法(如果装有optifine)就是打开视频设置>其他>显示FPS,在左上角会有个E:X+Y 的数值,第一个数字(X)是实体数量,第二个数字(Y)是方块实体数量。
    如果没装optifine的话……我就不知道怎么看了。


2019-11-17_15.44.08_edited.jpg


    然而事情并没有那么简单。
    按照方块实体的定义,为什么我的各个模组机器明明就是方块实体,也就在眼前,但为什么数字是0呢?
    由于optifine并没有文档,也不开源,我只能用假说来解释这种状况:
(警告!未经证实的假说)
    方块实体在服务端全部参与ticking,但在客户端只有部分进行更新和渲染——于是,对于正在运行的机器的材质和亮度变化,只需简单更改数据值就可进行。当玩家打开机器的GUI时再传输与方块实体相关的数据即可。AE的线缆,大部分种类的管道,似乎也适用于这种状况。
    然而ender io的管道是个例外。每一个方块的导管束(conduit bundle)都是一个方块实体。
    于是我们将方块实体分为两类,一种是同时在客户端和服务端存在,并在客户端展示的方块实体;另一种是仅在服务端存在,而不在客户端展示的方块实体。
(假说部分结束)

同时,由于MC的某种设计,方块实体是在世界之上单独渲染的,于是数量越多,就需要额外更多的时间来绘制一帧——自然地,在低配机器上就会有明显的帧数差距。高配从300掉到150可能关系不大,但60-30可是大问题。
    如图,相对于刚才的87fps,在同一服务器中其他人没考虑这些而建造的基地前,帧数就完全不是一个水平了。(绘制调试界面的开销暂时忽略,关掉有45-50帧)


2019-11-17_15.56.33.jpg

    为了创造精彩的游戏体验,方块实体是不可或缺的。我们能做的就是尽可能选择不在客户端展示的方块实体,以及尽可能选择占用资源较少的那些。

    这里特别提出一点:原版的箱子,每一个都在客户端占用额外的client thread时间!几十个箱子可以占到6-7%的时间。这个时间拿来干啥不好,偏要渲染箱子。因此建议中后期要尽量少用原版箱子,虽然它可能是兼容性最好的存储方块了。Iron Chest模组的箱子,或其他在客户端展示的物品容器也算。

    对于快速调试信息中的tick耗时过高问题,一个解决的有效方法就是减少可见的方块实体数量。


6. 减少世界物品交互(服务器&客户端)

    不知道为什么,与这种特性有关的装置的性能都不甚理想。
    包括原版的漏斗,漏斗矿车,各种模组的仿原版漏斗, immersiveengineering的各种相关物品,ender io的虚空箱子,等等。
    这个部分没什么说的,修改生产流程,尽可能减少与世界物品的交互。
        ——顺便也减少了实体的数量。一举两得。


7. 使用开销更小的生产流程(服务器)

    部分机器由于其独特的工作原理,在闲置和工作的时候会消耗额外的计算资源,举例如下:
    Ender io的合金炉,当输入侧有物品但没有合适的配方来烧炼时,它会不停地在所有的配方中搜索,并尝试寻找合适的配方进行处理(是不是有原版工作台的既视感),这带来了闲置时不必要的计算资源消耗。
    Ender io 的sag磨粉机,由于其产物的输出有个概率,在工作时对此需要额外的处理。当用这种磨粉机组成大规模处理阵列时,cpu会花相当的时间在掷骰子上,而大幅影响tps。
(在某大佬制作的200+机器阵列上,sag磨粉机花掉了约30%的server thread时间)
    虽然它的产率很诱人……

    这种时候就应该考虑更换其他模组的类似机器。(虽然eio机器功能强大)
    相对而言,TE的红石炉和磨粉机的工作原理就简单得多。在另一个服务器上,512个机器x50%平均负载只花了约5%的server thread时间。

8. 减少AI的使用(服务器)

    用人话说就是少养动物少刷怪。

    原版的动物,不用说,每一只消耗的资源都差不多赶得上最复杂的机器。
    刷出实体的刷怪装置也类似(强力推荐woot)。
    村民所在的地方不建议长期加载,毕竟也蛮吃资源——建议将工厂等区块持续加载的地方与附近村庄保持合理距离。
    渲染这些实体也需要额外的时间,当不需要与这些动物和村民打交道的时候,还是离它们远点好。


9. 克制装饰使用(客户端)(仅限科技玩家)

    唉,其实我这整个系列都是关于硬核科技的……至于建筑和休闲玩家,看看就好,值得借鉴的经验可能有限。
    制作微雕方块的multipart模组,各种家具和台灯,装饰画,地图,常常有复杂的外形,又往往是方块实体。这类物品多了之后通常会大幅降低客户端帧数。
    是让世界变得美观,还是让世界变得流畅,见仁见智。


10. 眼不见为净(客户端)

    把所有不想看到的东西,都扔到看不到的地方,就可以了!没有了方块实体,没有了区块更新,没有了流水,没有了动物,只有天、地和你。
    终极的解决方案。
    帧数+++。

    当然,对于服务器的负载问题这只是掩耳盗铃。



    如何实践这些经验,使得我的基地在后期也和前期同样流畅?
    请看下回:兼顾性能和产能的基地设计



本系列的更多内容
    由于内容过多,鸽着是不可避免的了。写完后我会更新帖子里链接。
    篇一 能源系统设计
    篇三 基地设计
    篇四 模块仓库






评分

参与人数 2RF +10 Vis +4 收起 理由
mamaruo + 5 + 2 曝光度不够啊,去版规下申请一个优秀?
星落辰 + 5 + 2 来了

查看全部评分

发表于 2019-11-17 22:54:56 | 显示全部楼层 |阅读模式

回复 | 举报

该帖共收到 16 条回复!
星落辰
本帖最后由 星落辰 于 2019-11-17 23:25 编辑

又是你……传说中的模组毕业论文系列……

一下就想起来某人做的优化稀烂的高级AI,一条龙的AI能卡崩一组马铃薯的那种……

发表于 2019-11-17 23:19:13 | 显示全部楼层

回复 | 举报

craftkuro
星落辰 发表于 2019-11-17 23:19
又是你……传说中的模组毕业论文系列……

一下就想起来某人做的优化稀烂的高级AI,一条龙的AI能卡崩一组马 ...

明明我只发过两个主题帖 ( ;-;)

点评

但你确实是大佬,你上篇帖子就令我印象极其深刻!  发表于 2019-11-18 12:53
发表于 2019-11-18 00:17:40 | 显示全部楼层

回复 | 举报

LHLR
抛开原版的源码确实烂不说,不同模组作者之间的源码算法差距也很大,最终这些问题只能做到缓和而不是根治
Klagen Totentanz !
发表于 2019-11-18 13:42:55 | 显示全部楼层

回复 | 举报

NoName德里奇
啊?betweenlands
解决方案还是有的,OF和betweenlands的矛盾并非不可调和。
放弃一些betweenlands的视觉特效就好了。
所以你们大概可以放心地往SevTech里面加OF,
这是我们时代的和平,我建议你们睡觉去吧 ——张伯伦
更休落魄耽杯酒,亦莫猖狂爱咏诗。
        今日捉将官里去,这回断送老头皮!

发表于 2019-11-18 22:03:27 | 显示全部楼层

回复 | 举报

craftkuro
Lucky_H_ling 发表于 2019-11-18 13:42
抛开原版的源码确实烂不说,不同模组作者之间的源码算法差距也很大,最终这些问题只能做到缓和而不是根治 ...

确实,玩家能做的非常有限
发表于 2019-11-19 18:06:39 | 显示全部楼层

回复 | 举报

craftkuro
NoNamePlay 发表于 2019-11-18 22:03
啊?betweenlands
解决方案还是有的,OF和betweenlands的矛盾并非不可调和。
放弃一些betweenlands的视觉特 ...

interesting. 我也去试试:)
发表于 2019-11-19 18:36:35 | 显示全部楼层

回复 | 举报

NoName德里奇
craftkuro 发表于 2019-11-19 18:36
interesting. 我也去试试:)

这样搞:
打开Mod选项,如果你的主菜单上只有“M”按钮,那就点击这个按钮。

在左侧列表找到The BetweenLands,点config进入配置菜单。

点击Rendering 有一行Use shaders…… 将其改为false

—— https://www.mcmod.cn/post/283.html
更休落魄耽杯酒,亦莫猖狂爱咏诗。
        今日捉将官里去,这回断送老头皮!

发表于 2019-11-22 19:08:23 | 显示全部楼层

回复 | 举报

craftkuro
NoNamePlay 发表于 2019-11-22 19:08
这样搞:

—— https://www.mcmod.cn/post/283.html

对 就是这样
前两天发现官方的说明里其实有提到解决办法

点评

我就是从那里抄过来的(笑)  发表于 2019-11-23 13:06
发表于 2019-11-22 19:38:30 | 显示全部楼层

回复 | 举报

爸爸
快速运算和BetterFPS的优化算法同时开有什么后果?
发表于 2020-1-28 15:38:51 | 显示全部楼层

回复 | 举报

12下一页
百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表