項(xiàng)目中, 我們使用Unity3D做客戶(hù)端開(kāi)發(fā). 自己擼了一套C#網(wǎng)絡(luò)庫(kù), 隨著項(xiàng)目的推進(jìn), 問(wèn)題來(lái)了:
問(wèn)題
每次Unity3D編輯器打開(kāi)時(shí), 連接服務(wù)器都會(huì)有一定幾率失敗, 需要反復(fù)關(guān)閉再打開(kāi)編輯器3~4次后, 才能正常接收到封包
轉(zhuǎn)載請(qǐng)注明: 戰(zhàn)魂小筑http://www.shnenglu.com/sunicdavy
探索
我們的網(wǎng)絡(luò)庫(kù)基于C#的Begin/End系的異步Socket, 這種socket更接近C++的asio模型, 擼起來(lái)特爽.
1. 根據(jù)經(jīng)驗(yàn), 這個(gè)詭異問(wèn)題多半跟多線(xiàn)程有關(guān)系. 復(fù)查代碼, 無(wú)效.
2. 找友人更換網(wǎng)絡(luò)庫(kù), 換阻塞Socket實(shí)現(xiàn)和SocketAsyncEventArgs這種實(shí)現(xiàn)都試過(guò), 仍然無(wú)法解決問(wèn)題.
3. 接下來(lái)還是對(duì)Begin/End系的網(wǎng)絡(luò)庫(kù)進(jìn)行日志追蹤. 發(fā)現(xiàn), 發(fā)送會(huì)總是成功, 連接成功和接收封包有一定幾率會(huì)斷掉
我們并沒(méi)有單獨(dú)開(kāi)線(xiàn)程來(lái)處理, 而是利用底層異步通知, 然后有線(xiàn)程安全隊(duì)列切換到主線(xiàn)程進(jìn)行投遞. 因此底層的線(xiàn)程正常性是整個(gè)問(wèn)題的焦點(diǎn)
由于一直無(wú)法找到原因, 這個(gè)問(wèn)題擱置了
轉(zhuǎn)載請(qǐng)注明: 戰(zhàn)魂小筑http://www.shnenglu.com/sunicdavy
解決方案
直到有一個(gè)偶然的機(jī)會(huì), 取過(guò)同事代碼后. 突然發(fā)現(xiàn)第一次打開(kāi)Unity3D編輯器可以直接登錄. 但之后又不行. 同事提醒, 會(huì)不會(huì)是優(yōu)先度問(wèn)題.
馬上打開(kāi)Edit->Project Settings->Script Execution Orders. 提高了網(wǎng)絡(luò)組建優(yōu)先度

測(cè)試, 通過(guò), 問(wèn)題解決
轉(zhuǎn)載請(qǐng)注明: 戰(zhàn)魂小筑http://www.shnenglu.com/sunicdavy
總結(jié)
轉(zhuǎn)載請(qǐng)注明: 戰(zhàn)魂小筑http://www.shnenglu.com/sunicdavy
一直懷疑這個(gè)問(wèn)題跟Mono版本過(guò)老有關(guān)系, 但由于5.2版本到年底才更新, 之前只能自己啃bug.
在這個(gè)問(wèn)題發(fā)生后解決前, 我們還有一個(gè)相關(guān)見(jiàn)聞: 我們將網(wǎng)絡(luò)部分比較穩(wěn)定的代碼拆分放到dll中, 通過(guò)Unity3D的機(jī)制進(jìn)行加載
結(jié)果, 網(wǎng)絡(luò)無(wú)法初始化. 估計(jì)也是跟這個(gè)問(wèn)題有關(guān)系
總之, 有類(lèi)似問(wèn)題時(shí), 可以試用腳本執(zhí)行順序大法進(jìn)行嘗試