实践探究:1.1主程序SFF读取崩溃及解决方法

作者:白绝

文章原地址:https://tieba.baidu.com/p/5482366654


众所周知,在1.1中经常出现类似这样的错误:Error Loading P1或者Can't Load SFF,经常有人问这个错误
我查阅了一些相关的帖子,有以下几种说法:
1.由于部分人物的SFF过大,导致内存占用超出MUGEN所能承受而崩溃
2.由于此错误经常发生于1.1主程序,可能是因为1.1不稳定
3.由于电脑配置不够高导致崩溃
4.由于人物不兼容1.1


那么我们今天的重点就是要直捣黄龙,看看真正的原因是什么,首先我找了一个出错较频繁的人物Hige,大小为232M,SFF占152M,将它放入从千寻下载的原版1.1Beta1主程序,然后将Hige与kfm对战:Hige为1P
blob.png
开始游戏后,在VSScreen黑屏了一段时间,之前还有人说是因为在黑屏期间按了键盘才报错,当然这个肯定是错误的,你用kfm与kfm对战VS界面不断乱敲键盘也是可以正常打开的
黑屏过后并没有发生什么错误,正常对战
blob.png
此时我们看看资源监视器中内存占用的情况:在黑屏期间内存不断上升,最后进入对战后停留在920M
blob.png
第二次我们用Hige与Hige进行对战,依旧等待了很长时间的黑屏,内存占用和刚刚的差不多
blob.png
通过上面两个实验主要是让大家知道,相同人物进行对战时,占用的内存并不是X2的,而是公用


接下来,我们不断复制Hige并重新命名文件夹,其他保持不变
blob.png
可以看出现在有5个不同名的Hige,接下来启动游戏,我们用Hige与Hige2对战
blob.png
依旧没有报错,进入对战后,内存占用高达1.77G
blob.png
我们可以发现的是,仅仅是文件夹不同名的Hige和Hige2被判定为了两个不同的人物,此时MUGEN分别读取了双方的内存,所以达到了两倍的占用


接下来,在Hige和Hige2对战完后,我们不着急退出MUGEN,而是先取消这场对战,回到选人界面,发现内存占用依旧是1.77G
blob.png
MUGEN并没有释放掉这部分内存,然后我们选定Hige3和Hige4对战,如果按照我们的设想,Hige3和Hige4应该会被判定为不同的人物,那么MUGEN会分别读取他们,我们看看内存的变化
blob.png
此时,刚出现黑屏,MUGEN就报错了,而且就是我们今天要研究的错误,我们观察到内存是增长到了1.78G,在我们第一次用Hige和Hige1对战时,内存占了1.77G,然后当我们退出这个对战,再进行Hige3和Hige4对战时,这个1.77G依旧在占用,然后Hige3和Hige4的读取占用的内存就在这个1.77G的基础上不断增加,结果MUGEN不受重荷导致崩溃


解决疑问:为什么1.77G的内存不被释放?
内存不释放,要么是因为程序使用了这部分内存因为疏忽而没有销毁,要么是为了下一次的使用,为了搞清楚这个,我们重新打开MUGEN,第一次进行Hige和Hige2的对战,然后计时黑屏的时间,结果长达30s
之后回到选人界面,再次进行Hige和Hige2的对战,计时黑屏的时间,结果不到1s,并且内存占用依旧是1.77G
至此,我们证明了一件事情:MUGEN不会立刻销毁对战过的人物所占用的内存,而是为了保证下一次使用的速度而保留
初步结论:由于MUGEN这个内存保留机制,导致你不断地进行对战,内存占用就不断地上升,最后崩溃


解决疑问:到底内存占用多大的时候才有可能崩溃呢?
在刚刚的对战中,1.78G的内存占用导致了崩溃,经过查阅资料,发现在MUGEN1.1发布的那个年代,很多2D游戏其能使用的内存最高临界点都在2G,经过多次的实验,发现内存占用在1.5G-2G时,发生崩溃的几率最高


解决疑问:能否让MUGEN不保留内存呢?
答案是肯定的,在mugen.cfg中,你可以看到有Misc有一个名为PlayerCache的参数
;Number of extra players to cache in memory.
;Set to a lower number to decrease memory usage, at cost of
;more frequent loading.
PlayerCache = 2
这个参数指定额外缓存人物的数量,此参数的最小值为0,我们设置为0,然后重复上面的实验:
Hige VS Hige2
blob.png
回到选人界面,Hige3 VS Hige4时,内存先降低,再增加,正常进入对战,内存占用1.77G
结论:改变PlayerCache的值,对于崩溃有很大的改善效果,建议设置为0


解决疑问:那如果有某人物运行后内存占用为1G,当自身互相对战的时候如何解决崩溃问题?
由于MUGEN的最高临界点为2G,实际上超过1.5G就很容易崩溃,只要运行后内存占用750M以上,自身互相对战的内存占用就已经到达了易崩溃区域,那么我们要解决的问题则是
“能否提高MUGEN能使用的内存最大值?”
答案是肯定的,在外国有一位大佬已经开发出了内存限制补丁,可以让早些时候的游戏突破限制,内存最高临界点提升到4G,工具是一键化的,仅20kb,选择文件后秒成功,极其方便
blob.png


解决疑问:容易内存崩溃是否是因为1.1不稳定?
答案是否定的,在1.0下重复以上实验,发现1.0也存在这样的机制问题

所以说,内存崩溃并不是1.1的专利,不是因为1.1多不稳定,只不过在日常使用1.0时,所使用的人物小,所以很少报这样的错误,且1.1的稳定性和1.0是基本一样的,在使用SDL之后相对于Win的Alleg来说稳定很多


解决疑问:人物兼容是否影响?
一般情况下不影响,因为1.1向下兼容,而且SFF读取崩溃经常出现于大人物上,小人物基本不崩溃,所以不应该是人物兼容的问题


探究总结:
崩溃原因:由于MUGEN的人物缓存机制导致内存不断累加,在占用达到1.5G-2G时极易发生崩溃
解决办法:
1.修改PlayerCache为0(最小化缓存机制的效果)
2.打入4G补丁(增大内存最高临界点)
3.修改UnloadSystem为1(在任何可行的情况下释放画面包占用的内存)
4.多插入小人物对战(释放内存)
4G补丁对于所有版本的MUGEN主程序都有一定的效果
下载地址:/s/1o7Q73T4


外探究:WinMUGEN
Win的SFF崩溃也可以通过修改上述办法来解决,Win的内存最高临界点为1.5G
解决疑问:为什么Hige在Win版运行仅占用400M的内存,而在1.X中占用900M的内存?
在1.X中,MUGEN首次支持了OpenGL,OpenGL的支持最大的意义在于显示24/32位图像
但Hige是一个纯8位人物,所以用OpenGL来显示8位图像就没有DirectX和System更加高效
假如你没有24/32位需求,我推荐你1.1主程序渲染模式设置为DirectX或者System,前者更好,Depth设置为16,那么运行Hige的时候内存就和Win差不多了,不过宽屏对于内存的影响不是很大,不必修改
此外,在1.X中使用V1.0的SFF已经不被推荐,1.0建议使用V2.00的SFF,1.1建议使用V2.01的SFF,那么效果比V1.0好很多

你,确定要这么做吗?