Mycophobia 发表于 2025-1-28 12:33:03

Miko告诉你为啥你游不响应了

本帖最后由 Mycophobia 于 2025-1-31 04:25 编辑


于是发布J23以后和一些佬们讨论了下一些跳出优化问题,尤其是殖民地酒馆不响应问题。然后被miko灌注了大量知识,所以打算和大家总结分享一下。这篇内容可能比较进阶但是我尽量以比较简单的方式解释(复杂了我也不懂w), 希望能帮助到modder和想进一步调试提高游戏稳定性和流畅度的玩家。


如果你是新人,记住以下三点:

1. 除非你很清楚自己在干什么,不要过度分配内存!8/16G分配3-4G, 32G分配 6G!

2. 如果还不稳定,进入graphicslib 前置mod的文件夹,打开 GRAPHICS_OPTIONS.ini 文件,酌情将 enableNormal , enableShader, loadMaterial 调为 false. (会影响光影画质,enableShader关闭后影响最大,但是提升也最大。)

3. 如果还不稳定,关闭音乐(游戏中音乐音量调成0即可,音效没有关系,不用关闭)。

下面是原理部分,由于我不是码佬,有部分理解/翻译错误的地方请击打我,有其他主意和反馈miko也很乐意考虑:

内存分配的误区:

优化SS的一个很大误区是认为所有问题都是内存分配不足导致的,甚至认为只要分配足够内存就能解决大多问题。但是实际上,SS占用的内存分为几个部分

Vparam -》 只有这个部分是Java23,24,8,还有原版改配置修改的内存分配,这个用来储存游戏中的各类数据,例如战斗中船只的位置之类的。而且这个部分由于Java 23,24对垃圾清理的优化,很多时候甚至不是你卡顿的瓶颈。

材质 -》 就是所有mod的船只贴图,法线材质图等,大mod和材质会有很大的占用,例如Graphiclib大概348,KOL 250, 塔兰 374等等。这些内存占用是在你通过vaparam分配的内存 之上 的。(有部分其他东西也在这个下面,但是材质是大头)

上面两个部分构成了游戏本身的占用,但是牢A的设置导致有第三个东西露出了游戏之外。

音乐播放 -》所有ss的音乐都是在播放时临时读取,并且其占用的是你电脑 没有被游戏使用的空闲内存 而且每次加载音乐都会积累缓存使用,并且miko研究后也没能发现让java主动清理这些的方法。Java会随时间慢慢清掉这些,但是频繁读取很多音乐时会快速积累占用。具体的后果视pc而定,但是游戏闪退是可能后果之一。

这也是为什么一般跳出发生在殖民地 - 因为游戏试图载入新音乐时分配外的内存不足了。

而这个音乐播放的系统属于底层代码,除了alex自己重写以外似乎没有其他的解决办法

由此解释上面的三点建议

1. 这也是为什么用Java23/24不应该过度分配内存。在mod列表充足的情况下,光是贴图就有可能占用3GB左右内存,在加上Windows进程一般2G左右。在16G系统分配建议的4G内存代表你可能只有大概6-7G内存剩余,而这些还不包括QQ等其他运行的程序。而且除非战斗规模巨大或mod量巨多,否则很多时候4-6G分配已经足以解决问题 (我个人16G电脑用4G分配几乎从来没有卡过)

具体内存超出的后果因电脑而而异,有的能够允许短期超内存运行,有的会立刻关掉游戏。这也是为什么有的人过度分配还不会立刻炸,但这其实也是在给自己添加隐藏风险。总之如果要增加内存分配,应该慎重地报试验态度进行。

2. 而关闭Glib的各类材质图系统是因为大部分有材质图的mod一张船可能有三张图,等于占用了三倍的贴图内存,而且游戏中也能缓解下显卡的压力。Miko也建议如果modder打算在mod中使用有特定vfx贴图的效果,最好在游戏一开始,而非需要时加载这些贴图。(这类优化miko建议参考议长的mod)

3. 由于音乐的使用,由于音乐占用的是没有为游戏分配的内存,并且会大量积累,避免频繁的加载音乐,降低mod里大体量音乐的出现,以及保留足够的空内存不让游戏本体占用都是可以缓解问题的方式,而最为一劳永逸的解决方式自然就是完全关闭音乐。由于java会确实自然清理这类缓存,如果能采取前几条建议,或许能够在保留音乐的同时依旧稳定游戏。

上面几条建议都有各自的代价,因此需要玩家自己取舍,不过这是miko建议的优先顺序。

延申讨论

下列内容因为比较高深,那里转述不对请击打我:

1. 为什么Java 7/8 时可以分配很多 / 为什么Java 7/8 分配很多还是卡。

这两个问题的主要原因时 Java 7/8用的垃圾清理程式 CMS 本身占用内存极低,导致就算大量分配的情况,也可能有足够的内存播放音乐。但是CMS的问题是它只会在内存占用99的时候清理,而且一次只能清理到96-97%。如果内存使用够多,很快又会立刻上升到99%,导致卡顿。这也是为什么mod够多了似乎分配多少内存都不够,因为它一旦满了,就会一直满着。(请注意这个垃圾清理无法清除音乐播放造成的游戏外缓存使用。)

