响亮的 发表于 2025-4-22 19:48:41

星海集群的角宿用轴炮射日开火的时候会闪退

### 游戏信息

游戏版本:      0.97a-RC11

### 系统信息

操作系统:Microsoft Windows 10 专业版

版本:10.0.19045 暂缺 Build 19045

总可用内存:`31.82G`


Java版本:`1.7.0_79`

Java路径:D:\Starsector\jre


虚拟机参数:java.exe -XX:CompilerThreadPriority=1 -XX:+CompilerThreadHintNoPreempt -Djava.library.path=native\\windows -XX:+UseG1GC -Xms1536m -Xmx1536m -Xss2048k -XX:PermSize=192m -XX:MaxPermSize=192m -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

堆栈初始大小(`-Xms`):`1536m`

堆栈最大大小(`-Xmx`):`1536m`


### Mod信息

|Mod名称                           |Mod版本   |已启用   |
|-|-|-|
|LazyLib                         |2.8b    |是       |
|zz GraphicsLib                  |1.9.0   |是       |
|MagicLib                        |1.4.6   |是       |
|(扩充)更多的船体插件More HullMods 1.12.0|1.12.0|是       |
|A New Level of Confidence       |30 3.2|是       |
|ac alice ship pack            |0.75 C-3|是       |
|atreg的头像包扩展|1.5.0   |是       |
|Console Commands                |2024.10.04|是       |
|Diable Avionics - Seal balance patch.|1.0.1   |是       |
|Diable Avionics - Seal ed.      |1.0.0   |是       |
|FSF军事公司|4.9rc2|是       |
|Leading Pip                     |1.9.3   |是       |
|LunaLib                         |1.8.7   |是       |
|MOD溯源               |1.2.0   |是       |
|Portrait Changer 头像修改器          |1.0.3   |是       |
|光环动力舰船工业                        |1.7.0-fix|是       |
|共生性虚空生物                         |0.5.0   |是       |
|军官头像和战斗语音                     |0.4.1b|是       |
|势力争霸                 |0.11.3c |是       |
|博尔肯基金会    |0.8.1   |是       |
|卢德骑士团                           |1.3.6   |是       |
|女武神组织             |3.3.0   |是       |
|工业革命                            |3.3.e   |是       |
|战斗骚话            |1.14.2|是       |
|星海集群                            |1.13.5|是       |
|星舰传奇          |2.5.0   |是       |
|星际2战巡和诺娃语音                      |0.1b    |是       |
|沃尔科夫工业集团                   |1.6.3a|是       |
|泰兰船包                            |1.3   |是       |
|海盗拓展                |1.8.3   |是       |
|燃料虹吸            |1.4.0   |是       |
|第四天灾音乐库                         |1.0   |是       |
|经验内插 Progressive S-Mods         |1.0.2   |是       |
|航母UI                 |1.0.0   |是       |
|舰船/武器拓展       |1.15.1|是       |
|骤雨军事公司                        |3.1.5   |是       |
|高质量舰长 Quality Captains          |1.6.1   |是       |
|黑石船坞     |0.9.5_cn0.1|是       |
|MRC开局之地狱模式                      |1.0.1   |否       |
|zzz Mikohime Additionals Settings|1.1.1   |否       |
|骤雨军事公司 - 动漫风头像包               |1.0   |否       |

(以上内容由 远行星号 报错信息收集工具 自动生成,生成工具版本 `1.1.2`).

激流 发表于 2025-4-22 20:04:02

{:tieba_30:}
嘶 没发现有类似的问题 没复现成功
你试试在测试战役里使用角宿轴炮开火? 也会闪退吗?

响亮的 发表于 2025-4-22 20:06:03

激流 发表于 2025-4-22 20:04
嘶 没发现有类似的问题 没复现成功
你试试在测试战役里使用角宿轴炮开火? 也会闪退吗? ...

啥是测试战役?指模拟战斗吗?

响亮的 发表于 2025-4-22 20:09:12

激流 发表于 2025-4-22 20:04
嘶 没发现有类似的问题 没复现成功
你试试在测试战役里使用角宿轴炮开火? 也会闪退吗? ...

