|
本帖最后由 wuyi 于 2024-2-27 11:49 编辑
大家好!
自从在 https://www.fossic.org/forum.php?mod=viewthread&tid=9168 里尝试ShenandoahGC但失败后,最近又看到一个帖子 https://www.fossic.org/forum.php?mod=viewthread&tid=10627,说是可以用java21或者23来跑远行星号,不禁又动了研究的心思。折腾一番后,就有了下面这串可以跑ShenandoahGC的vmparams,需要redhat的java8:
- java.exe -XX:CompilerThreadPriority=1 -XX:+CompilerThreadHintNoPreempt -Xverify:none -XX:+AggressiveOpts -Djava.library.path=native\\windows -XX:+UseShenandoahGC -XX:+DisableExplicitGC -XX:CompileCommand=exclude,com.fs.starfarer.combat.ai.O0OO::Ò00000 -XX:CompileCommand=exclude,com.fs.starfarer.api.impl.campaign.terrain.AuroraRenderer::render -XX:CompileCommand=exclude,com.fs.starfarer.combat.ai.movement.maneuvers.StrafeTargetManeuverV2::o00000 -XX:+PrintGCDateStamps -Xloggc:jvm.log -Xms8g -Xmx8g -Xss2048k -classpath janino.jar;commons-compiler.jar;commons-compiler-jdk.jar;starfarer.api.jar;starfarer_obf.jar;jogg-0.0.7.jar;jorbis-0.0.15.jar;json.jar;lwjgl.jar;jinput.jar;log4j-1.2.9.jar;lwjgl_util.jar;fs.sound_obf.jar;fs.common_obf.jar;xstream-1.4.10.jar -Dcom.fs.starfarer.settings.paths.saves=..\\saves -Dcom.fs.starfarer.settings.paths.screenshots=..\\screenshots -Dcom.fs.starfarer.settings.paths.mods=..\\mods -Dcom.fs.starfarer.settings.paths.logs=. com.fs.starfarer.StarfarerLauncher
复制代码
已经测试,上面的vmparams可以在版本091/0951/096/097里使用
以下是自问自答环节,内容偏技术,仅供参考。
1. 为什么不继续使用CMS?
答:CMS太老了,其中的新生代(-Xmn)一旦超过2g,整个新生代的暂停时间(Stop the World,STW,咋瓦鲁多)就很容易超过100ms。但新生代又代表了活跃变量的容量大小,开的小了就无法充分利用你新机器的大内存了。这也是我在之前的帖子里反复说明整个堆内存不用开很大的原因,老年代开大了不代表活跃变量(新生代)的容量大,新生代开大了STW受不了。
2. 那为啥不用G1?
答:G1里也是有新生代的,不过是由jvm自己动态控制大小,默认的控制目标是:STW<200ms !也就是说,如果你的机器有点老的话(比如我之前用的2015年笔记本),G1的卡顿会比CMS还要严重。当然在2020年后的机器上这个问题就没那么严重了,我设堆大小8g的话STW可以保证在100ms以下,大多在40ms左右。
3. ShenandoahGC有什么好?为什么现在才用?
答:ShenandoahGC和ZGC都是最新一代的内存回收技术,STW可以达到个位数!比如某一次回收过程里的4次STW,分别是[Pause Init Mark, 0.573 ms] [Pause Final Mark, 1.636 ms] [Pause Init Update Refs, 0.044 ms] [Pause Final Update Refs, 0.333 ms],其他的回收步骤都是可以Concurrent也就是和游戏并行的,这可是开了8g的堆。我甚至设置过16g的堆,STW也没有超过5ms。这个是CMS和G1无法做到的。但ShenandoahGC是在java11之后才正式发布的,目前java8里提供ShenandoahGC的只有redhat红帽子一家。
之前在使用redhat的java8时,出现了致命的C2编译错误,让我不得不放弃。但最近偶尔看到一些资料,可以通过-XX:CompileCommand=exclude的方式跳过C2编译会出错的方法,马上利用起来,嗯,真香。
4. 为什么不使用java21或java23来跑?据说性能可以很大提高。
答: 21和23我都用过了,提高是有,很大说不上,但我觉得弊端不少。首先,这两个方式都替换了一些外部工具类,23甚至改写了游戏的核心类。这就会造成一些问题,已知问题就有,和老存档不兼容不能读老档,有些MOD不兼容会闪退,096本来就不多的汉化会继续丢汉化。23改写了游戏核心类后,像这次游戏升级到rc11,就要等作者更新。21是使用代理的方法更改了一些方法,但是否能兼容升级也有疑问。性能提升是:实时fps的上限可以高5帧,但画面该卡的时候(小飞机和导弹多)还是会卡。我个人认为是不值得,不值得这么折腾。
5. 为啥这个方法能兼容到100?
答:因为我只是替换了java runtime,未对游戏做任何修改。只要游戏作者没有更新外部工具类(我觉得是不会更新了,要知道游戏默认用的是java7),也不动游戏底层框架(Starsector2肯定是不能用我这个vmparams了),那这个vmparams就可以用到098/099/100/...,兼容性绝佳。就算再次出现C2编译错误,也可以继续通过-XX:CompileCommand跳过。
6. 有没有其他MOD可以推荐增加性能?
答: 强烈推荐 https://www.fossic.org/forum.php?mod=viewthread&tid=10302 里的MOD,直接改善战斗画面。096/097可直接用,0951不能用。无副作用。注意java21和java23不可用。
分享下redhat的jre8,方便大家下载:
链接:https://pan.baidu.com/s/1IEEapkOf4vBpjuBEnLE7Ng?pwd=svro
提取码:svro
|
评分
-
查看全部评分
|