rimworld吧 关注:277,419贴子:5,131,849

回复:聊聊GC、WorldPawn和卡顿

只看楼主收藏回复

3. hediff与“樟脑丸”问题
什么导致了本应该封存的成员不能被正常封存?
前面说了,游戏中每过1/4天,会尝试将所有存活的WorldPawn封存(除非他们在远行队或者有健康状况禁止封存)。远行队可以理解,我们自己的成员,正常tick就行了。那么主角就是:游戏里的健康状况,标题里的hediff。
聊原因之前我们先证明一下这种情况确实存在,而且会对性能造成影响:

开发者选项的第五个,Debug Logging菜单中有一些可以用来调试WorldPawn的功能,我们主要用到这两个
World Pawn List 可以打印当前所有WorldPawn的列表
World Pawn Mothball info可以打印当前什么hediff限制了封存
(当然最下面两个Run的命令可以直接进行GC和封存,不用等待1/4天,你可以自己试试)


IP属地:广东16楼2023-04-08 13:36
回复
    速度


    IP属地:上海来自Android客户端17楼2023-04-08 13:37
    回复
      2026-01-18 07:30:53
      广告
      不感兴趣
      开通SVIP免广告
      新开一个快速测试的存档,在Dubs Performance Analyser的World栏目中,

      可以看到全部WorldPawn的Tick开销为平均0.14ms,非常小
      打印一下WorldPawn的列表,

      存活的有17个人,大部分是派系首领。
      1/4天后,它们被封存,开销变为0.02ms


      目前为止很完美。我们打退两次moyo族的袭击,再看一下WorldPawn列表

      毫不奇怪,列表成员从17涨到了130个
      只要它们能被封存——嗯?

      Mothball info告诉我们,有85个成员,因为他们身上有MoyoBaseHediff这个健康状况,无法被封存。

      结果是WorldPawn每一个tick的耗时从0.02ms上涨到了0.621ms
      回顾一下,无法被封存的成员与地图上的成员有相同的开销,这就意味着——
      存活离开地图的moyo族其实并没有离开,它们的数量每增加一个,你的后台就多跑一个人的tick。
      想象一下,你的地图上有300个人,游戏速度会怎么样?


      IP属地:广东18楼2023-04-08 13:40
      回复
        来学习


        IP属地:内蒙古来自Android客户端19楼2023-04-08 13:48
        回复
          gkdgkd


          IP属地:陕西来自Android客户端20楼2023-04-08 13:51
          回复


            IP属地:吉林来自Android客户端21楼2023-04-08 14:05
            回复
              3. “樟脑丸”
              什么?我要把moyo下了!
              你先别急。
              如果我和你说,Mincho,Miho,VE,甚至其他添加hediff的mod都可能有这个问题呢?
              如果mod里的hediff有comp,或者有复杂的stage,那么原版认为它们是需要实时计算的,
              因此哪怕拥有着这些健康状况的成员,哪怕成为WorldPawn也不能封存进“樟脑丸”里。除非在xml中写明alwaysAllowMothball和alwaysAllowMothballCached都是true。
              这是火箭人的策略,你可以在它1.4/Patches文件夹下找到MothballFix.xml,它尝试给一些hediff加上
              这两个属性。还有一些modder根据自己遇到的情况写了类似的修复, 比如https://github.com/Thekiborg/MothballFix
              但很遗憾,这是很难穷举完的。
              如果你怀疑遇到了这样的问题,可以用我们前面讲过的开发者命令,看一下是不是有大量的存活的WorldPawn,
              如果是,进一步看看是什么hediff阻止了他们被封存,然后——
              你可以给mod开发者留言,让他们加上这两个属性
              或者你把对应的hediff名字加到类似火箭人修复的xml里


              IP属地:广东22楼2023-04-08 14:08
              收起回复
                好,等更新


                IP属地:浙江23楼2023-04-08 14:10
                回复
                  2026-01-18 07:24:53
                  广告
                  不感兴趣
                  开通SVIP免广告
                  4. RuntimeGC:得与失
                  毫无疑问,RuntimeGC在它诞生的年代是一个伟大的mod,哪时候甚至还没有harmony,作者要用指针来detour。
                  很多年过去了,维护者还是用指针来detour。
                  如前所述,原版GC正常工作的时候是不需要RuntimeGC的,用它激进地删除反而可能带来其他的问题,毕竟已经
                  没什么人维护了。但从另外一个角度上讲,如果你遇到了上面的问题而且暂时解决不了,也可以激进一点全清了。
                  另外,如果你要使用里面的其他功能,不清理WorldPawn,记得在mod设置中关闭这个选项,不然原版的
                  GC会被完全禁用。

                  (完)


                  IP属地:广东24楼2023-04-08 14:25
                  收起回复
                    既然因为一些hediff原因导致不能自动封存的话,我们手动清理也能进行优化吧


                    25楼2023-04-08 14:29
                    回复
                      RuntimeGC 说实际点除非版本替换 不然删除WorldPawn也是必须,至于老强调删除导致任务或者其他什么BUG,只要知道在有产生零时人员期间不用这功能就行了,这次一下闹这么凶无非就是召唤机械袭击会导致没有出现敌人的情况,虽然还是和有些MOD冲突,这完全可以自己选择,一棒子打死这MOD不可取,目前又没出现更好分类删除的MOD


                      IP属地:贵州26楼2023-04-08 14:37
                      收起回复
                        原来我长期档每天卡四次就是因为封存判断啊……用了GC告诉我有1123个小人信息被清理。话说这人都走了快10年(游戏)了吧。


                        IP属地:北京27楼2023-04-08 15:49
                        回复
                          我这算多了还是少了,我这个档卡顿有点严重


                          IP属地:河南来自Android客户端28楼2023-04-08 16:00
                          收起回复
                            Cy


                            IP属地:上海来自Android客户端29楼2023-04-08 21:47
                            回复
                              2026-01-18 07:18:53
                              广告
                              不感兴趣
                              开通SVIP免广告
                              debug action好像有个指令kill world pawn,能不能用来缓解问题?


                              IP属地:江西来自Android客户端30楼2023-04-08 22:49
                              回复