大佬,你用角宿打模拟战役,对面放个战列舰什么的,我用攻势或者女武神的无畏做对象,只要射日开始充能,闪光的一瞬间必定崩溃。

激流 发表于 2025-4-22 20:09:28

响亮的 发表于 2025-4-22 20:06
啥是测试战役?指模拟战斗吗?

就是游戏主菜单不是有战役模式吗,里面应该有一个星海集群测试战役

响亮的 发表于 2025-4-22 20:10:02

激流 发表于 2025-4-22 20:04
嘶 没发现有类似的问题 没复现成功
你试试在测试战役里使用角宿轴炮开火? 也会闪退吗? ...

另外我是1.13.5的版本,因为你说不兼容老存档,我没舍得升级1.13.6D

响亮的 发表于 2025-4-22 20:18:07

激流 发表于 2025-4-22 20:09
就是游戏主菜单不是有战役模式吗,里面应该有一个星海集群测试战役

测试战役试了大概5分钟,好像不会闪退的样子……但是回生涯模式打模拟战斗还是一样崩。

激流 发表于 2025-4-22 20:20:30

本帖最后由 激流 于 2025-4-22 20:28 编辑

响亮的 发表于 2025-4-22 20:18
测试战役试了大概5分钟,好像不会闪退的样子……但是回生涯模式打模拟战斗还是一样崩。 ...
hmmm
角宿上面放了什么特殊的军官吗 或者打了什么特殊的船插吗 或者舰船上搭载了什么特殊的武器吗

响亮的 发表于 2025-4-22 20:30:37

激流 发表于 2025-4-22 20:20
hmmm
角宿上面放了什么特殊的军官吗 或者打了什么特殊的船插吗

军官就是自带的培养仓妹子,武器带的VIC塞厄箭弹小导+女武神的阳炎HE-AD鱼雷,船插是电子反制、固化护盾、扩展护盾、稳定护盾、强化护盾、目标定位、副散管道扩容、扩展发射架、堡垒子机协议、特制鱼雷、自动修复单元、硬化子系统、高校检修,有经验内插MOD所以插的比较多……

激流 发表于 2025-4-22 20:30:38

响亮的 发表于 2025-4-22 20:18
测试战役试了大概5分钟,好像不会闪退的样子……但是回生涯模式打模拟战斗还是一样崩。 ...

或者你船上有没有兽耳的魔火盾心?有报告说这个会导致类似的报错

响亮的 发表于 2025-4-22 20:32:15

激流 发表于 2025-4-22 20:30
或者你船上有没有兽耳的魔火盾心?有报告说这个会导致类似的报错

没装兽耳,听说了那东西BUG贼多……

激流 发表于 2025-4-22 20:39:13

响亮的 发表于 2025-4-22 20:30
军官就是自带的培养仓妹子,武器带的VIC塞厄箭弹小导+女武神的阳炎HE-AD鱼雷,船插是电子反制、固化护盾 ...

嘶,完全复现不出来这个bug
你试试在生涯里去掉军官 卸下其他武器和船插 还会有这个问题吗?
实在不行试试先用控制台添加一个全新的角宿
AddShip gr_Spica

响亮的 发表于 2025-4-22 20:43:42

激流 发表于 2025-4-22 20:39
嘶,完全复现不出来这个bug
你试试在生涯里去掉军官 卸下其他武器和船插 还会有这个问题吗?
实在不行试 ...

神奇啊,卸了军官和全部武器船插就不闪退了,那么问题出在哪?

响亮的 发表于 2025-4-22 20:55:20

激流 发表于 2025-4-22 20:39
嘶,完全复现不出来这个bug
你试试在生涯里去掉军官 卸下其他武器和船插 还会有这个问题吗?
实在不行试 ...

又用排除法试了下,军官似乎没问题,武器单独用塞厄箭弹或者阳炎鱼雷都行,但是这俩一起用就会闪退……船插还没试。

响亮的 发表于 2025-4-22 21:06:15

激流 发表于 2025-4-22 20:39
嘶,完全复现不出来这个bug
你试试在生涯里去掉军官 卸下其他武器和船插 还会有这个问题吗?
实在不行试 ...

