上古卷轴5:天际中老是有闪退跳出的问题让玩家很困惑,其实是有方法可以避免的,下面小编就来给大家介绍一下上古卷轴5闪退跳出的解决办法,希望能帮助各位玩家!
解决办法:
1.首先,要开启papyrus的log记录功能,否则你的老滚不会生成日志文件。
上面红色箭头表示文件目录以及文件叫什么。
下面紫色箭头和框体表示:找到[papyrus](若没有,则在底部新建一个),然后寻找框体内的三个参数(若没有,在papyrus下新建),然后把它们三个改成1)
如果你使用的是MO,你起效果的skyrim.ini在这个目录:ModOrganizer\profiles\你的配置文件
2.找到你的日志文件
当你做完第一步之后,无论你的游戏过程是否ctd,是否bug,只要你进入了游戏,就会生成日志文件。
文件在这个位置:Users\你的用户名\Documents(这玩意是我的文档)\MyGames\Skyrim\Logs
同一时间,最多记录4个log文件。最近一次游戏的日志是Papyrus.0.log,上一次的是1,再上一次是2,最多到3,每一次是指你开启tesv.exe,到tesv.exe结束。
分析log的基础就是让log存在,上面的步骤是让log存在的教程。
下面开始讲一讲如何分析
3.根据LOG内容出现的时间,我把LOG内容分为三种。
运行游戏,读档,出现的LOG:这个所谓的档,最好是在吸烟室,并且保证吸烟室只有你自己,没有其他NPC,尸体,以及多余的物品。这部分LOG内容中的ERROR,建议大家弄懂它们的意思。如果明确知道这些error是无所谓的,或者有所谓,但是你可以无视它,那么就可以不解决,放着它。如果明确知道它会造成未来的某个严重问题,建议立即解决。
游戏过程中,不会引起CTD的LOG:这些log多造成逻辑问题。比如一个给冰怨灵绑定摇尾巴动作的函数找不到object,只会造成冰怨灵没摇尾巴,而不能ctd。这些error也是一样,如果你觉得它无所谓,那么不解决也是可以的。
引起CTD的LOG:这些error出现在papyrus0.log的后部,也就是你发生CTD时间戳的地方。在这里必须多说几句,ctd的原因有三种:文件缺失或者错误,当前游戏环境超过你的计算机处理能力,脚本严重错误。而你ctd之后查看log,ctd时间戳上的脚本错误,不一定是这次ctd的罪魁祸首,因为还可能是第二种原因引起的ctd....分辨的方法就是多次试验,100%跳的就是脚本原因。如果知道是脚本原因了,就要排查这个错误。时刻记住,找到发生错误的mod,就卸掉它,这是不可取的,至于原因,我后面会说,当然也可能忘掉了....
warning:警告。如果你不蛋疼,警告可以无视,因为它任何时候都不会引起ctd。但是你分析error的时候可能会借鉴一下这些警告。关于warning的解决方法,我在以前的帖子有所介绍。
tieba.baidu.com/p/3873900066这篇帖子讲的是warning:脚本不存在某属性的解决方法。相当的基础。
补充:我们买游戏,是为了玩游戏。虽然玩游戏的动机可能有很多,但是以编程和修改游戏内容为乐趣的人并不多,绝大多数人玩游戏还是纯粹为了游戏。我也是。所以说技术和游戏要平衡好....虽然我很尊敬DK大,但是她那样研究技术会占用很多时间(她的每一个mod的每一个文件都知道作用--).....我个人不会选择这样做。每个人都有每个人的看法,你们想怎么玩,怎么做,都是你们自己的选择。
4.如果CTD了,并且你已经确定某一条error或者某一堆error是引起这次ctd的原因,那么怎么办呢?
我随便找个脚本错误的例子....
[11/02/2014-12:21:22AM]Error:(000C6984):cannotfindvariablenamedfToggleBlend.
stack:
[(000C6984)].FXSetBlendVariableScript.SetAnimationVariableFloat()-""Line?
[(000C6984)].FXSetBlendVariableScript.OnLoad()-"FXSetBlendVariableScript.psc"Line38
[11/02/2014-12:21:22AM]:时间戳,你可以通过ctd发生的时间找到对应的脚本错误区域。一般引起ctd的error就是ctd时间戳,也就是最后的那个时间点上的错误。有时候也和稍微靠前的error有关。
Error:(000C6984):cannotfindvariablenamedfToggleBlend.:错误,括号里如果不是00或者uskp,smpc的序号,那么可以明确知道是哪个mod出现的错误。如果是00或者uskp,smpc的错误,就比较蛋疼,你不知道哪个mod出问题了。就算你知道哪个mod出问题,直接删掉是完全不可取的,因为删mod会坏档呀,好吧也可以用savetool或者pdt清一下存档,但是不一定能完全清理干净....后面是说究竟发生什么错误了,比如不能找到object,object的类型不对呀等等等.....
[(000C6984)]:这是发生错误的referenceID。关于referenceID的相关知识,我在后面会讲一下。
FXSetBlendVariableScript:这是发生错误的脚本。在data/scripts(或者某bsa下)一定会有一个同名的PEX文件,开源的mod或者原版(要安装ck),会有psc源码文件。
SetAnimationVariableFloat():这是发生错误的函数指令。这个函数可以是native类型(也就是不需要在psc中中定义的函数,这些函数是游戏本身就识别的),也可以是psc内定义的新函数,也可以是skse扩展的函数。
""Line?:这是被编译的psc内,发生错误的函数的行数。注意,反编译之后的psc不能用这个行数找到函数。
OnLoad()-"FXSetBlendVariableScript.psc"Line38:这里,分别是发生错误的event,以及发生错误的文件,以及event所在的行数。所谓事件,就是告诉游戏什么时候执行事件下面的语句。
5.分析和解决思路
首先分两个路径,都要去做。一个是脚本,一个是入口。
第一路径,通过psc文件的指示,去寻找起作用的那个psc文件。
要知道,如果原版有A.psc文件,uskp也有A.psc文件,Xmod也有A.psc文件,那么起作用的一定是Xmod的。怎么才会起作用呢?排在相对后面,并且入口中要挂载这个脚本文件。
找到psc文件之后,打开看,看懂它在做什么。
看的第一遍,看一下每个event和function下的主要函数指令都在做什么。
看的第二遍,针对出错的位置,进行分析。
这需要papyrus语言的知识,我已经说过了。
如果没有psc文件,那就只能找到pex文件,然后用TESVTranslator反编译。这个软件绝大多数时候是用来做汉化的。我这种懒比肯定不会去做汉化的。
方法:首先打开软件,然后点击文件,loadpapyrusPEX,然后在下面的pexdata下就会有反编译的脚本内容。
如果是一个20行以内的小脚本,用这个方法还稍微可以。但是1200行的脚本,就算你看懂,想修改也需要重写成正常的papyrus语法,否则无法通过ck编译。
第二路径:根据出错的referenceID,寻找出错的入口。
需要注意的是,referenceID是baseID实例化之后的id,在ck和edit下可能会找不到。
什么时候能找到?这个reference在文件制作的时候就已经被实例化了,例如所有有名字的npc,放在某箱子里的钥匙等等。还有就是这个东西不需要实例化。
什么时候找不到?这个reference是在游戏过程中实例化的。例如无名字的龙。
那么对于找不到入口的referenceID怎么办呢?
打开savetool最新版本,搜索这个ID,可能会找到这个reference的相关信息,你可以通过这些信息推断出它是什么入口实例化的。你还可以通过直接搜索出错的脚本,在所得的信息中推断入口是什么。
不过有些时候依然找不到入口,为什么呢?
因为实例化这个过程,在你上次存档到这次ctd之间......那就只能gg了。
知道脚本内容和出错入口,大概就可以知道mod这个部分究竟在做什么。
知道这些信息,如何解决呢?
你要通过这些信息去想,为什么这个脚本会出错?
然后针对原因,进行入口的修改/脚本的修改并且重新编译。之后再处理存档(一般来说是删掉出错脚本的相关内容,或者修改其中的value)。
我说这么少的内容,是有原因的。因为错误有无数个,每个错误的解决方法都不一样,我怎么写呢?
6.bug
bug区别于ctd,它不会引起闪退,你的游戏还可以继续。
不过bug也分为良性bug和恶性bug。
良性bug只是类似武器架E不动了,冰怨灵卡着不动了等等.....这些bug你能忍的话就不需要去解决。
恶性bug会让你的游戏无法继续,例如某任务卡住,某音乐播放不停止。
解决bug的思路和ctd差不多。只是把ctd时间戳改成bug嘛。
不过建议尝试看log之前,先读靠前的存档,多次试验,如果bug没了,就不用累死累活了....
7.log的局限性
很多时候,log给出的信息,只是xxx不能xxx,因为xxx不能作用在一个noneobject上.....
none是啥?
为啥那玩意变成none了?
这些log都不会给出。你需要自己分析,这个难度非常大....甚至modder都不一定能分析出来....毕竟游戏底层的东西只有b社员工知道。
所以嘛,错误能避免尽量避免。说到底,还是一个mod使用习惯好坏的问题。