 
Mod作者 超级加倍上传者
|
本帖最后由 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)
|
|