最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

從前端到后端數(shù)據(jù)庫兔寶世界游戲程序神奇bug調(diào)試全過程,JavaScript中json運(yùn)行原理初

2022-02-15 14:15 作者:-千里馬-  | 我要投稿

?前幾天開了一個(gè)休閑游戲項(xiàng)目的細(xì)分功能,大概就是模擬一個(gè)種地的系統(tǒng),我實(shí)現(xiàn)的方案是使用前端typescript后端應(yīng)用typescript+node.js+mongoDB實(shí)現(xiàn)業(yè)務(wù)邏輯

功能需求挺多,多人在線可以互相看見,作物有缺水和生病狀態(tài)...還可以偷菜,大寫了3天程序差不多1500行代碼寫成了,當(dāng)然更多還是要?dú)w功于曾經(jīng)寫好的一些基本功能。

然后就出現(xiàn)了一個(gè)特別糟心的bug,種上地以后不顯示成長進(jìn)度條和文字,并且bug出現(xiàn)的時(shí)候也特別的詭異,有時(shí)出現(xiàn),有時(shí)候又不會(huì)出現(xiàn),特別奇怪,我就下斷點(diǎn)調(diào)試這個(gè)bug。

先看看前端觸發(fā)顯示進(jìn)度條和提示成長進(jìn)度的ui程序出現(xiàn)了什么問題。

?ui直接返回enum采摘光了,然后就把所有的進(jìn)度條和提示文字都隱藏了,繼續(xù)看,作物剛剛種上,連成熟都沒有怎么會(huì)定位狀態(tài)在采摘光了,這不是很奇怪嗎?,那我就繼續(xù)回調(diào)查看狀態(tài)的識(shí)別程序。

狀態(tài)中表示首先驗(yàn)證的是yield,yield是一個(gè)可被玩家摘植物的列表?,如果列表中沒有果實(shí)了就返回采摘光了的狀態(tài)。這一層回調(diào)明白了,因?yàn)閥ield這個(gè)列表沒有東西了所以才返回狀態(tài)為沒有果實(shí),但是這也很奇怪呀,種的時(shí)候yield列表就已經(jīng)初始化好了。

那么就看一看加入作物到顯示列表時(shí)候作物的構(gòu)建程序是不是符合我的這個(gè)情況

這里返回的值就是空的,傳過來新種下的作物就是空的了,那就只能在服務(wù)端的構(gòu)建植物的程序處下斷點(diǎn)調(diào)試,在服務(wù)端一看果然yield列表是空的。但是我檢測(cè)json表中是有數(shù)據(jù)的,這是因?yàn)槭裁茨??百思不得其解,只能先判斷什么情況下種下植物果實(shí)列表會(huì)是空的。

然后我就測(cè)試吧,重開服務(wù)端客戶端并且在收獲封包處理時(shí)下斷,一頓調(diào)試直接調(diào)到了JavaScript底層這邊基本上沒有希望了,肯定這個(gè)路線是不對(duì)的。

?但這個(gè)地方的值確實(shí)會(huì)變動(dòng),再次重開發(fā)現(xiàn)了一個(gè)規(guī)律,只有在種下一個(gè)新的作物后收獲新的作物的果實(shí)的時(shí)候才會(huì)觸發(fā)清空json中reap列表中的內(nèi)容所以我就直接按這個(gè)規(guī)律去調(diào)試程序,并且下斷在收獲點(diǎn)

點(diǎn)擊收獲,先判斷是否在自己家種植是否在公共地皮種植的?

然后跳函數(shù)到完全自己獲得該作物的所有果實(shí)函數(shù),也就是自己種自己采收作物的函數(shù)?內(nèi),我發(fā)現(xiàn)在玩家獲得物品后,有yield列表清理刪除剛剛玩家采收后物品的刪除函數(shù)跳進(jìn)該函數(shù)

沒有任何異樣,但是果實(shí)列表清空的問題就在這20行里面了

我一點(diǎn)點(diǎn)的調(diào)下去,我萬萬沒有想到的是竟然刪除從總植物列表中獲取的?作物數(shù)據(jù)中的果實(shí)列表中的內(nèi)容被刪除的時(shí)候會(huì)把json里面的數(shù)據(jù)也刪除

