rimworld吧 关注:242,916贴子:4,341,025

【硬核科普】RimWorld 为什么是祖传单核?能不能优化?

只看楼主收藏回复

前排干货警告!


IP属地:四川1楼2020-01-31 05:04回复
    还有玩家会疑惑,这么多tick就不能拆分成多个线程或多个进程分别运算吗?
    这又要深入到编程开发上的概念了。
    首先线程各自进行运算的时候,最大的难度在于要保证内存安全性。
    什么是内存安全性?实际上就是内存中变量数值的修改冲突问题。
    第一种情形:冲突。
    拿上面工作的例子打个比方。
    加入有两个建造任务都需要用到原木,分别让小人A和B各自完成,恰好他们要拿的是同一个原木,该给谁?
    单线程:简单,要么A拿要么B拿,另一个人再分配其他的原木。
    多线程:A和B拿同一个原木怎么处理?
    如果不做处理,那么其中一个人拿了,实际没拿到,程序报错。
    如果做处理,把这个原木标记给A,B再换另一个原木。
    这再多线程编程中叫做“锁”,这时候多线程并没有提升运行效率,反而因为多个线程间的锁导致额外的开销降低了效率。反映到CPU就是,连个CPU轮流吃满,但不能同时吃满。
    反而还不如单线程。
    同理,假如一个人要收获一颗作物,这颗作物同时还要计算成熟度,也会造成数值修改上的冲突。
    第二种情形:不冲突。
    如果两个事物的变化如果完全没关系呢?
    似乎可以,但怎么判断两个食物可以各自独立运行?程序员表示头秃。
    第三种情形:避开冲突。
    既然这涉及到冲突,拿我把内存里的所有变量都给各个线程复制一份各自运算,算完了再合并回来处理行不行?
    似乎也可以。但首先要明白两点,内存是的,通常情况变量的复制比变量的修改要更加耗时。
    程序的内存占用中,绝大部分是变量的占用。
    内存里巨量的变量复制后使用、使用后丢弃对应的是内存的申请使用和释放。
    系统剩余的内存还够不够用?不够用还进行复制、申请使用,轻则程序崩溃,重则系统蓝屏。
    变量丢弃和内存的回收也需要耗时,同时程序是人写的,人就会犯错,忘了回收,内存申请了不释放,而未释放的内存是不能再利用的,造成的后果一样。
    这就是内存泄漏,内存占用无限增长——BOOM。


    IP属地:四川3楼2020-01-31 05:05
    收起回复
      说了上面这些,大家应该了解了,那些所谓能让单线程强制多线程,单核运行强制多核运行,从原理上并不存在,因为外部程序无法接入到游戏内部程序的运行逻辑。(黑客手段是另一个范畴,也做不到将单线程游戏改成多线程优化,这里不讲)。
      那些优化小工具有两个功能:
      是指定游戏程序的优先级,告诉系统,不要让后台程序和游戏抢CPU。
      指定运行在CPU的哪个核心上,因为CPU在自动睿频的情况下,不同核心实际频率和性能是不同的,你要知道哪个核心的频率最高这么做才有用。
      而这两个功能这是系统任务管理器自带的功能,小工具纯粹就是套个界面调用系统功能。看图:




      IP属地:四川4楼2020-01-31 05:10
      回复
        总结:RimWorld祖传单核。多线程优化?
        别想了。除非改成回合制、非即时游戏,类似文明那样。但那已经是另一款游戏了。


        IP属地:四川5楼2020-01-31 05:11
        收起回复
          是否可以理解为:
          在任务管理器里,找到rimworld的进程,然后右键设置优先级为“实时”,
          可以一定程度上提高游戏运行速度?


          IP属地:重庆6楼2020-01-31 05:31
          收起回复
            (小脑袋烧焦的味道)


            IP属地:中国台湾来自Android客户端7楼2020-01-31 07:02
            回复
              不明觉厉


              IP属地:湖南来自Android客户端8楼2020-01-31 07:13
              回复
                理论上:自旋锁弄一个好了啦
                现实中:呦西!tread.sleep(1000),以后的饭也有的吃了


                IP属地:上海来自Android客户端9楼2020-01-31 07:45
                收起回复
                  其实除了提升频率之外,内存频率(amd需要额外考虑fclk)对于单核性能的提升是有目共睹的。对于非mesh的outel cpu来说,内存超到3600能对单核性能有不少的提升(时序放一点也无所谓)(hedt就别想了)
                  对于amd来说,zen1和zen+的if总线和内存频率直接挂钩,能超多高吵多高,放时序随便放,zen2的话imc平均体质在1866,用力点能上1900,除非你捡到大雷,一般3800 c19(c9bjz和cjr)就能很舒服了


                  IP属地:上海来自Android客户端10楼2020-01-31 07:49
                  收起回复
                    过于专业


                    IP属地:北京来自Android客户端11楼2020-01-31 07:56
                    回复
                      实用操作系统教程第二章


                      IP属地:河北来自Android客户端12楼2020-01-31 09:26
                      收起回复
                        也就是说,相互影响比较小的两部分可以多线程运行?比如远征队,分基地等等,这些东西对于主基地的影响并不大,而死人等等心情buff对主基地也没有特别大的干扰,不过和某些mod不兼容?


                        来自Android客户端13楼2020-01-31 10:06
                        回复
                          感觉如果不自动生成亲戚 就是最好的优化


                          IP属地:广东14楼2020-01-31 10:08
                          收起回复
                            我只希望能有个优化让我烂电脑也能打大后期


                            IP属地:安徽来自Android客户端15楼2020-01-31 10:42
                            回复
                              吧主,直接说,我们要上什么样的配置,可好?那个理论看着,萌新的我就看不懂啦。


                              IP属地:广东来自Android客户端16楼2020-01-31 11:04
                              收起回复