问题背景
有的时候会突然发现游戏进入了卡死状态,或者某个线程的任务一直没有处理完成,这个时候就需要考虑是不是线程出现了卡死,比如资源竞争、死循环等。通常情况下,我们可以提出一个监听线程来用心跳机制判断某个线程是否仍然存活,如果某个线程一段时间内都没有上报心跳,那么就可以认为它卡死了,这个时候可以打出堆栈或者直接让程序触发assert。
机制简介
在虚幻引擎中有一个FThreadHeartBeat
的类,用于维护线程心跳相关机制。
主线程心跳:GameThreadHitchHeartBeat
。
在引擎代码的各处,已经处理好了FThreadHeartBeat::Get().HeartBeat()
的调用,在一些不需要检测的地方,也调用了暂停检测。