起因是在這次Booom活動的開發中進行例行版本構建的時候偶然發現通過窗口的關閉按鈕退出Windows版本的客戶端時,應用程序並未完全退出而是在後臺進程中繼續運行著。

然後我將這個包體發放給項目組其他成員,得到了每個人不一樣的情況。

這誰懂
然後就開始進行一些Debug的工作

首先可以肯定的是應用程序在後臺運行肯定是有線程沒有關閉導致的, 這種由於線程等待導致進程卡住(Freeze)的問題,通過unity自己的log是挺難看出問題的。然後又由於我們遊戲有一定的網絡模塊,所以第一反應其實是考慮是不是這一塊代碼的問題,後來把整個項目的網絡模塊全部剝離再打包嘗試後情況並沒有改變。

這時候為了知道當前進程在做什麼,卡在哪裡了就需要知道當前進程的所有線程堆棧信息。
我們可以通過微軟的Process Explorer來可以生成運行時進程包含線程堆棧信息的Dump文件。(具體這個軟件的使用教程可以網上搜索一下)

最後定位到inputhost.dll阻塞了進程的退出,然後看到這個名字第一反應就是unity的inputsystem,在嘗試把我們用了inputsystem的3C模塊移除後,遊戲變得可以正常退出了。
這時候還是因為開發功能比較優先,所以簡單使用win32api拿句柄在退出遊戲的時候直接把整個進程殺之,進行了一個治標不治本。

然後今天我們的主程同學@Lapcat 在整理代碼時RCA出了導致這個問題的原因


是使用了SendMessage模式,在腳本里寫這些對應的方法系統就會就會自動call這些方法導致了線程沒有正常退出。

最後修改成了事件註冊的方式完美解決了線程等待的問題。
踩坑日誌就分享到這裡~!

“再見~”