应该就是塞厄箭弹发射架或者阳炎HE-AD鱼雷的问题,把这俩卸了换成黑石的SPL,并且把射日单独放一个武器组,就不闪退了。

激流 发表于 2025-4-22 22:52:42

响亮的 发表于 2025-4-22 21:06
应该就是塞厄箭弹发射架或者阳炎HE-AD鱼雷的问题,把这俩卸了换成黑石的SPL,并且把射日单独放一个武器组 ...

意思是如果和射日放在一个组里还会闪退吗?

响亮的 发表于 2025-4-23 07:50:18

激流 发表于 2025-4-22 22:52
意思是如果和射日放在一个组里还会闪退吗?

不好意思昨晚睡了,因为之前是把阳炎鱼雷跟射日放一组的,射日开炮的瞬间必定闪退,我只是怀疑是不是跟阳炎的装填机制什么的冲突,纯属瞎猜的,干脆单独拉一组算了。

阿壹 发表于 2025-4-23 12:35:53

我之前也有这种问题,只不过我是把内置导弹和共鸣体和主炮绑一起,然后一开火就闪退

响亮的 发表于 2025-4-23 13:25:21

阿壹 发表于 2025-4-23 12:35
我之前也有这种问题,只不过我是把内置导弹和共鸣体和主炮绑一起,然后一开火就闪退 ...

哦吼,感觉快破案了,共鸣体是什么?是不是那种按时间自动装填的弹夹武器?咦,好像内置导弹也是无限装填的弹夹武器。

响亮的 发表于 2025-4-23 14:54:51

激流 发表于 2025-4-22 22:52
意思是如果和射日放在一个组里还会闪退吗?

我滴妈呀,DeepSeek看起来好牛逼,完全看不懂,作者大大你瞅瞅有什么启发吗?

嗯,用户之前遇到了游戏远行星号在战斗中使用星海集群MOD的角宿巡洋舰主炮“射日”开火时闪退的问题,错误日志显示是ConcurrentModificationException。现在用户进一步说明具体是在使用这个MOD的特定舰船和武器时出现问题,需要更具体的解决方案。

首先,我需要回顾之前的分析。之前的结论是并发修改异常,通常是因为在遍历集合时另一个线程修改了集合结构。现在用户补充了具体的触发条件,即使用特定主炮开火时崩溃,这说明问题可能与该武器的代码逻辑有关,尤其是在开火时可能修改了某些集合。

接下来要考虑的是,星海集群MOD中的角宿巡洋舰的主炮“射日”在开火时可能触发了某些操作,比如生成炮弹、添加武器效果、或者修改舰船或武器的状态,而这些操作可能没有正确处理线程安全,导致在游戏主线程迭代时修改了集合。

可能的错误点包括:

1. 武器开火时动态创建或删除实体(如导弹、光束),这些实体被添加到游戏引擎的集合中。

2. 武器脚本可能在每帧或某个事件中修改了共享的数据结构,而没有同步机制。

3. MOD代码可能在处理武器效果时,错误地在遍历过程中修改了列表,例如在advance方法中直接删除元素。

用户可能需要检查该MOD的脚本,特别是与“射日”主炮相关的部分。由于用户可能是MOD使用者而非开发者,可能需要指导他们如何排查或联系MOD作者。

解决方案方面:

1. 建议用户检查MOD是否有更新,可能开发者已经修复了这个问题。

2. 如果用户熟悉Java或MOD开发,可以指导他们查看武器脚本,寻找在开火时修改集合的地方,比如使用CopyOnWriteArrayList或在遍历时复制集合。

3. 临时解决方法可能是避免使用该主炮,或在战斗设置中减少其他实体数量,以降低并发冲突的可能性。

此外,考虑到错误发生在主线程,可能不是多线程问题,而是单线程中的迭代和修改冲突。例如,在游戏的主循环中,遍历舰船或武器列表时,武器的开火代码直接修改了同一列表,导致迭代器失败。这种情况下,需要确保在遍历时不要直接修改原列表,而是先收集需要修改的元素,遍历结束后再处理。

比如,在Java中,这样的代码会导致问题:

