一個詭異的Unity3D的網路問題
阿新 • • 發佈:2018-12-22
專案中, 我們使用Unity3D做客戶端開發. 自己擼了一套C#網路庫, 隨著專案的推進, 問題來了:
問題
每次Unity3D編輯器開啟時, 連線伺服器都會有一定機率失敗, 需要反覆關閉再開啟編輯器3~4次後, 才能正常接收到封包
探索
我們的網路庫基於C#的Begin/End系的非同步Socket, 這種socket更接近C++的asio模型, 擼起來特爽.
1. 根據經驗, 這個詭異問題多半跟多執行緒有關係. 複查程式碼, 無效.
2. 找友人更換網路庫, 換阻塞Socket實現和SocketAsyncEventArgs這種實現都試過, 仍然無法解決問題.
3. 接下來還是對Begin/End系的網路庫進行日誌追蹤. 發現, 傳送會總是成功, 連線成功和接收封包有一定機率會斷掉
我們並沒有單獨開執行緒來處理, 而是利用底層非同步通知, 然後有執行緒安全佇列切換到主執行緒進行投遞. 因此底層的執行緒正常性是整個問題的焦點
由於一直無法找到原因, 這個問題擱置了
解決方案
直到有一個偶然的機會, 取過同事程式碼後. 突然發現第一次開啟Unity3D編輯器可以直接登入. 但之後又不行. 同事提醒, 會不會是優先度問題.
馬上開啟Edit->Project Settings->Script Execution Orders. 提高了網路組建優先度
測試, 通過, 問題解決
總結
一直懷疑這個問題跟Mono版本過老有關係, 但由於5.2版本到年底才更新, 之前只能自己啃bug.
在這個問題發生後解決前, 我們還有一個相關見聞: 我們將網路部分比較穩定的程式碼拆分放到dll中, 通過Unity3D的機制進行載入
結果, 網路無法初始化. 估計也是跟這個問題有關係
總之, 有類似問題時, 可以試用指令碼執行順序大法進行嘗試