|
原创Mod发布
粒子引擎注入与java11-23之钥
0.0.2 / ID:zender_ParticleEngineInject
PEI+Java11+
将Particle Engine提供的更高效的粒子注入到游戏内
使得游戏可以以java11-23运行
|
Mod作者: |
zender |
Mod类别: |
功能 |
Mod适用版本: |
0.97 0.96 0.95.1 |
Mod更新时间: |
2024-03-07 |
可安全移除: |
是 |
依赖Mod: |
其它 |
其它依赖Mod: |
particleengine |
冲突Mod: |
jre23 support by Mikohime |
Mod下载地址: |
https://github.com/aCzenderCa/ParticleEngineInject |
网盘提取码 / 解压密码: |
|
本帖最后由 zender 于 2024-3-10 09:24 编辑
java17以上版本使用可能会报错,我这复现不了问题,出bug的话换java17吧
3月7 更新2:强制阻止因为缺失export导致的报错(现在,使用本模组的情况下,唯一必须的add-opens是--add-opens=java.base/java.lang=ALL-UNNAMED,具体来说,通过修改java.lang.Module.isOpen/isExported的返回值固定为true实现)
3月7 更新1:强制阻止因为缺失open导致的报错(模组文件更新)
3月2 更新2:现在pei会自动检测java运行版本,比如只会在java版本高于11时修改Thread.stop,同时pei改为了java8编译,兼容范围扩大到java8-23
3月2 更新1: 链接:https://pan.baidu.com/s/1-37MQA2lKgGb_WIOFeCwFQ?pwd=kxfm 这个是pei+java11+一键启动器,下载下来放到starsector.exe同一目录双击打开,按提示操作即可,内置javaee8,zulu java21,pei模组文件
因为内置了个jre,有100m多,比较大,我尽量少更启动器,启动器就相当于release发布,直接下模组文件相当于测试版,启动器还可以生成启动脚本
启动脚本生成为starsector.exe同目录下的RunStarsector.bat,除非要更换其他java,否则无需重新生成启动脚本
本来想着javaee能直连下,后面看javaee本身100m还是内置进去了,不过也导致启动器达到了200m
启动脚本里javaw.exe改成了java.exe,用javaw log会乱码
2月29 更新1:添加Thread.stop的保护,可能使最高支持版本提高至java23(经测试证实了该点)
注:最大支持java17(没有经过大量测试)
2月28 更新2:将版本号改为0.0.2,帖子中适用版本添加097,095(095使用时PE仍需要0.71版本而非095中的0.3版本)(同一模组文件可以在这三个版本中使用,在096之外版本使用时请自行修改mod兼容版本)
感谢 wuyi,Tick_Tock_Man,不想起名字,不会取名的屑,星星蜗牛 的积极测试
注:095中使用时最好在starsector-core\data\config\settings.json的graphics部分里添加"nebula_particles2":"graphics/fx/cleaner_clouds00.png"(图片cleaner_clouds00在096里拿)(也可以不加,现在不会报错了,理论上来说095没用到这个)
2月28 更新1:移除了直接混淆字段引用,提高兼容性,避免了因为缺少某些粒子所需图片报错,但如果对应粒子被调用,则无法显示出来
2月27 更新2:阻止因CombatEngine类中缺少某些函数报错,可能会使模组支持095
2月27 更新1:现在会强制将TimSort转换为legacyMergeSort避免报错
2月26 更新1:在启动参数中加入了-Djava.util.Arrays.useLegacyMergesort=true使得java使用旧版归并排序实现(新版排序实现是TimSort,更快但对比较函数有要求)避免一些报错(这个报错非常神奇,我审了com.fs.graphics.DisplayManager 和com.fs.starfarer.campaign.ui.intel.SortablePlanetList.recreateList 的里排序函数代码,并没有发现明显的错误,fsf那个船插的代码大概也是 ,正常来说java7的排序就是TimSort了,为啥换java11后才报这种错)(又审了审com.fs.graphics.DisplayManager里的比较函数实现,虽然写的比较抽象,先把数字转了字符串再转回了数字,总共就四行代码,两个int的比较,相等时返回0,理论上来说绝对没有错误的可能性)
2月10,14:13更新:强制阻止com.fs.starfarer.campaign.ui.intel.SortablePlanetList.recreateList报错(有一说一,这个大概不是我的锅)
2月10,8:05更新:统计要释放的缓冲区总大小并在超过64M(2/28-1:=128M,该更新后会重复统计缓冲区大小,所以提高了临界总大小)后触发强制gc
经两位小白鼠的测试,已经ok了,大家可以放心用
根据进一步的测试结果,我认为强制缓冲区释放可能导致的多重释放最终使得jvm崩溃,我已经将其移除,这个修复后进行了三次启动测试,都正常
从提供的vmparams中移除了可能导致问题的g1gc
保存还有点问题,我得再研究一下,已经解决了,原因是缺少了com.sun.xml.internal.txw2.output.IndentingXMLStreamWriter 类型,我写了一个加上去就好了
经过早上几个小时的研究,我搞明白了挡在Starsector96到java11前只有两件事,java ee和sun.nio.ch.DirectBuffer
premain+javassist实际上就是在运行时修改内存中的class数据,标题(指之前在制作讨论里发的帖子的标题)属于是玩了个文字游戏,该方法确实不修改任何.class和.jar文件,但是修改了class数据
借助premain+javassist技术,我重写了唯一使用sun.nio.ch.DirectBuffer 的函数
再在启动参数中加入巨量的add-opens和add-exports
再在启动参数中加入对java ee的引用
我成功的使用java11启动了Starsector96并且在超空间中飞行了一小段,过了一个月,打了一场模拟战
唯一的问题是窗口模式下边框(x按钮那部分)消失了
在这先放一个java ee下载链接 http://download.java.net/glassfish/5.0/release/javaee8-ri.zip
再在这放一个graalvm java11链接:https://pan.baidu.com/s/1ixAF7MmQTqgQn5FIuW0gPA?pwd=am0y
提取码:am0y
我自己测试的时候用的就是这个版本
你也可以自行选用java11-java23之间的任意版本
模组文件:
我直接就在之前PEI里面写了,这次安装有所区别,请详细阅读下列文本
预准备1,正常解压模组文件后将模组文件夹中的javassist.jar和ParticleEngineInject_PreMain.jar文件挪动到starsector-core里
预准备2,从我提供的java ee下载链接下载java ee,将下载到的javaee8-ri.zip文件解压到Starsector目录(游戏可执行所在位置)下
首先,你需要在启动参数中-Dcom.fs.starfarer.settings.paths.mods=../mods和-classpath之间加入以下参数,且加入的参数前后加上空格以分隔
--add-opens=java.base/jdk.internal.vm.annotation=ALL-UNNAMED --add-opens=java.base/sun.net=ALL-UNNAMED --add-opens=java.base/sun.net.util=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/sun.net.www=ALL-UNNAMED --add-opens=java.base/jdk.internal.loader=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=jdk.unsupported/sun.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.ref=ALL-UNNAMED
然后在classpath参数的最后(一般来说,最后一项是xstream-1.4.10.jar,也就是在这之后不加空格,直接复制粘贴)加上;javassist.jar;../glassfish5/glassfish/lib/javaee.jar -javaagent:ParticleEngineInject_PreMain.jar
注意:从;开始到最后的.jar完整复制粘贴,包括;
注意:如果你已经使用了旧版本的PEI,请不要让-javaagent:ParticleEngineInject_PreMain.jar参数重复
在这放一份改好的vmparams,开启了g1gc(由于其可能导致崩溃,已关闭),内存上限开的8g
最后将jre换成java11版本,注意:技术所限,该项也是必须的,也就是说本mod必须在java11环境下使用
建议就直接用我改好的vmparams,除非你之前换的java8是换成最新java8,否则还有一个参数-Xverify:none要加
javaee要解压成一个叫glassfish5的文件夹,里面有glassfish文件夹,如下图
Starsector\glassfish5里的内容如下图
Starsector\glassfish5\glassfish里的内容如下图
版本注意:虽然我使用了特殊办法规避了直接引用混淆函数,但是这并不意味着模组绝对可以在096rc10之外的任何版本使用,只是相较于直接引用有了一些正常使用的可能性
模组兼容性
测试时同时激活了大量模组,总计58个,战役没有问题,生涯第一次测试时过了约两月,打了几个赏金,最后保存时报错了,之后修复保存功能后也进行了测试,没有报错,确认解决,部分启用模组如下
在这放一个前置链接[0.96a] Particle Engine (12/29/23) (fractalsoftworks.com)
这个这边论坛没人搬的说
从隔壁制作讨论移过来的,感觉放那边没人看呀
以下是pei使用的所有粒子图片,发现缺失请从096中拿,其中:"game_raw_fx", "particlealpha32sq"因为原图在jar里,pei中内置了该图片
项目已在github上开源,下载地址里是项目开源地址
|
评分
-
查看全部评分
|