這就更加奇怪了!!

刪一個(gè)從數(shù)據(jù)庫中載入內(nèi)存的json列表中的數(shù)據(jù)竟然刪到了另一個(gè)毫無關(guān)聯(lián)的json里面

返回頭看作物創(chuàng)建功能里面的初始化要存入的數(shù)據(jù)條創(chuàng)建過程,瞬間明白了

?這里傳進(jìn)去的是引用不是實(shí)際的數(shù)據(jù),構(gòu)建的整個(gè)系統(tǒng)所有后創(chuàng)建的json實(shí)際上都是內(nèi)存引用,既然是內(nèi)存引用那么系統(tǒng)在操作刪除指定已采摘果實(shí)的函數(shù)刪除的就是寫入內(nèi)存的那個(gè)通用json數(shù)據(jù)里面的內(nèi)容,而非后面創(chuàng)建植物列表中的果實(shí)列表內(nèi)容。

JavaScript,typescript里面內(nèi)部的運(yùn)行機(jī)制原來是這樣的,那可真的省去了很多內(nèi)存開銷,那么我應(yīng)該找一下json深淺拷貝的內(nèi)容看一看

哇好復(fù)雜的拷貝過程呀,可能得專門創(chuàng)建一個(gè)拷貝函數(shù)用才能解決這個(gè)bug

那應(yīng)該怎么去解決呢,我靈機(jī)一動(dòng)

直接把json轉(zhuǎn)換成字符串對(duì)象,然后放數(shù)據(jù)條的時(shí)候解析成json就可以了

?

?于是這個(gè)神奇的bug的修復(fù)成功了,調(diào)這個(gè)bug快調(diào)了6個(gè)小時(shí)。

?向后往前推的回顧一下:

1.引用式創(chuàng)建json對(duì)象的json作物條數(shù)據(jù)存入總條導(dǎo)致了總作物條數(shù)據(jù)集合和原本不應(yīng)該改變的json條數(shù)據(jù)出現(xiàn)了對(duì)象引用式的關(guān)聯(lián)

2.因?yàn)橛嘘P(guān)聯(lián)所以刪除作物果實(shí)數(shù)據(jù)列表的時(shí)候會(huì)刪除這個(gè)不應(yīng)該改變的json數(shù)據(jù)里面構(gòu)建作物果實(shí)的數(shù)據(jù)改變

3.因?yàn)槭斋@時(shí)刪除改變,刪除了果實(shí)所以導(dǎo)致創(chuàng)建新作物的時(shí)候果實(shí)列表為空

4.因?yàn)樾聞?chuàng)建果實(shí)列表為空所以即時(shí)創(chuàng)建的列表數(shù)據(jù)為空

5.因?yàn)榉祷剡^來列表為空所以前端初始化即時(shí)添加作物果實(shí)列表為空

6.因?yàn)楣麑?shí)列表為空所以u(píng)i檢測(cè)作物狀態(tài)時(shí)候?yàn)椴烧鉅顟B(tài)

7.因?yàn)槭遣烧鉅顟B(tài)所以前端顯示的是作物應(yīng)該被鏟除時(shí)的狀態(tài)

8.因?yàn)橹辉谛路N下作物的時(shí)候會(huì)導(dǎo)致json和條數(shù)據(jù)引用所以只有新種的作物會(huì)觸發(fā)bug而已經(jīng)存庫作物不會(huì)影響

9.這個(gè)bug就是這樣,順利解決bug




從前端到后端數(shù)據(jù)庫兔寶世界游戲程序神奇bug調(diào)試全過程,JavaScript中json運(yùn)行原理初的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
红河县| 尉犁县| 江华| 嫩江县| 永昌县| 安溪县| 江北区| 元朗区| 安乡县| 江津市| 宿松县| 堆龙德庆县| 新兴县| 香港 | 永年县| 礼泉县| 巴中市| 七台河市| 泊头市| 买车| 尼玛县| 凤凰县| 西城区| 深州市| 永川市| 嵊州市| 普兰店市| 荃湾区| 曲沃县| 肃南| 建始县| 三河市| 巢湖市| 新龙县| 绵竹市| 佛冈县| 阿城市| 舞钢市| 柳河县| 高雄县| 黄骅市|