rimworld吧 关注:277,415贴子:5,131,733

聊聊GC、WorldPawn和卡顿

只看楼主收藏回复



IP属地:广东1楼2023-04-08 08:17回复
    大概有这么些内容
    1. World pawn的隐形负荷
    2. 原版的GC机制
    3. hediff与“樟脑丸”问题
    4. RuntimeGC:得与失


    IP属地:广东2楼2023-04-08 09:05
    回复
      2026-01-18 04:33:07
      广告
      不感兴趣
      开通SVIP免广告
      俩小时了


      IP属地:河南通过百度相册上传3楼2023-04-08 11:26
      回复


        IP属地:日本来自Android客户端4楼2023-04-08 11:35
        回复
          下面呢
          快快快,生产队的驴都不敢这么歇


          IP属地:广东来自Android客户端5楼2023-04-08 11:43
          回复
            后面呢


            IP属地:浙江来自Android客户端6楼2023-04-08 12:37
            回复
              1. WorldPawn
              RW不像3A大作,它是模拟游戏,它的计算大量集中在CPU上。需要模拟的物体越多,游戏的速度自然变慢。
              一个常见的建议是,你卡了就少养小人和动物,减少模拟物体的数量,非常正确。
              但熟悉RuntimeGC的玩家可能会知道,游戏里还有另外一些隐形的、不在当前地图上的生物,它们也存在性能开销,使用它的清理功能可以大幅提高游戏速度。
              这些不在地图上的生物,游戏里叫WorldPawn,翻译过来叫世界地图上的生物,它们可能是:
              你自己的远行队里的成员
              袭击逃离的敌人
              撤离的友军
              派系据点的成员
              mod添加的其他成员
              之前在吧里讨论的时候,有人问,原版为什么不清除这些临时的成员,减少运算呢?


              IP属地:广东7楼2023-04-08 12:50
              回复
                来了。插眼


                IP属地:黑龙江8楼2023-04-08 12:51
                回复
                  2026-01-18 04:27:07
                  广告
                  不感兴趣
                  开通SVIP免广告
                  赶上直播,插个眼


                  IP属地:江苏来自Android客户端9楼2023-04-08 12:54
                  回复
                    好帖插眼收藏了


                    IP属地:湖南来自Android客户端10楼2023-04-08 12:59
                    回复
                      新版gc是不是不能清理worldpwan了


                      IP属地:安徽来自iPhone客户端11楼2023-04-08 13:02
                      回复
                        2. 原版的WorldPawn:Tick和GC机制
                        其实上面的问题可以拓展成三个小问题。
                        先来说说第一个,这些临时的成员是否增加了运算?如果是,增加了多少?
                        原版把WorldPawn分成了三类,Live(活着的)、Mothballed(封存的)、Dead(死亡的)。
                        活着的WorldPawn的开销与地图上的基本一样,每一tick都会计算。
                        封存时,每15000tick进行一次计算,换言之,一天4次计算。计算的项目很少,只有年龄和记录。(封存的成员可能在后续的游戏中被使用;不直接删除它们的一部分原因是故事性,一部分原因是不用一直重复生成)
                        死亡的WorldPawn不会进行tick。
                        不难看出,活着的WorldPawn对游戏整体的性能影响最大且持续。当你有30个这样的成员,就相当于当前地图多养了30个人。
                        15000个封存的成员才相当于地图上1个人,所以这部分的影响并不大。
                        死亡的成员是不会tick的,所以它们没有持续的性能开销,清理不清理没太大影响。
                        死亡与存活很好理解,举个例子,一波袭击被打退后,逃跑的敌人进入存活WorldPawn列表,阵亡的敌人进入死亡列表。游戏中每过1/4天,会尝试将所有存活的WorldPawn封存(除非他们在远行队或者有健康状况禁止封存,后面细说)。
                        第二个问题,原版游戏会定时清理这些成员吗?
                        从上面的讨论,可以看到,如果一切正常,存活的WorldPawn都会在1/4天后被封存,而封存的成员性能影响并不大,看起来非常完美。
                        阵亡的成员虽然不参与tick,但因为其他原因,比如释放内存、减少存档容量等等,原版游戏也会每1/4天尝试清除它们。清除的逻辑和RuntimeGC是非常类似的,不过没那么激进,这部分可以不细说,毕竟——阵亡的成员并不影响我们游戏的速度。
                        第三个问题,如果游戏清除了这些成员,为什么我没有感觉到?
                        如果我们相信原版的GC机制正常运转,为什么使用RuntimeGC还能感受到大幅度的tps提升呢?
                        敏锐的人可能发现了,原版存活的成员要tick1/4天后才被封存,在这1/4天里,它们还是和地图上的人一样要正常的tick,而RuntimeGC可以提前清理掉这部分,我相信一部分性能提升确实来源于此。
                        但更重要的,是我们前面讨论到的封存问题,有些情况发生,使得存活的成员无法正确的被原版机制封存。
                        如果你有300个理应被封存的、但无法被封存的成员,就相当于你的地图上多养了300个人,boom。
                        RuntimeGC暴力地,将大部分这些封存的成员删了。


                        IP属地:广东12楼2023-04-08 13:03
                        回复
                          就喜欢这种贴,给我狠狠的更


                          IP属地:贵州来自Android客户端13楼2023-04-08 13:14
                          回复
                            gkd


                            IP属地:北京来自手机贴吧14楼2023-04-08 13:14
                            回复
                              2026-01-18 04:21:07
                              广告
                              不感兴趣
                              开通SVIP免广告
                              催更


                              IP属地:四川来自Android客户端15楼2023-04-08 13:23
                              回复