找回密码
 初始化身份识别芯片
查看: 1368|回复: 18

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

[复制链接]

战列舰长

发表于 2024-2-26 15:04:30 | 显示全部楼层 |阅读模式
本帖最后由 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:


  1. 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

vmparams.zip

611 Bytes, 下载次数: 239

超级版主

STS 竞技场总主持

高级机师译码专家搬运能手战术专家通讯记者学院教员远星汉化组成员

发表于 2024-2-26 15:12:00 | 显示全部楼层
what.png

点评

这里应该是冒号冒号小写o  详情 回复 发表于 2024-2-26 15:46

战列舰长

发表于 2024-2-26 15:20:03 | 显示全部楼层
好好好回去试试

战列舰长

 楼主| 发表于 2024-2-26 15:46:02 | 显示全部楼层

这里应该是冒号冒号小写o   

战列舰长

发表于 2024-2-26 15:53:50 | 显示全部楼层

星域军阀

高级机师

发表于 2024-2-26 16:31:36 | 显示全部楼层
这些oO0啥啥的类名,alex每次更新RC版本的时候是有可能发生变化的
真的能通用吗?

战列舰长

发表于 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能不能用!!

巡洋大副

发表于 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

点评

晕菜,直接启动不了。用的是J8最新版  详情 回复 发表于 2024-2-26 18:53

巡洋大副

发表于 2024-2-26 18:53:00 | 显示全部楼层
文仔 发表于 2024-2-26 18:46
这个是别人优化的,和你的有啥区别?????

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

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

战列舰长

发表于 2024-2-26 19:13:33 | 显示全部楼层
PEI修复了一下,之前其实没有作用的说(在PEI+Java11中的PEI是修复过的)

点评

活捉大佬一只 ParticleEngineInject 太棒了,我今天(2/27)更新后,帧数直接爆炸,已经不再纠结gc方式了。就是不兼容0951,能麻烦大佬兼容一下吗? 错误是: Caused by: java.lang.RuntimeException: java.lang.Run  详情 回复 发表于 2024-2-27 12:02

战列舰长

 楼主| 发表于 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里没有

点评

更了一下,有时间帮忙测测  详情 回复 发表于 2024-2-27 12:40

战列舰长

发表于 2024-2-27 12:08:52 | 显示全部楼层
每次启动游戏的存档没办法直接保存,只能save copy,而且游戏根目录存档文件会比实际存档多出来好几个

战列舰长

发表于 2024-2-27 12:40:23 | 显示全部楼层
wuyi 发表于 2024-2-27 12:02
活捉大佬一只

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

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

战列舰长

 楼主| 发表于 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

编译版本太高了

点评

改回java8编译了  详情 回复 发表于 2024-2-27 13:32

战列舰长

发表于 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版的我甚至连游戏启动界面都打不开,点图标没反应,大佬麻烦把修改过的发过来好不好呀

点评

我是0951版本的  详情 回复 发表于 2024-3-16 20:40

巡洋大副

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

我是0951版本的

驱逐技师

发表于 2024-4-22 23:11:28 | 显示全部楼层
本帖最后由 圣剑圣剑 于 2024-4-22 23:15 编辑

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

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


*滑块验证:

本版积分规则

Archiver|手机版|小黑屋|远行星号中文论坛

GMT+8, 2024-5-4 16:22

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio

快速回复 返回顶部 返回列表