level 1
最近在写一个视频特殊的视频播放器,目前定制部分基本完成,却在偶然间发现一个问题。
事情是这样的,原本播放器的逻辑其实很简单,获取时间戳,时间到了播放,没到则等待。不过由于某些原因,我将视频的解码和显示放到两个线程里,建了个队列缓冲区,让解码线程一直往里面写,显示从里面读。
这块是已经跑通了的,但我在调试时发现一个问题,我的解码速度很快,基本上队列一直处于上限,这其实没什么问题,如果队列装不满,就意味着掉帧。但奇怪的是,我的显示线程中,原本应该等待时间戳的休眠时间一直显示为0,这就意味着,显示线程一帧的耗时是大于视频单帧的间隔的。想想就觉得不合理,因为最慢的解码工作已经由解码线程干了,显示的活很轻,不应该如此耗时。
排查问题发现,是显示线程中一个状态等待函数的问题,其中用到了sleep函数,这里循环休眠1毫秒,直到等到需要的状态。这里的问题在于sleep实际的执行时间,不是1毫秒而是15毫秒。查了一下,这似乎是windows决定的,线程时间切换挂起的最小间隔为15毫秒左右。而这基本意味着我播放的误差的基本也会在15毫秒左右。
我想问下这个问题是否有解决方案,因为目前视频或可视化程序,帧率已经可以达到60甚至120帧了,单帧15毫秒的精度显然是不够的。我不太想使用线程自旋的方式,这会把CPU性能全部吃光,有没有其他方案可以将CPU空出来,颗粒度在1-2毫秒左右?
2023年06月05日 04点06分