wuyi 发表于 2024-2-26 15:04:30

[2024版]修改vmparams,解决存档卡顿,适用版本091/0951/096/097(/098/099/100/...)

本帖最后由 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,分别是 ,其他的回收步骤都是可以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

AnyIDElse 发表于 2024-2-26 15:12:00


wocmnzz1011 发表于 2024-2-26 15:20:03

好好好回去试试

wuyi 发表于 2024-2-26 15:46:02

AnyIDElse 发表于 2024-2-26 15:12


这里应该是冒号冒号小写o   :;P

Octavus 发表于 2024-2-26 15:53:50

::o

cjy4312 发表于 2024-2-26 16:31:36

这些oO0啥啥的类名,alex每次更新RC版本的时候是有可能发生变化的
真的能通用吗?

Mycophobia 发表于 2024-2-26 17:12:31

Java 23我用的是作者正式登出来前的版本之后比较懒没更新,到目前一直用都没有遇到问题,没遇到和mod适配的问题,不过确实要随着版本更新。是否有提高这个确实要看系统,discord那边虽然主要反应不错,没有提高的也确实有一些,我个人这边相比之前的Shenandoah 提高很明显,没有再出现后期卡顿的情况。 (当然我mod也不是装的太多,大概30-40个左右,mod的多了肯定还是会慢的)

具体的和个别mod冲突的情况有,但是作者也修复了几个,如果有具体问题可以说下我可以试着跟miko 反映下。(但我也只是个翻译的23333,代码什么的是外行,如果能英文解释更好。)汉化兼容问题miko已经知道了。

極光 发表于 2024-2-26 18:46:43

先收藏,等闲下来我再试试951能不能用!!{:tieba_50:}{:tieba_50:}

文仔 发表于 2024-2-26 18:46:57

这个是别人优化的,和你的有啥区别?????

java.exe -XX:CompilerThreadPriority=1 -XX:+CompilerThreadHintNoPreempt -Djava.library.path=native\\windows -Xverify:none -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:MaxTenuringThreshold=15 -Xmn2g -Xms8192m -Xmx8192m -Xss2m -XX:+PrintGCDetails -XX:+PrintGCDateStamps-Xloggc:jvm.log -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

文仔 发表于 2024-2-26 18:53:00

文仔 发表于 2024-2-26 18:46
这个是别人优化的,和你的有啥区别?????

java.exe -XX:CompilerThreadPriority=1 -XX:+CompilerThrea ...

晕菜,直接启动不了。用的是J8最新版

zender 发表于 2024-2-26 19:13:33

PEI修复了一下,之前其实没有作用的说(在PEI+Java11中的PEI是修复过的)

wuyi 发表于 2024-2-27 12:02:25

zender 发表于 2024-2-26 19:13
PEI修复了一下,之前其实没有作用的说(在PEI+Java11中的PEI是修复过的)

活捉大佬一只

ParticleEngineInject 太棒了,我今天(2/27)更新后,帧数直接爆炸,已经不再纠结gc方式了。就是不兼容0951,能麻烦大佬兼容一下吗?

错误是:
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: javassist.NotFoundException: addNebulaSmoothParticle(..) is not found in com.fs.starfarer.combat.CombatEngine
      at zender.patch.ParticleEngineInject_PreMain.premain(ParticleEngineInject_PreMain.java:44)

好像是有个方法在0951里没有

JQm 发表于 2024-2-27 12:08:52

每次启动游戏的存档没办法直接保存,只能save copy,而且游戏根目录存档文件会比实际存档多出来好几个

zender 发表于 2024-2-27 12:40:23

wuyi 发表于 2024-2-27 12:02
活捉大佬一只

ParticleEngineInject 太棒了,我今天(2/27)更新后,帧数直接爆炸,已经不再纠结gc方式了 ...

更了一下,有时间帮忙测测

wuyi 发表于 2024-2-27 13:19:23

java 8 报错了:
Exception in thread "main" java.lang.UnsupportedClassVersionError: zender/patch/ParticleEngineInject_PreMain has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

编译版本太高了

zender 发表于 2024-2-27 13:32:45

wuyi 发表于 2024-2-27 13:19
java 8 报错了:
Exception in thread "main" java.lang.UnsupportedClassVersionError: zender/patch/Part ...

改回java8编译了

啸天行 发表于 2024-3-16 20:40:18

不行啊大佬,23版的能用很久,但是24版的我甚至连游戏启动界面都打不开,点图标没反应,大佬麻烦把修改过的发过来好不好呀

啸天行 发表于 2024-3-16 20:40:35

啸天行 发表于 2024-3-16 20:40
不行啊大佬,23版的能用很久,但是24版的我甚至连游戏启动界面都打不开,点图标没反应,大佬麻烦把修改过的发过 ...

我是0951版本的

圣剑圣剑 发表于 7 天前

本帖最后由 圣剑圣剑 于 2024-4-22 23:15 编辑

macOS 没 vmparams 文件 {:tieba_30:}
在游戏路径下终端执行 grep -rli "Xms1536m" 找到一个 /Starsector.app/Contents/MacOS/starsector_mac.sh

更改里面的 JVM 启动参数
启动游戏后可以用 jps + jcmd <pid> VM.flags 获取当前 JVM 运行参数验证有效


页: [1]
查看完整版本: [2024版]修改vmparams,解决存档卡顿,适用版本091/0951/096/097(/098/099/100/...)