在引擎Tick卡死时,如何给予用户使用ALT+F4关闭游戏的机会?

任何情况的卡死

重现步骤
引擎卡死时,按ALT+F4无法关闭游戏,只有任务管理器杀进程才能关闭游戏。查了代码,发现按键消息依赖于Tick推进。所以想咨询在这种卡死的情况下,如何仍能让用户使用ALT+F4关闭游戏,有什么推荐的解决方案?

Hi,

你好,引擎有一个独立的线程FHeartBeatThread,会用来检测游戏线程,渲染线程是否卡住,如果超过一定时间(HangDuration,可以看一下FThreadHeartBeat::InitSettingsInternal

),就会触发FThreadHeartBeat::OnHang,你可以考虑在这里做一些定制化,看看能否满足需求。

应该不行。整个进程的按键消息应该都被阻塞了,那么任何线程应该都无法监听到ALT+F4。其次,FThreadHeartBeat本身无法用于通信。

引擎的PumpMessage和处理按键的逻辑ProcessDeferredEvents,应该默认都在GameThread上,如果卡住的确默认无法处理。因为GameThread卡住了,所以Tick函数里处理的逻辑都无法运行,只能自己调用FPlatformMisc::RequestExit(true)。如果一定要响应按键,可以调用PumpMessage(false),然后处理DeferredMessage,里面包括了按键信息。

似乎有一个GetAsyncKeyState,这个配合前台判断作为获取按键的方式,有风险吗?

应该可以,就是自己维护按键逻辑。不过肯定是在一个单独的线程来检查,我感觉OnHang这里是比较合适的地方。