Java 23/24使用的Shenandoah能够更加有效的实时标记清理垃圾,导致它能够将内存占用持续压制在较低的范围,这也是Java23/24的一个主要优化(但也有一些别的方面的帮助)。但另一方面,由于这个垃圾清理需要实时运作,其内存占用比CMS高,所以对过度分配内存更加敏感。

Java 24的一个优化是它降低了Shennandoah标记垃圾占用的内存,因此会进一步空出内存空间。虽然miko也说目前测试有限,不能保证效果,但是这也是另一个可以考虑提高稳定性的方法。

2. 既然贴图会占用内存,能不能压缩贴图呢?

不能,游戏读取贴图时还是会按解压的内存占用。如果使用法线贴图较多可以考虑提醒玩家酌情关闭glib。以及上述的vfx效果尽量提前载入。

3. 音乐到底应该多大合适呢?

Miko的建议是单个音乐不应该超过10mb,具体要看它出现的频繁程度。4分钟长的音乐8mb或许没问题,但是1-2分钟长的可能2-4mb就差不多了。而且Miko建议modder或许可以考虑通过音效的方式来放一些独特的音乐(因为这些不占用游戏外内存),但是这也可能有其他的问题所以只是个馊主意指的考虑。

4. 还有别的办法吗?

通过占用硬盘空间来分配page文件可以在内存不足时让系统有地放丢一些其他的内存占用,有可能可以缓解音乐造成的崩溃。

结尾

以上碎碎念基本上是miko的分析和研究,我只是听完了课来写个笔记供大家参考,miko也说了这些问题如果有任何解决的主意也很乐意接受反馈看看有什么能做的,不过目前能想到的可能都需要牢A了。

如果有任何问题和反馈,可以向我反馈,需要时我会和miko反馈。(我是Myco,不是Miko,作者是Miko,不是Myco,我们不是Mygo)


forrevenge 发表于 2025-1-28 12:39:54

98说是Alex会给BGM播放队列5改成10,不知道会不会解决这个个BGM崩游戏

Mycophobia 发表于 2025-1-28 13:09:06

forrevenge 发表于 2025-1-28 12:39
98说是Alex会给BGM播放队列5改成10,不知道会不会解决这个个BGM崩游戏

Miko说少量测试目前看来似乎没有完全解决问题。主要的问题是缓存分配失败,队列的数量本身似乎不是原因。

Tick_Tock_Man 发表于 2025-1-28 13:15:05

都可以,噤声星号罢了
说到music buffer导致卡死的问题,似乎后来Lukas也对该理论有所质疑,但当时论坛有个贴确实是alex本人承诺会寻找修复方法,现在看来也只能先看看他能做什么了

lili 发表于 2025-1-28 16:25:30

Tick_Tock_Man 发表于 2025-1-28 13:15
都可以,噤声星号罢了
说到music buffer导致卡死的问题,似乎后来Lukas也对该理论有所质疑,但当时论坛有个 ...

问题就在于如果alex能到做什么有效的方法,也不必大费周章科普相关内容和去想些治标不治本的解决方案了。换句话说这篇文章正是由于alex对抗星球界面未响应将宣告失败而提前做好对策

櫻庭十六夜 发表于 2025-1-28 16:48:06

我一律直接照著miko推薦的放 {:5_127:}

極光 发表于 2025-1-28 17:01:24

啊!???原来读取音乐还会累积内存占用。。。这么抽象的吗{:tieba_23:}{:tieba_23:}{:tieba_23:}还不如一次性开始就把游戏文件全塞进框架内的内存大小里。。。。。。现在游戏文件加mod加起来都没4GB,,划个6G全塞进去都还会爆,我理解不了

Tick_Tock_Man 发表于 2025-1-28 17:11:35

lili 发表于 2025-1-28 16:25
问题就在于如果alex能到做什么有效的方法,也不必大费周章科普相关内容和去想些治标不治本的解决方案了。 ...

你说的是非常正确的,应该做好两手准备:handshake

Mycophobia 发表于 2025-1-29 07:42:37

極光 发表于 2025-1-28 17:01
啊!???原来读取音乐还会累积内存占用。。。这么抽象的吗还不如一次性开始就把游戏文件全塞进框架内的内 ...

你划给游戏的 vparam 不会 被用来储存例如游戏贴图等材质文件。

简单来说,游戏计算中会生成各类需要储存的数据,例如船只位置,血量,vparam是用来放这个的。假设你分配的 vparam足够,那么过多的分配不仅没用,还会 占用 其他的应用内存空间,例如上面说的材质贴图,游戏外读取的音乐,还有其他系统进程。

而且miko换Java的主要优化正是通过垃圾清理减少了vparam的占用,提高了清理效率避免vparam满掉,这也是为什么很多时候原版你分8G最后还卡,J23你可能4G就够了。过度分配反而有可能本来倒置。

極光 发表于 2025-1-30 05:53:19

Mycophobia 发表于 2025-1-29 07:42
你划给游戏的 vparam 不会 被用来储存例如游戏贴图等材质文件。