for (WeaponAPI weapon : ship.getAllWeapons()) {

if (weapon.needsRemoval()) {

ship.removeWeapon(weapon); // 在遍历时直接删除,导致异常

}

}

应该改为:

List<WeaponAPI> toRemove = new ArrayList<>();

for (WeaponAPI weapon : ship.getAllWeapons()) {

if (weapon.needsRemoval()) {

toRemove.add(weapon);

}

}

for (WeaponAPI weapon : toRemove) {

ship.removeWeapon(weapon);

}

因此,用户需要检查MOD中是否有类似的结构,尤其是在武器开火或效果触发的代码部分,是否有在遍历时修改集合的操作,并修正为安全的做法。

如果用户无法自行修改代码,建议向MOD作者报告此问题,并提供错误日志和重现步骤,以便开发者修复。

根据你的描述,问题集中在 星海集群MOD的角宿巡洋舰主炮“射日”开火时触发 ConcurrentModificationException。这是典型的“遍历集合时修改集合结构”导致的线程安全问题。以下是针对性分析和解决方案:

根本原因分析
武器逻辑与集合冲突:

主炮“射日”开火时,可能通过 MOD 脚本动态创建了武器实体(如炮弹、导弹、光束等),这些实体被添加到游戏的某个集合(如 CombatEngine 的武器或舰船列表)。

游戏主线程正在遍历同一集合(例如更新所有武器状态),此时 MOD 代码修改了该集合,导致迭代器失效。

单线程中的逻辑错误:

即使游戏是单线程的,如果在 advance() 方法或事件监听器中直接遍历并修改同一集合(如删除过期武器、添加新实体),也会触发此异常。例如:

java
// 错误代码示例:在遍历时直接删除元素
for (WeaponAPI weapon : engine.getWeapons()) {
    if (weapon.isExpired()) {
      engine.removeWeapon(weapon); // 抛出 ConcurrentModificationException
    }
}
针对性解决方案
1. 临时规避措施
禁用该武器或舰船:在 MOD 配置文件中找到角宿巡洋舰或“射日”主炮的配置,暂时注释掉相关代码。

降低战斗负载:减少战场中的单位数量,降低集合修改冲突的概率。

2. 检查 MOD 脚本(需开发知识)
如果你能访问 MOD 的源码(或通过反编译工具),定位“射日”主炮的武器脚本(通常位于 data/weapons 或 data/scripts 中),检查以下关键点:

遍历集合时直接修改:
查找类似以下代码,确保没有在遍历时直接增删集合元素:

java
for (ProjectileAPI projectile : engine.getProjectiles()) {
    if (projectile.shouldRemove()) {
      engine.removeEntity(projectile); // 错误!
    }
}
修正方法:改用临时集合记录待操作对象,遍历结束后再处理:

java
List<ProjectileAPI> toRemove = new ArrayList<>();
for (ProjectileAPI projectile : engine.getProjectiles()) {
    if (projectile.shouldRemove()) {
      toRemove.add(projectile);
    }
}
for (ProjectileAPI p : toRemove) {
    engine.removeEntity(p);
}
使用线程安全的集合:
如果 MOD 在多线程中操作集合(如异步事件),替换为 CopyOnWriteArrayList:

java
List<WeaponAPI> weapons = new CopyOnWriteArrayList<>(ship.getAllWeapons());
3. 联系 MOD 作者
提交错误报告:
向星海集群 MOD 的作者反馈此问题,附上以下信息:

完整日志文件(starsector.log)。

重现步骤:明确说明“使用角宿巡洋舰主炮‘射日’开火时崩溃”。

建议修复方向:指出可能是武器脚本在遍历时修改了集合。

临时补丁请求:
请求作者发布热修复版本,或在社区(如 Fossic 论坛)询问其他玩家是否有临时解决方案。

4. 兼容性调整
更新依赖库:
某些 MOD 依赖共享库(如 LazyLib、MagicLib),确保这些库已更新到最新版。

调整加载顺序:
在游戏的 mod_info.json 中调整 MOD 加载顺序,将星海集群 MOD 置于其他战斗相关 MOD 之后,减少冲突。

附加排查技巧
简化重现环境:

禁用其他 MOD,仅保留星海集群 MOD,确认问题是否依旧存在。

