上古卷軸5 Papyrus的LOG日誌分析,科學解決ctd,bug的方法

更新日期:2016-06-15 16:00:04 來源:網絡蒐集 編輯:快猴網-孫猴子
1.(起手裝x)上古卷軸5本身是一個B社的一個魔幻RPG沙盒遊戲,原版就那樣,你們都知道的。但是B社給出了CK這個工具,我們可以修改它,讓它變成我們希望的樣子。TESV是一個程序,CK是一個開發者工具,做MOD的過程也就是開發(修改)一個程序(的一部分)的過程。我一直把做mod放在編程範疇,所以我有覺悟。我在修改程序,所以任何錯誤都是可能發生的,所以我必須付出一定時間來調試和解決錯誤。爲什麼說這些呢?因爲就怕這個觀點—上古卷軸5只是一個遊戲,我玩個遊戲還學編程?你一旦有這個觀點,就懶得去弄一些東西了,遇到問題也沒辦法解決了,畢竟你什麼都不會,我跟你解釋變量null,數組溢出…之類的名詞,你也聽不懂,對吧。so,這個覺悟還是比較重要的。
2.如果你玩2分鐘,LOG就刷出了500K以上,我只能說,你的存檔已經毀的差不多了,或者mod衝突非常嚴重。那麼多的error,夠你當小說看了,還分析個球。
3.如果你很隨便,喜歡玩mod就裝,不喜歡就卸掉,或者不喜歡看mod說明,檢查兼容性等等…那麼你的老滾之路會非常艱難。
4.看這篇帖子需要兩部分能力,一個正常電腦使用者的IQ,以及papyrus語言的語法知識(不需要你知道太多的函數和事件的意義,這可以去ck官網查)

=================================================================
好了廢話說這些。下面開始吧。
1.首先,要開啓papyrus的log記錄功能,否則你的老滾不會生成日誌文件。
方法:
在這裏插入圖片描述
上面紅色箭頭表示文件目錄以及文件叫什麼。
下面紫色箭頭和框體表示:找到[papyrus](若沒有,則在底部新建一個),然後尋找框體內的三個參數(若沒有,在papyrus下新建),然後把它們三個改成1)
如果你使用的是MO,你起效果的skyrim.ini在這個目錄:ModOrganizer\profiles\你的配置文件
本部分end
2.找到你的日誌文件
當你做完第一步之後,無論你的遊戲過程是否ctd,是否bug,只要你進入了遊戲,就會生成日誌文件。
文件在這個位置:Users\你的用戶名\Documents(這玩意是我的文檔)\My Games\Skyrim\Logs
同一時間,最多記錄4個log文件。最近一次遊戲的日誌是Papyrus.0.log,上一次的是1,再上一次是2,最多到3,每一次是指你開啓tesv.exe,到tesv.exe結束。

==============================================================
分析log的基礎就是讓log存在,上面的步驟是讓log存在的教程。
下面開始講一講如何分析。

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): cannot find variable named fToggleBlend.
stack:
[ (000C6984)].FXSetBlendVariableScript.SetAnimationVariableFloat() - “” Line ?
[ (000C6984)].FXSetBlendVariableScript.OnLoad() - “FXSetBlendVariableScript.psc” Line 38
[11/02/2014 - 12:21:22AM]:時間戳,你可以通過ctd發生的時間找到對應的腳本錯誤區域。一般引起ctd的error就是ctd時間戳,也就是最後的那個時間點上的錯誤。有時候也和稍微靠前的error有關。
Error: (000C6984): cannot find variable named fToggleBlend.:錯誤,括號裏如果不是00或者uskp,smpc的序號,那麼可以明確知道是哪個mod出現的錯誤。如果是00或者uskp,smpc的錯誤,就比較蛋疼,你不知道哪個mod出問題了。就算你知道哪個mod出問題,直接刪掉是完全不可取的,因爲刪mod會壞檔呀,好吧也可以用savetool或者pdt清一下存檔,但是不一定能完全清理乾淨…後面是說究竟發生什麼錯誤了,比如不能找到object,object的類型不對呀等等等…
[ (000C6984)]:這是發生錯誤的reference ID。關於reference ID的相關知識,我在後面會講一下。
FXSetBlendVariableScript:這是發生錯誤的腳本。在data/scripts(或者某bsa下)一定會有一個同名的PEX文件,開源的mod或者原版(要安裝ck),會有psc源碼文件。
SetAnimationVariableFloat() :這是發生錯誤的函數指令。這個函數可以是native類型(也就是不需要在psc中中定義的函數,這些函數是遊戲本身就識別的),也可以是psc內定義的新函數,也可以是skse擴展的函數。
“” Line ?:這是被編譯的psc內,發生錯誤的函數的行數。注意,反編譯之後的psc不能用這個行數 找到函數。

