※ 引述《iotohy (随身听)》之铭言:
: 我的系统是win7 64 bit 旗舰版 + 8G memory
: 游戏是实况野球大联盟3,不过我想实况野球系列都应该有这问题,
: 遇到这个问题我爬了很多文, 还是没法解决,
: 不过我有发现几个有帮助的现象,能让我避掉out of memory.
: 1.
: 使用0.97到最新的1.3.1试过任何设定都会出现out of memory,
: 0.96则是黑画面,0.97是最稳的
这代表新版本PCSX2的修正或运算法,是不适合你所玩的游戏。
: 2.
: 用资源监视器观察pcsx2主程式内存的变化,
: 会发现很快的增大,一开始是200MB左右,当增大到1.4G~1.6G时
: 就会出现out of memory或pcsx2程式当机,
: 即使你可用内存还很充足,也是会当(后来我加到16G,一样out of memory)
因为那是游戏本身与模拟器相容性的问题。
: 3.pcsx2当增大到1.4~1.6G时,做即时存取或读取会出现分配内存失败的错误讯息,
: 如果用1.2.1版会很容易搞烂即时存盘,0.97也是会但比较不会弄坏存盘
Save state实际上会把所有目前使用的内存区块作备份。
所以存盘会坏掉很正常。
: 4.正常不会out of memory的游戏,不会有内存增大现象,
: 会定期释放内存,保持在200~300MB左右
因为正常的游戏不会让PCSX2出现Memory leak。
: 避掉方法:
: 开资源监视器观察,如果pcsx2占用到达1.2G差不多就要out of memory的时候,
: 这时你可以重新设定图型插件(不用改值,只要确认OK就好),或是关掉重开pcsx2,
: 他会reset memory到占用200MB的状态,平均约每打一场就要做一次这个动作...XD
: 感觉问题应该不难解,因为内存占用莫名增大的现象是可稳定复制并观察,
: 而且就算抓不到原因,只要挂个watch dog侦测到这现象,做reset的动作就可避掉.
: 目前不知有没有人有更好的解决方式?
简单的说,若PCSX2会出现out of memoery的问题。
有99%几乎都是游戏本身的相容性有问题。
大部份都是因为这些特定游戏,在PCSX2模拟器的运算中会让EE或GS算出来的数值溢位,
结果就是导致memory leak,内存被占著不放、愈吃愈多。
最后就整个PCSX2 Crash掉。
至于少部份的PCSX2版本之间,对特定游戏的相容性有差异,
甚至旧版的相容性还比新版好。
则是因为PCSX2的EE与GS的算法,在0.9.6、0.9.7、0.9.8及之后的1.0版之间,
都有好几次大幅的变动。
例如0.9.8与0.9.6关于VU的程式码的部份,几乎整个被重新改写过。
所以会出现这样的情况也很非常正常的事。 :)
然而out of memory解决方法无他,
只能将会出错的游戏以及log回报给PCSX2开发群。
并不抱期待的等待开发者修正。
注1:
EE: Emotion Engine
PS2的CPU。
注2:
GS: Graphics Synthesizer
PS2的GPU。
注3:
micro VU: 由cottonvibes为首所开发的动态编译器(dynamic recompiler),
用来取代旧的super VU。
这项工作的目的,是由于PS2机器本身的指令,对电脑来说无法理解也无法直接沟通。
所以需要有直译器(interpreter),将PS2原始的指令码转换成电脑主机可以执行的代码。
但直译器的功能很简单,就是一个口令,一个动作的方式在运作著。
只不过若依照原始主机的指令,一个接着一个,将指令慢慢拆解成电脑可以执行的指令码
这样子做的效率很差且速度太慢。
所以动态编译器的方式,改善了直译器的缺点。
它会预先将一大堆PS2原生的指令转译成电脑可以执行的代码,并储存在内存之中,
当实际游戏运作的时候,当某个指令要被要被执行的当下,
模拟器就会预先读取原本储存在内存中的转译后的代码,并且执行它。
好处是这样做只要翻译一次就好,大幅提高效率。
坏处则就像不同国家的语言之间的翻译那样,信、雅、达很难完美。
当遇到有被模拟者(PS2)的指令与模拟者(电脑)的指令之间有落差,
那动态编译器的方式将有可能会放大这样的问题,
结果就是某几款游戏会有相容性的问题出现。
而Cottenvibes的贡献(Micro VU),就是将EE其中的一部分,或者可以说是VU的部分,
整个将代码改写成适合平行处理及管线化的方式。
最后才诞生了MTVU,让VU0与VU1跑不同的执行绪。
注4:
由于动态编译器的效率及优点,
通常几乎所有近代主机的模拟器,都存在着动态编译器的部份。