起因是在这次Booom活动的开发中进行例行版本构建的时候偶然发现通过窗口的关闭按钮退出Windows版本的客户端时,应用程序并未完全退出而是在后台进程中继续运行着。
然后我将这个包体发放给项目组其他成员,得到了每个人不一样的情况。
首先可以肯定的是应用程序在后台运行肯定是有线程没有关闭导致的, 这种由于线程等待导致进程卡住(Freeze)的问题,通过unity自己的log是挺难看出问题的。然后又由于我们游戏有一定的网络模块,所以第一反应其实是考虑是不是这一块代码的问题,后来把整个项目的网络模块全部剥离再打包尝试后情况并没有改变。
这时候为了知道当前进程在做什么,卡在哪里了就需要知道当前进程的所有线程堆栈信息。
我们可以通过微软的Process Explorer来可以生成运行时进程包含线程堆栈信息的Dump文件。(具体这个软件的使用教程可以网上搜索一下)
最后定位到inputhost.dll阻塞了进程的退出,然后看到这个名字第一反应就是unity的inputsystem,在尝试把我们用了inputsystem的3C模块移除后,游戏变得可以正常退出了。
这时候还是因为开发功能比较优先,所以简单使用win32api拿句柄在退出游戏的时候直接把整个进程杀之,进行了一个治标不治本。
然后今天我们的主程同学@Lapcat 在整理代码时RCA出了导致这个问题的原因
是使用了SendMessage模式,在脚本里写这些对应的方法系统就会就会自动call这些方法导致了线程没有正常退出。
最后修改成了事件注册的方式完美解决了线程等待的问题。
评论区
共 条评论热门最新