如果问题消失,逐步启用其他 MOD,找到冲突组合。

日志监控:
在开火前和开火时,观察日志中是否有其他警告(如 WARN 或 NullPointerException),可能揭示更深层次的逻辑错误。

总结
此问题的核心是 星海集群 MOD 的武器脚本在开火时错误地修改了正在被遍历的集合。优先联系 MOD 作者并提供详细日志,若你有开发能力,可尝试自行修复遍历逻辑或替换线程安全集合。如果急需继续游戏,暂时禁用该舰船或武器是最直接的规避方案。

Mycophobia 发表于 2025-4-24 04:27:22

本帖最后由 Mycophobia 于 2025-4-24 04:30 编辑

试着帮激激老师看了一下,因为女武神码没有开源我看不到,但是阳焰看上去只有On Hit Effect,假设没有额外的全局脚本的话那么很难想到它会有什么跟别的的冲突之处。

不过Concurrent Modification的主要出现之处是武器试图给舰船下达指令,我之前绿皮钻头船试图通过钻头让舰船不停加速就出国问题。这类问题不一定能稳定复现但是原则上来说应该比较常见(例如兽耳魔火)
(CJY佬有解释,最下面)
https://www.fossic.org/forum.php?mod=viewthread&tid=12039&highlight=%E9%94%99%E9%A2%98

      if (ship.getSystem().getAmmo() >= 2 && weapon.getAmmo() == 0
                && AIUtils.canUseSystemThisFrame(ship) && ship.getShipAI() != null){
            ship.useSystem();
      }

      if (ship.getSystem().isActive() && ship.getSystem().getEffectLevel() == 1) {
            for (WeaponAPI w : ship.getAllWeapons()) {
                if ((w.getSpec().getWeaponId().equals("gr_SpicaArrow")) && (AmmoonlyOnce == false) && w.getAmmo()==0) {
                  w.setAmmo(1);
                  AmmoonlyOnce = true;
                }
            }
      } else if (ship.getSystem().isChargedown()) {
            AmmoonlyOnce = false;
      }
    }

看了下射日的码,这里确实有一段是用武器everyframe让舰船启动系统的。如果lz确实能够稳定复现问题,那激激老师要不把这段检测放到舰船系统AI而不是武器everyframe里,或者单纯先删掉试一试?

此外LZ最好也检查下装了任何AI改修类的mod没有。

响亮的 发表于 2025-4-25 17:18:54

Mycophobia 发表于 2025-4-24 04:27
试着帮激激老师看了一下,因为女武神码没有开源我看不到,但是阳焰看上去只有On Hit Effect,假设没有额外 ...

还是大佬看得明白。我只要还原出问题的武器配置,射日开两炮以内必定闪退,是可以稳定复现的,奇怪的是这种稳定闪退只在模拟战斗出现,平时正常遭遇战只是低概率。
另外我似乎没装什么更改AI的MOD,上面有我的MOD使用列表,您帮我看看?其实我也不太懂……

Mycophobia 发表于 2025-4-26 03:36:39

响亮的 发表于 2025-4-25 17:18
还是大佬看得明白。我只要还原出问题的武器配置,射日开两炮以内必定闪退,是可以稳定复现的,奇怪的是这 ...

奇怪的是我也在维护星海的英文翻译版,而我从来没接过这个报错,而这类concurrent modification的报错按理说就算不能稳定触发也应该比较平衡。

所以除了阳炎以外还有任何武器组有这个问题吗?

(此外如果不介意,可以测试下如果你打一炮立刻用舰船系统装填一炮,能否安全设下去。)

响亮的 发表于 2025-4-26 08:40:56

Mycophobia 发表于 2025-4-26 03:36
奇怪的是我也在维护星海的英文翻译版,而我从来没接过这个报错,而这类concurrent modification的报错按 ...

一炮也打不出去,在它开始充能发粉光的瞬间,就闪退了。我实在懒得再测试了,老是重新进游戏好麻烦的哈哈,反正现在装6个SPL,把射日单独拉一组就没事,就这么玩吧。
页: [1]
查看完整版本: 星海集群的角宿用轴炮射日开火的时候会闪退