简单来说,游戏计算中会生成各类需要储 ...

太草了。。。。{:tieba_34:}因为我十几年来的记忆和刻板印象对于java游戏就是一次性读取拉满,少量额外占用硬盘盒内存的读取,,没想到远星居然剑走偏锋。。。。太离谱了,{:tieba_23:}{:tieba_23:}{:tieba_23:}想来我当初8G的时候,分了6G老是报错,群里的兄弟告诉我其实3GB能启动那就不要改,没想到真的玩起来简单多了。。。。{:tieba_36:}原来如此,多谢你解答了多年的离谱疑惑!!!惯性思维不可取啊{:tieba_23:}{:tieba_23:}{:tieba_23:}

闹闹小跳 发表于 2025-1-31 00:47:06

弱弱问一句,怎么关掉bgm呢?启动项关sound连音效都没了

donform 发表于 2025-1-31 00:55:02

那么音乐要咋关闭啊。。。

BAKA24 发表于 2025-1-31 01:22:53

{:tieba_29:}一直关音效玩 没跳出过 居然莫名其妙优化了性能

Mycophobia 发表于 2025-1-31 03:54:27

闹闹小跳 发表于 2025-1-31 00:47
弱弱问一句,怎么关掉bgm呢?启动项关sound连音效都没了

游戏中直接把音乐调成0 即可

Mycophobia 发表于 2025-1-31 03:54:42

donform 发表于 2025-1-31 00:55
那么音乐要咋关闭啊。。。

游戏中直接把音乐音量调成0 即可

donform 发表于 2025-1-31 13:40:07

Mycophobia 发表于 2025-1-31 03:54
游戏中直接把音乐音量调成0 即可

谢谢myco,新年快乐

molebuzai 发表于 2025-1-31 14:10:57

那重新保存之后是相当于什么?重新分配内存吗?
顺便再提一条,开游戏前检查一下默认使用的是不是独显,否则也是溢出接崩

闹闹小跳 发表于 2025-1-31 15:33:27

Mycophobia 发表于 2025-1-31 03:54
游戏中直接把音乐调成0 即可

试了一下,一上午没有未响应:victory:

船到桥头自然沉 发表于 2025-2-6 14:05:39

感谢Mygo!

酸奶狐狸条 发表于 2025-2-6 23:46:33

非常好科普,使我的小条旋转,爱来自tiaotiao

Mycophobia 发表于 2025-2-7 02:45:16

船到桥头自然沉 发表于 2025-2-6 14:05
感谢Mygo!

是Myko,不是Mygo

Mycophobia 发表于 2025-2-7 02:45:47

酸奶狐狸条 发表于 2025-2-6 23:46
非常好科普,使我的小条旋转,爱来自tiaotiao

条条跳跳!

快乐柠萌茶 发表于 2025-2-9 18:33:27

我玩一段时间游戏,然后在势力间穿梭跑商,跑一段时间,游戏播放的bgm在突然蹦(很小声就像是被打断了一样)了一声之后就没有声音了,不仅是bgm还有音效都没了用的是java24的版本

Mycophobia 发表于 2025-2-12 04:47:00

快乐柠萌茶 发表于 2025-2-9 18:33
我玩一段时间游戏,然后在势力间穿梭跑商,跑一段时间,游戏播放的bgm在突然蹦(很小声就像是被打断了一样) ...

emm先考虑下调低内存分配试一下?如果降低分配会造成卡顿可以考虑下减少mod数量,尤其是音乐多且大的mod。(例如VIC)

快乐柠萌茶 发表于 2025-2-12 19:20:31

Mycophobia 发表于 2025-2-12 04:47
emm先考虑下调低内存分配试一下?如果降低分配会造成卡顿可以考虑下减少mod数量,尤其是音乐多且大的mod ...

唉,还真是在VIC的殖民地上音乐爆炸了,我用6G内存会炸音乐导致什么声音都没有,用4G的版本会炸音效,会少一些音效比如勘探星球的音效之类的。

起个名字好难 发表于 4 天前

本帖最后由 起个名字好难 于 2025-4-1 00:36 编辑

其实有一件事特别神奇,0.97在我30多个mod的加载下发现了好几天不卡顿的触发条件:在远行星号游戏开始卡顿时启动b站和网易云,把b站挂在后台后过了十五分钟游戏帧率就从大地图15fps变成45了,战斗帧率从12回到60了,除了存档比较卡(大约3到4分钟)。Java为24版,推测可能有解决办法。正在尝试复现

相位自走洗衣机 发表于 4 天前

第一次知道原来内存分配是这样的分配法,绝了{:5_124:}

丧失病狂 发表于 4 天前

起个名字好难 发表于 2025-4-1 00:28
其实有一件事特别神奇,0.97在我30多个mod的加载下发现了好几天不卡顿的触发条件:在远行星号游戏开始卡顿 ...

米游优化法并感

起个名字好难 发表于 4 天前

丧失病狂 发表于 2025-4-1 02:00
米游优化法并感

确实,推测大厂有优化方法,但我毕竟不了解Java,所以只能提供线索了。
页: [1]
查看完整版本: Miko告诉你为啥你游不响应了