OnLoad() - “FXSetBlendVariableScript.psc” Line 38:這裏,分別是發生錯誤的event,以及發生錯誤的文件,以及event所在的行數。所謂事件,就是告訴遊戲什麼時候執行事件下面的語句。event 妹子表白(妹子 我) if 妹子萌萌噠 ,我.setgirlfriend(妹子) 隨便寫一段腳本就知道event是是什麼意思咯。當然這些大白話是不能通過編譯的…別鬧…

5.分析和解決思路
首先分兩個路徑,都要去做。一個是腳本,一個是入口。
第一路徑,通過psc文件的指示,去尋找起作用的那個psc文件。
要知道,如果原版有A.psc文件,uskp也有A.psc文件,Xmod也有A.psc文件,那麼起作用的一定是Xmod的。怎麼纔會起作用呢?排在相對後面,並且入口中要掛載這個腳本文件。
找到psc文件之後,打開看,看懂它在做什麼。
看的第一遍,看一下每個event和function下的主要函數指令都在做什麼。
看的第二遍,針對出錯的位置,進行分析。
這需要papyrus語言的知識,我已經說過了。
如果沒有psc文件,那就只能找到pex文件,然後用TESVTranslator反編譯。這個軟件絕大多數時候是用來做漢化的。我這種懶比肯定不會去做漢化的。
方法:首先打開軟件,然後點擊文件,load papyrusPEX,然後在下面的pexdata下就會有反編譯的腳本內容。
在這裏插入圖片描述

如果是一個20行以內的小腳本,用這個方法還稍微可以。但是1200行的腳本,就算你看懂,想修改也需要重寫成正常的papyrus語法,否則無法通過ck編譯。
第二路徑:根據出錯的reference ID,尋找出錯的入口。
需要注意的是,reference ID是base ID實例化之後的id,在ck和edit下可能會找不到。
什麼時候能找到?這個reference在文件製作的時候就已經被實例化了,例如所有有名字的npc,放在某箱子裏的鑰匙等等。還有就是這個東西不需要實例化。
什麼時候找不到?這個reference是在遊戲過程中實例化的。例如無名字的龍。
那麼對於找不到入口的reference ID怎麼辦呢?
打開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不能作用在一個none object上…
none是啥?
爲啥那玩意變成none了?
這些log都不會給出。你需要自己分析,這個難度非常大…甚至modder都不一定能分析出來…畢竟遊戲底層的東西只有b社員工知道。
所以嘛,錯誤能避免儘量避免。說到底,還是一個mod使用習慣好壞的問題。

8.最後
我可以幫大家看一些log。先說好,不一定能看懂。我的能力也是有限的。
讓我看log需要滿足以下條件,當然,這也是爲了你能解決問題。
1.把papyrus.log上傳百度雲,把地址給我。
2.你在ctd之前,在做什麼。大概就是說,你要講明白,你怎麼玩着就ctd了。
3.多次試驗的結果。千萬別拿概率性ctd來逗我。因爲什麼樣的error會ctd,我也不知道。
4.你的modlist拿出來,必須保證排序正確。
5.你的貼吧至少5級。我要確定你不是伸手*。可能你問個問題只需要10分鐘,但我給你看腳本需要幾個小時,你問完就跑了,我怎麼感覺我像個sb一樣?
6.態度不能太惡劣。
7.我不能解決的話不能噴我
8.哦對,不能卸載過mod。如果卸載過,請指出卸載的mod是什麼,是否帶腳本。如果不能給出這兩點信息,或者卸的太多了…那抱歉…

好吧…寫技術貼是很累的,大概就寫這麼多吧。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章