找回密码
 初始化身份识别芯片
搜索
查看: 116|回复: 3

[预热&讨论]雷霆优化mod:超新星爆炸:无限引擎

[复制链接]

战列舰长

发表于 昨天 23:16 | 显示全部楼层 |阅读模式
如各位所见,我这个mod的名字很雷霆,但是完全可以相信它的优化效果(

(这是大饼!不要全信!)预期实现的加载速度:260mod,30~50s加载完。

贴里先讲我将先实现,并且发布测试版的那部分的优化原理。

众所不周知,远行星号在加载的脚本阶段,会现场编译大量代码。以测试结果为例:



(注:此测试结果还加了一堆mod,其中fast rendering可能对此测试结果造成了影响,仅供参考)

每次加载都要现场进行编译,这效率还是太低下了不是么?

老实加载,很枯燥吧?(

我要做的这个优化mod,其功能之一,就是:把这部分实现预编译。一次加载,再也不需要进行现场的编译。

这在mod很多的情况下,节省出来的加载时间看起来还是很可观的。

另一部分优化的思路嘛,过于狂野了,我自己都怀疑能不能做出来,所以这里先按下不表(

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?初始化身份识别芯片

×

战列舰长

电子生命

发表于 昨天 23:54 | 显示全部楼层
本帖最后由 全自动电棍 于 2026-10-29 23:56 编辑

事实上你游有类似的优化
不难注意到ScriptStore类中存在以下分支
  1.       if (!StarfarerSettings.getBoolean("enableScriptCaching")) {
  2.          sourceClassLoader = new JavaSourceClassLoader(var0, new ScriptSourceFinder(), "UTF-8");
  3.          sourceClassLoader.setDebuggingInfo(true, true, true);
  4.       } else {
  5.          // 注意到这里有一个Cache分支
  6.          sourceClassLoader = new CachingJavaSourceClassLoader(var0, new ScriptSourceFinder(), "UTF-8", new ResourceFinder() {
  7.         // 略...
  8.       }
复制代码


不过你可以详细讲一讲你的优化思路,或许可能比原版游戏更好

另外加速编译这一块据我所知已经有两个项目了,这其中甚至不包括fr,大coremod时代来临力,,,

好嘛,我犯蠢了,逆向不完全等于完全不逆向( 但是a圣是这么写的注释,而且这选项默认关闭来着: # disabled for now, causes issues with subsequent runs if game is shut down during startup "enableScrip  详情 回复 发表于 半小时前
你说的对,但是《远神》是由Fractal Softworks, LLC.自主研发的一款上古史山Java游戏。游戏被设计为不使用「SemVar」的非标准版本号,在这里,被Alex选中的人将被授予「授权」,引导字节码神力。你将扮演一位名为「开发者」的神秘角色,在并不自由的逆向工程中邂逅性格各异、能力独特的DMCA,被它们一起击败,找回Alex失散的亲人——同时,逐步发掘「CoreModding」的真相。

战列舰长

 楼主| 发表于 半小时前 | 显示全部楼层
全自动电棍 发表于 2026-10-29 23:54
事实上你游有类似的优化
不难注意到ScriptStore类中存在以下分支

好嘛,我犯蠢了,逆向不完全等于完全不逆向(




但是a圣是这么写的注释,而且这选项默认关闭来着:
# disabled for now, causes issues with subsequent runs if game is shut down during startup
  "enableScriptCaching":false, # caches compiled scripts in saves/cache, faster startup time after first run



说明这玩意设计的还是有点问题(直接 FileOutputStream写到最终路径,那加载一半关了可不“cause issues”么;没有并发仅单线程,理论上不兼容FR)

而我要设计的东西,采用 tmp + ATOMIC_MOVE + CRC 实现原子写,可以解决a圣遇到的问题

此外, FR 的目标是多线程编译,但原版的 CachingJavaSourceClassLoader 是单线程,FR的解决方案是写了个更快的 loader,代价是理论上a圣写的那个功能用不了/失效(我懒得去复现了,太晚了)

我绝赞开发中的此项目不碰 loader ,而是在它已有的 bytecodeCache 上做 preload,这会使得它原版能用,比A圣写得好;还兼容 FR,可实现加载速度优化叠叠乐。

但我高估了我做的项目,其部分实现的含金量了,没想到a圣也想到了能这么做(
噢 我这边正在研究如何将Janino的编译后端换成ECJ并有限的实现一些优化 原理是通过重新实现游戏使用的Janino类达成(ABI兼容) 而因为是ABI兼容的原因原来的类可以直接当成一个壳子,实现可以委托到别的什么上,  详情 回复 发表于 半小时前

战列舰长

电子生命

发表于 半小时前 | 显示全部楼层
本帖最后由 全自动电棍 于 2026-10-30 00:28 编辑
3l psi 发表于 2026-10-30 00:17
好嘛,我犯蠢了,逆向不完全等于完全不逆向(

噢

我这边正在研究如何将Janino的编译后端换成ECJ并有限的实现一些优化
原理是通过重新实现游戏使用的Janino类达成(ABI兼容)

而因为是ABI兼容的原因原来的类可以直接当成一个壳子,实现可以委托到别的什么上,这就给搞一些优化提供了空间(顺带一提Janino的缓存源类加载器写的也有问题来着)

有意愿的话可以交流一下

Edit:
顺带一提,fr的多线程加载好像是包装了一下原始的Janino SourceClassLoader来着,希望我写的这个玩意不会炸

Edit2:
游戏仅使用了以下这些类,所以重新实现起来并没有特别难
  • org/codehaus/janino/CachingJavaSourceClassLoader
  • org/codehaus/janino/JavaSourceClassLoader
  • org/codehaus/janino/util/resource/Resource
  • org/codehaus/janino/util/resource/ResourceCreator
  • org/codehaus/janino/util/resource/ResourceFinder



你说的对,但是《远神》是由Fractal Softworks, LLC.自主研发的一款上古史山Java游戏。游戏被设计为不使用「SemVar」的非标准版本号,在这里,被Alex选中的人将被授予「授权」,引导字节码神力。你将扮演一位名为「开发者」的神秘角色,在并不自由的逆向工程中邂逅性格各异、能力独特的DMCA,被它们一起击败,找回Alex失散的亲人——同时,逐步发掘「CoreModding」的真相。
*滑块验证:

本版积分规则

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

GMT+8, 2026-10-30 00:56

Powered by Discuz! X3.5

© 2001-2077 Tencent Cloud | Durian Software Studio | IP地址位置数据由纯真CZ88提供支持

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