• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 14,  comments - 57,  trackbacks - 0
              寫這篇文章是對(duì)自己2011bug戰(zhàn)斗時(shí)光一個(gè)交代,隨著時(shí)間的推移,當(dāng)初印象深刻的痛苦和壓力慢慢消逝,到現(xiàn)在甚至是需要很長(zhǎng)時(shí)間來(lái)弄清楚這中間的關(guān)系,趁著現(xiàn)在頭腦還算清楚,記錄下吧。

            場(chǎng)景管理

               為了說(shuō)明Bug產(chǎn)生的原因,先描述下場(chǎng)景管理的實(shí)現(xiàn)方式吧。

              1、游戲場(chǎng)景是游戲地圖的一個(gè)實(shí)例(假設(shè)地圖是class),一個(gè)地圖可以創(chuàng)建多個(gè)場(chǎng)景,場(chǎng)景主要負(fù)責(zé)管理玩家的移動(dòng)、廣播等處理。
              2、場(chǎng)景的廣播是采取經(jīng)典的九宮格方式來(lái)實(shí)現(xiàn)的,每一個(gè)格子的我們定義為Area對(duì)象,一個(gè)場(chǎng)景的格子組成其實(shí)是一個(gè)二維數(shù)組。
              3、玩家進(jìn)入場(chǎng)景的時(shí)候,根據(jù)坐標(biāo)可以知道要進(jìn)入哪個(gè)格子,每個(gè)格子內(nèi)會(huì)保留一個(gè)Head指針,標(biāo)記最新進(jìn)入的玩家對(duì)象。玩家對(duì)象上有2個(gè)指針,標(biāo)記玩家所在格子的前一個(gè)和后一個(gè)對(duì)象。可以通過(guò)格子內(nèi)的Head指針便利Area內(nèi)的所有玩家對(duì)象。
              4、玩家移動(dòng)切換格子的時(shí)候,先從原來(lái)的格子內(nèi)Leave,這會(huì)調(diào)用原來(lái)Area對(duì)象的Leave函數(shù)。再進(jìn)入新的格子,調(diào)用Area的Enter函數(shù)。很明顯,Leave函數(shù)就是一個(gè)鏈表刪除操作,如果玩家是Head,則設(shè)置新的Head。
               Enter操作就是將新進(jìn)入的玩家鏈接到原隊(duì)列里,新進(jìn)入的玩家會(huì)被設(shè)置為Head。

            問(wèn)題表現(xiàn)  

               根據(jù)上面的描述,如果一切按照正常程序,這個(gè)方案運(yùn)轉(zhuǎn)是沒(méi)問(wèn)題的。最初上線的時(shí)候,也沒(méi)有出現(xiàn)問(wèn)題,但是在出了一個(gè)資料片之后,服務(wù)器基本上每隔半小時(shí)左右就會(huì)發(fā)現(xiàn)有死循環(huán)或者宕機(jī)問(wèn)題。

            死循環(huán)的表現(xiàn)很明顯,就是在遍歷場(chǎng)景玩家的時(shí)候,出現(xiàn)死循環(huán)。宕機(jī)則更加復(fù)雜些,每次宕機(jī)位置不同,總的來(lái)說(shuō)大概有3-4個(gè)地方,每個(gè)地方單看都不合常理。
            直接分析上面的表現(xiàn),都找不到真正的的原因,只好擴(kuò)大搜索范圍了。
            比較倒霉的是那個(gè)資料片的主要系統(tǒng)都是我開(kāi)發(fā)的,所以自然嫌疑最大,然后大家集中精力來(lái)分析我的代碼,由于每個(gè)人風(fēng)格都不同,所以大家看的不太明白的地方都會(huì)來(lái)問(wèn)我,所以那個(gè)晚上基本就在解答設(shè)計(jì)疑問(wèn)了。
            被輪了大半個(gè)晚上,知道凌晨2點(diǎn),大家也沒(méi)分析出問(wèn)題,只好先回去睡覺(jué)了。結(jié)果早上7點(diǎn),測(cè)試給我打電話了,沒(méi)辦法只好跑過(guò)去了,一到公司,發(fā)現(xiàn)圍了一堆老大,老大們很嚴(yán)肅:這個(gè)問(wèn)題很嚴(yán)重,必須盡快解決。
            沒(méi)辦法,只好繼續(xù)上陣了,戰(zhàn)斗到下午2點(diǎn),突然靈光一閃,想到了原因,當(dāng)時(shí)感覺(jué)真的心力交瘁了,更加感慨的是其實(shí)這個(gè)問(wèn)題真和我沒(méi)啥關(guān)系。。。


            原因

               真正導(dǎo)致這次事故的其實(shí)是一個(gè)小操作:玩家重登錄(手機(jī)玩家斷網(wǎng)的時(shí)候,服務(wù)器會(huì)保存一段時(shí)間在線狀態(tài))的時(shí)候,有的時(shí)候由于其他原因,會(huì)卡在不能地圖的物理層(不能行動(dòng)的點(diǎn)),玩家完全不能移動(dòng)。為了解決這個(gè)問(wèn)題,有個(gè)同事在玩家重登錄的時(shí)候,直接設(shè)置了玩家的坐標(biāo)到一個(gè)可移動(dòng)的點(diǎn)。
            這個(gè)看似無(wú)關(guān)緊要的操作,真正導(dǎo)致了服務(wù)器1天多時(shí)間內(nèi)不停的宕機(jī)。下面來(lái)記錄下分析過(guò)程吧。
            1、玩家在重登錄前,其實(shí)是在場(chǎng)景中的,也就是在一個(gè)具體的Area里。
            2、由于玩家上線后,直接設(shè)置了坐標(biāo),而我們后續(xù)的計(jì)算是通過(guò)坐標(biāo)來(lái)獲取Area對(duì)象的,其實(shí)這里就出現(xiàn)問(wèn)題了,玩家其實(shí)是在A格子的鏈表上,但是根據(jù)坐標(biāo)計(jì)算獲得的格子是B。
            3、玩家移動(dòng)后,切換格子,需要從原格子Leave,然后進(jìn)入新的格子,但是基于上面的原因,所以其實(shí)涉及到的有3個(gè)格子,(1)、玩家真實(shí)所在的格子鏈表(A)。(2)、通過(guò)坐標(biāo)計(jì)算所得的格子(B),這個(gè)格子對(duì)象上會(huì)調(diào)用Leave操作。
              (3)要進(jìn)入的新格子(C)。
            4、由于玩家其實(shí)在格子A,但是我們調(diào)用的是B.Leave(player);C.Enter(player),從這里看,肯定是有問(wèn)題的,但是細(xì)看則不然,由于玩家對(duì)象是記錄了前一個(gè)和后一個(gè)對(duì)象,所以B.Leave本身并不會(huì)破壞B的鏈表結(jié)構(gòu),C.Enter看上去也沒(méi)問(wèn)題,那么,問(wèn)題在哪里?
            5、真正的原因其實(shí)是格子A對(duì)象被破壞了,B.Leave(player)上是將玩家從它自己的鏈表上刪除了,鏈表本身是沒(méi)有被破壞了,關(guān)鍵的原因是如果玩家在格子A是Head,那么實(shí)際上在玩家被刪除后,Head應(yīng)該被改變,但是由于操作的是格子B,所以,A其實(shí)被破壞了,很奇妙,這個(gè)對(duì)象沒(méi)有操作,卻被破壞了。后面的問(wèn)題就簡(jiǎn)單了,如果玩家進(jìn)入的C就是A,則會(huì)是一個(gè)很明顯的死循環(huán),如果玩家進(jìn)入的C是一個(gè)新的格子,則格子A的對(duì)象都不能被感知了。

             

             

             

            posted on 2012-07-15 22:13 feixuwu 閱讀(410) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            文章轉(zhuǎn)載請(qǐng)注明出處

            常用鏈接

            留言簿(11)

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久66热人妻偷产精品9| 久久精品国产秦先生| 亚洲精品综合久久| 国产精品久久久久久久久久影院 | 久久国产劲爆AV内射—百度| 久久久久久国产精品免费免费| 久久se精品一区二区影院| 久久综合视频网站| 久久精品国产久精国产果冻传媒| 久久久久国产精品熟女影院| 精品久久久久久无码中文野结衣| 久久精品国产WWW456C0M| 麻豆av久久av盛宴av| 成人免费网站久久久| 久久人人爽人爽人人爽av| 一本久久a久久精品亚洲| 青青青青久久精品国产| 99精品国产综合久久久久五月天| 国产精品久久久久久福利69堂| 久久综合色区| 国产精品美女久久久久AV福利| 亚洲午夜久久久久久噜噜噜| 久久久久久噜噜精品免费直播| 久久A级毛片免费观看| 尹人香蕉久久99天天拍| 久久综合久久综合久久| 久久久久亚洲AV无码专区体验| 久久久WWW成人免费精品| 国产精品久久精品| 久久久久亚洲AV片无码下载蜜桃| 久久精品中文字幕一区| 青青热久久综合网伊人| 国产精品美女久久久| 久久久久青草线蕉综合超碰| 久久免费香蕉视频| 大美女久久久久久j久久| 久久综合狠狠综合久久激情 | 久久精品国产亚洲av麻豆图片| 精品人妻伦九区久久AAA片69 | 精品久久人人爽天天玩人人妻| 香蕉久久夜色精品国产尤物|