十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
[WARNING] 本篇適用于Minecraft服務(wù)端/客戶端報(bào)錯(cuò)的診斷分析,其他游戲除外,比如網(wǎng)易
你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站建設(shè)、成都手機(jī)網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、成都品牌網(wǎng)站建設(shè)、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺設(shè)計(jì)專才。
[WARNING] 本篇適用于Minecraft服務(wù)端/客戶端報(bào)錯(cuò)的診斷分析,其他游戲除外,比如網(wǎng)易
[WARNING] 本篇適用于Minecraft服務(wù)端/客戶端報(bào)錯(cuò)的診斷分析,其他游戲除外,比如網(wǎng)易
我所說的報(bào)錯(cuò),指的是一款名為《Minecraft》的游戲中的報(bào)錯(cuò)。并不是《我的世界》的報(bào)錯(cuò)
在大家游玩Minecraft時(shí),有時(shí)需要裝一些Forge模組以此來提高可玩度,但自己配置模組包的時(shí)候,總會(huì)造成游戲崩潰,并且大多數(shù)人還看不懂崩潰報(bào)告更有甚者連崩潰報(bào)告輸出目錄都不知道在哪,于是本篇教程應(yīng)運(yùn)而生。
一些俏皮話
Minecraft這個(gè)游戲,各種BUG和解決方案如果寫成一堆不重復(fù)的書,摞起來的厚度可以比姚明還高。
所以這個(gè)游戲不是一般的神奇,尤其是當(dāng)你在看崩潰報(bào)告的時(shí),你更會(huì)體驗(yàn)到這一點(diǎn)。
你不加模組,MC也會(huì)崩潰,加了還是崩潰。這是一個(gè)比較罕見的情況。
大多數(shù)情況是你一股腦加了一堆模組,然后突然蹦了,就不知道怎么辦了。
幸運(yùn)的是,這時(shí)候,你有60%的概率可以找到問題所在并解決這個(gè)問題。
尋找崩潰日志
首先,你得知道你的客戶端/服務(wù)端目錄
客戶端的CrashReport文件夾目錄:(.minecraft\crash-reports)
如果你啟用了版本隔離,那就在(.minecraft\versions\xxxx\crash-reports)
服務(wù)端的CrashReport在你的服務(wù)端根目錄下。
這個(gè)條件的前提是你的服務(wù)端是人類已知的服務(wù)端,而不是外星人制造的服務(wù)端。
打開崩潰日志
接下來我們對(duì)報(bào)錯(cuò)的分析,均以一個(gè)Minecraft 1.12.2 Forge服務(wù)端為例
嗯,我們可以看到,crashreport目錄下的所有文件都是以
crash-日期_具體時(shí)間-server.txt命名的
如果是客戶端的崩潰報(bào)告日志,后面的server則是client。
然后我們找到一個(gè)最新的日志打開并分析。
告訴你怎么瞬間找到最新崩潰日志,
直接點(diǎn)擊這個(gè)按鈕就完事了。然后會(huì)按照?qǐng)?bào)告的生成時(shí)間進(jìn)行排列。
重要的事說三遍
接下來我們對(duì)報(bào)錯(cuò)的分析,均以一個(gè)Minecraft 1.12.2 Forge服務(wù)端為例
接下來我們對(duì)報(bào)錯(cuò)的分析,均以一個(gè)Minecraft 1.12.2 Forge服務(wù)端為例
接下來我們對(duì)報(bào)錯(cuò)的分析,均以一個(gè)Minecraft 1.12.2 Forge服務(wù)端為例
下載文本編輯器
首先你需要一個(gè)文本編輯器來查看崩潰報(bào)告,
這里我推薦微軟官方的Visaul Code: 點(diǎn)我下載.
然后我們就可以愉快地打開報(bào)告進(jìn)行查看了。
開始分析
好了,我們說了這么多廢話,是時(shí)候開始正式的分析了。
我估計(jì)前面的事大多數(shù)人已經(jīng)做完了,就等著我講這個(gè)。
廢話不多說,開始。
打開后我們首先看到的是這個(gè)
其中,WARNING coremods are present:xxxxx 是廢話,你根本不用管。
產(chǎn)生這種警告是因?yàn)橛械淖髡邉?dòng)了Minecraft底層的代碼,然后Forge為了方便,給你整出來了。
在99.9999999%的情況下,coremods在理論上不會(huì)造成崩潰。所以你可以忽略這些。
再往下看。
我們先引出幾個(gè)重要概念,當(dāng)然你不用理解。
你會(huì)發(fā)現(xiàn)這些報(bào)錯(cuò)里都會(huì)有一大堆的文字:
at net.xxxxx
at org.xxxxxxxx
at com.xxxxxx
at java.lang.xxxx
這些有專門的術(shù)語,叫做棧幀(stacktrace)。
CPU寄存器的空間是極其有限的,因此方法的調(diào)用需要在棧上開辟空間,每調(diào)用一個(gè)方法就會(huì)生成一個(gè)棧幀,因此崩潰報(bào)告里的一堆a(bǔ)t at
at所代表的一系列棧幀,某種意義上是一條調(diào)用鏈,最后被調(diào)用的方法(也就是爆出異常的方法)會(huì)被崩潰報(bào)告放在最上面
我們可以看見,頂上有
這3行東西,
第一行是廢話,你可以不用管。
第二行這個(gè)報(bào)告中最后一個(gè)棧幀拋出異常的時(shí)間。
第三行是這個(gè)報(bào)錯(cuò)的描述,也就是人類可讀的大白話形式。
從這開始,下面的句子都不是人類可讀形式,當(dāng)然。相比原版的報(bào)錯(cuò)來說,F(xiàn)orge的報(bào)錯(cuò)非常非常人性化了。
我們可以從第三行看到,這個(gè)崩潰報(bào)告的描述是 Ticking player。
player代表球員 玩家,也就是說這個(gè)報(bào)錯(cuò)跟玩家有關(guān)系。
Tciking指的是刻,這個(gè)以后再說。
然后我們?cè)賮砜聪旅娴膱?bào)錯(cuò)
這個(gè)報(bào)錯(cuò)片段中。
第一行是錯(cuò)誤類型
我們可以看到,這個(gè)報(bào)錯(cuò)的錯(cuò)誤類型是
java.lang.IndexOutOfBoundsException
如果你開過Minecraft群組服務(wù)器,或者學(xué)過java。你可以知道
這個(gè)叫做數(shù)組下標(biāo)越界異常,是一個(gè)在Minecraft中非常常見的異常。
我們不用去管這個(gè)具體是什么,直接往下看。
下面那些一大堆棧幀的排列,并非沒有順序。
這些棧幀的排列方式,是由它們拋出異常的順序決定的。
聽不懂?我們看圖
紅色箭頭指的棧幀,是第一個(gè)拋出異常的棧幀。
然后黃色箭頭的棧幀,是最后一個(gè)拋出異常的棧幀。
現(xiàn)在你懂了棧幀的排列順序了吧。
最前面的棧幀就是最后一個(gè)拋出錯(cuò)誤的位置,也就是說大多數(shù)情況我們是從這里下手。
或者從第一個(gè)棧幀的后面幾個(gè)棧幀下手。
好,我們繼續(xù)看。
現(xiàn)在我們遇到的是指數(shù)組下標(biāo)越界異常。
例如:一個(gè)ArrayList數(shù)組中沒有元素,而你想獲取第一個(gè)元素,運(yùn)行是就會(huì)報(bào)此類型的錯(cuò)誤。
聽不懂?我們看報(bào)錯(cuò)!
看看,最后棧幀拋出的異常,就是ArrayList在獲取元素的時(shí)候沒找到。
當(dāng)然你不用在意這個(gè),繼續(xù)往下看。
這里已經(jīng)出現(xiàn)了產(chǎn)生這個(gè)崩潰的模組名字。
這個(gè)模組叫做:slashblade,也就是大家經(jīng)常玩的拔刀劍。
然后你發(fā)現(xiàn),這些棧幀的形式都是
at xxx.xxxxxxx.xxxxxx.xxxxxxxx.xxxxxxx.xxxxxx(xxxx.java:xxxx)
如果你以壓縮包形式打開拔刀劍模組JAR文件,
你會(huì)發(fā)現(xiàn)一件事。
那就是這些棧幀其實(shí)就是這個(gè)JAR壓縮包的內(nèi)部目錄結(jié)構(gòu)?。。。?!
就比如這條棧幀
at mods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310)
我們可以把所有的" . “去掉,改成” / 或者 \ "
這樣就是一個(gè)文件目錄了??!
at mods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get(ItemSlashBlade.java:310)
相當(dāng)于
at mods\flammpfeil\slashblade\item\itemSlashBlade
而這段藍(lán)色的,ComboSequence.get,指的是這個(gè)棧幀中拋出異常的方法。并不是文件目錄。
括號(hào)里的ItemSlashBlade.java:310指的是,
這個(gè)異常發(fā)生在
ItemSlashBlade.java這個(gè)文件夾中的第310行。
是不是突然明白一大堆東西?。。。。。。。?!
下面的圖就是我用壓縮包形式打開拔刀劍模組文件后,
把棧幀轉(zhuǎn)換成目錄,就找到了拋出異常的文件路徑。
深度分析
好了,那么我們接下來進(jìn)行硬核(Hardcore)分析吧
上面我們已經(jīng)找到了這個(gè)崩潰中有拔刀劍的信息
那么我們就進(jìn)一步分析。
我們知道,拔刀劍有幾個(gè)棧幀拋出了異常,那么我們以最后一個(gè)拋出異常的棧幀進(jìn)行分析。
amods.flammpfeil.slashblade.item.ItemSlashBlade$ComboSequence.get
從這段信息中我們得知,這個(gè)拋出異常的方法在ComboSequence.Get中
ComboSequence翻譯過來就是組合技,然后我們進(jìn)一步分析
既然這個(gè)崩潰出在了拔刀劍的組合技上,那也就是說。
我的服務(wù)器崩潰是因?yàn)?,有某個(gè)人用了拔刀的組合技,然后不知道觸發(fā)了什么BUG。服務(wù)器就因此崩潰了。
很好,如果你能分析到這一步,那就快接近真相了!
上 代 碼
我們首先登陸Github(世界上最大的代碼托管站)
然后找到拔刀劍的開源代碼倉庫,并依次進(jìn)入目錄
src/main/java/mods/flammpfeil/slashblade/item/ItemSlashBlade.java
然后這個(gè)就是拋出異常的原代碼了。
然后搜索方法 ComboSequence.get
//報(bào)錯(cuò)產(chǎn)生的位置
public static ComboSequence getComboSequence(NBTTagCompound tag){
return ComboSequence.get(tag.getInt(comboSeqStr));
}
很好,你可能看見一個(gè)熟悉的詞匯,叫做NBT
我們引用一段百度百科上的話
二進(jìn)制命名標(biāo)簽(Name Binary Tag),NBT格式為Minecraft中用于向文件中存儲(chǔ)數(shù)據(jù)的一種存儲(chǔ)格式。NBT格式以樹形結(jié)構(gòu)并配以許多標(biāo)簽的形式存儲(chǔ)數(shù)據(jù)
既然如此,我們就可以知道
這個(gè)報(bào)錯(cuò)的產(chǎn)生和NBT標(biāo)簽有關(guān)系,然后我們只需要看見tag這個(gè)詞即可。
這就代表,這個(gè)異常的產(chǎn)生是因?yàn)樵讷@取組合技的NBT數(shù)據(jù)時(shí)產(chǎn)生異常,在結(jié)合最后一個(gè)拋出的異常
也就是數(shù)組下標(biāo)越界異常
我們就可以推導(dǎo)出這個(gè)異常的產(chǎn)生了。
一個(gè)玩家在使用拔刀的組合技時(shí),然后這個(gè)組合技因?yàn)槟撤N原因無法使用,也就是ArrayList數(shù)組元素為空,導(dǎo)致拋出數(shù)組下標(biāo)越界異常,引發(fā)Minecraft服務(wù)器保護(hù)機(jī)制然后自動(dòng)關(guān)服。并產(chǎn)生這個(gè)報(bào)錯(cuò)。
好了,我們繼續(xù)看下面的棧幀。
對(duì)于下面的棧幀來說,上面的棧幀全是主要原因。也就是說下面的棧幀都是廢話
不過我還是貼出來讓你了解一下。
很好,接下來我們看紅圈內(nèi)的棧幀。
其中所有 net.minecraftforge.fml.xxxx的棧幀,基本上沒什么有價(jià)值的信息。
我們繼續(xù)看下面 net.minecraft.xxxx的棧幀,我們可以看到關(guān)鍵詞匯那就是entity。
得出結(jié)論
Entity就是實(shí)體的意思,也就是說這個(gè)東西出現(xiàn)在玩家使用組合技與實(shí)體進(jìn)行交互時(shí)才發(fā)生的數(shù)組下標(biāo)躍境異常
我們繼續(xù)看
這2段代表了有關(guān)玩家的信息,意義不大。
我們?cè)谶@些棧幀中可以看到有network和server單詞。
這代表這些棧幀與網(wǎng)絡(luò)和服務(wù)端關(guān)西了。
這段也是意義不大,而且與拔刀劍產(chǎn)生的報(bào)錯(cuò)無關(guān),我們繼續(xù)看。
這段才是好戲,我們可以看到一個(gè)詞組叫playerLoggedOut,這個(gè)代表玩家登出服務(wù)器。
也就是玩家掉線
然后我們結(jié)合這些堆棧拋出異常的順序。
我們就可以得知一個(gè)大概順序。
玩家使用組合技后,首先從掉線
然后服務(wù)端發(fā)現(xiàn)異常
然后服務(wù)端整理崩潰后就關(guān)閉服務(wù)器了。
很好,我們對(duì)錯(cuò)誤的分析已經(jīng)結(jié)束了。
接下來我們繼續(xù)往下看!
完成看崩潰報(bào)告的棧幀并得出結(jié)論~
修復(fù)報(bào)錯(cuò)
這是下面的內(nèi)容。
我們可以看到大大的Head (頭部)字樣
然后Thread(線程): Server thread(主線程)
我們可以得到一個(gè)信息
那就是說,這些棧幀拋出錯(cuò)誤是在服務(wù)器主線程上拋出的,所以才會(huì)導(dǎo)致服務(wù)器自我保護(hù)機(jī)制開啟并關(guān)閉服務(wù)器。
我們繼續(xù)往下看。
我們可以看見大大的 Player being ticked
這段代表有關(guān)出錯(cuò)實(shí)體的名字。
然后既然出現(xiàn)了Player,代表這個(gè)實(shí)體是玩家。
也就代表,這個(gè)是出錯(cuò)的實(shí)體是玩家。因?yàn)槟莻€(gè)錯(cuò)誤拔刀劍在玩家手上。所以出錯(cuò)實(shí)體是玩家。
然后
Entity Type是實(shí)體類型,Entity ID是實(shí)體的ID,Name就不用解釋了,是實(shí)體名。
因?yàn)檫@個(gè)實(shí)體是玩家,所以實(shí)體名就是玩家名。
需要重新配置下jdk。
如:jdk安裝在“D:\Program Files\java\jdk1.6.0_10”。
新建“java_home”值,輸入“D:\Program Files\java\jdk1.6.0_10”。
新建“classpath”值,輸入“.;%java_home%\lib”。
在path中增加“%java_home%\bin”。
備注:配置環(huán)境變量在“計(jì)算機(jī)”右擊“屬性”,之后選擇“高級(jí)環(huán)境變量”,在選擇“環(huán)境變量”即可。
Java版
Minecraft的原始平臺(tái),在Windows、Mac OS X和Linux上運(yùn)行,通過啟動(dòng)器啟動(dòng)。游戲最初以“早期個(gè)人單機(jī)alpha”的名稱發(fā)布,經(jīng)歷了許多開發(fā)階段(Classic、Indev、Infdev、Alpha、Beta)。Java版Minecraft沒有資源中心。
基巖版
基巖版是由Mojang AB、Xbox游戲工作室、4J Studios和SkyBox Labs開發(fā)的多平臺(tái)版本的Minecraft?;鶐r版的平臺(tái)包括所有移動(dòng)平臺(tái)、Windows 10版、Xbox One版、任天堂Switch版、Gear VR版和Fire TV版。
原主機(jī)版
原主機(jī)版是適用于主機(jī)版本的Minecraft,已經(jīng)終止更新。
任天堂3DS版
New Nintendo3DS版的多人聯(lián)機(jī)僅限于本地游玩。
是內(nèi)部異常,Java的語言為無效的斷點(diǎn)分配的異常情況。
如果單人游戲沒事,那就是網(wǎng)絡(luò)問題和他的服務(wù)器和你隔太遠(yuǎn)連接不穩(wěn)定,解決方法掛個(gè)網(wǎng)易u(yù)u加速器,然后搜索我的世界,點(diǎn)加速(免費(fèi)的,不限與網(wǎng)易的mc,任何服務(wù)器都可以,不要點(diǎn)開始游戲就行),如果不行的話就是他那邊服務(wù)器不穩(wěn)了。
還有一種情況就是一些mod和服務(wù)器排斥,包括但不限與以上,如果還是不行就應(yīng)該是一些很難排查的原因。打了那么多字,不采納也不要踩啊,是純手打零復(fù)制的。
游戲技巧:
1,側(cè)搭:
側(cè)搭在起床戰(zhàn)爭中的作用尤為明顯,玩家需要極快的反應(yīng)力和準(zhǔn)度才能實(shí)現(xiàn)這一技巧。在去偷床的路上一定有敵人會(huì)想阻止你,窄窄的道路上兩人針鋒相對(duì)時(shí),一個(gè)風(fēng)騷的跳躍側(cè)搭可以幫助你拿到最快的勝利。
主要原理是在向路途側(cè)方跳躍時(shí)快速搭建一個(gè)相連的方塊來讓自己有一個(gè)新的落腳點(diǎn)。但這其實(shí)并沒有看上去的那么簡單,對(duì)于時(shí)機(jī)的把握非常嚴(yán)格,一不小心就會(huì)掉落深淵重頭開始。
2,跳砍:
在《我的世界》中其實(shí)是存在暴擊這個(gè)定義的。玩家在自由下落時(shí)進(jìn)行攻擊是可以產(chǎn)生傷害更高的暴擊的,熟練掌握這一點(diǎn),你就可以跳起來打別人頭。
3,走位:
優(yōu)秀的走位可以幫助你躲避大部分的攻擊,wasd四個(gè)簡單的鍵卻可以組合出無數(shù)的身法技巧。一般高手使用的也都是“之”字形跑法和旋轉(zhuǎn)跳來攻擊逃跑。在逃跑時(shí)還有一個(gè)小技巧就是用F5來觀察敵人動(dòng)向,不過這一點(diǎn)對(duì)手速要求比較高。
4,CPS:
CPS就是鼠標(biāo)每秒的點(diǎn)擊速度,這個(gè)是需要長時(shí)間的練習(xí)才能有結(jié)果,當(dāng)然天賦更加重要。抖屏可以稍微提高一點(diǎn)CPS,但是不要為此而讓你的視角變得模糊不清,輕微的抖動(dòng)也只是為了讓手可以點(diǎn)擊更快。