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

測試, 通過, 問題解決
轉載請注明: 戰魂小筑http://www.shnenglu.com/sunicdavy
總結
轉載請注明: 戰魂小筑http://www.shnenglu.com/sunicdavy
一直懷疑這個問題跟Mono版本過老有關系, 但由于5.2版本到年底才更新, 之前只能自己啃bug.
在這個問題發生后解決前, 我們還有一個相關見聞: 我們將網絡部分比較穩定的代碼拆分放到dll中, 通過Unity3D的機制進行加載
結果, 網絡無法初始化. 估計也是跟這個問題有關系
總之, 有類似問題時, 可以試用腳本執行順序大法進行嘗試