玩游戏的时候想截取视频一般都是通过第三方工具来完成的,Fraps很多时候会被用来截取实时的游戏视频,但是用了Fraps之后会发现帧率明显下降了很多,很影响游戏的体验。如果有一种可以实时截取游戏视频而不降低帧率的方法该多好啊,无意中发现Outerra的Blog有一篇Blog专门介绍了他们如何达到这个目的的,他们当然这个方法是需要内嵌到游戏本身的,不是像Fraps那么自由可以随便在那个游戏上,理论上应该是可以扩展一下的,只需要得到某个窗口的图像数据然后按照这个思路应该可以得到不错的效果。
DXT的压缩方法不适合于游戏图像,因为游戏图像的对比度很高,会导致色块很严重,因此可以换个思路将RGB转换到 YCoCg(Y为强度,CoCg分
别为橙色和绿色色度),YCoCg空间很适合DXT压缩
具体步骤如下:
1. 将每帧渲染的数据通过YCoCg的方式压缩,整体数据量降低为原来的1/3
2. cpu异步读取压缩的贴图数据
3. 将数据写入磁盘
GPU压缩贴图数据有效地降低了CPU和GPU之间的带宽,更重要的是可以降低磁盘写数据的带宽。SATA硬盘的持续写入速度是55MB/s,而不压缩的视频1280x720 30fps的数据量是79.1MB/s,而DXT压缩的视频只需要26.4MB/s,高清的数据流是59.3MB/s.
要截取游戏图像数据,需要先将游戏画面渲染到一张临时buffer里,压缩的shader用这个buffer的贴图作为输入,渲染到YCoCg,再提供给CPU读取。
下一步就是视频编码解码,我做了一个ffmpeg的插件来完成这个功能。
结果:
开始录视频后游戏会掉一些帧率,但是还是可以正常玩的,不像Fraps那样对帧率影响很明显。缺点是必须集成到游戏里才能使用,但最终结果非常不错。
下面给出结果以及和原始图像的对比。
这个方法可以说是量身定制的游戏录视频功能,在录视频方面比Fraps要出色的多,集成到游戏里也很简单,可以说是性价比很高的一个技术。

原始图像

压缩后的视频截图

4xDiff
本文介绍了通过实时YUYV-DXT压缩技术实现在游戏中捕获高清视频的方法,避免了使用第三方工具如Fraps导致的帧率下降问题。这种方法将RGB转换为YCoCg空间进行压缩,减少数据量并降低CPU和GPU间带宽需求。虽然需要集成到游戏内部,但能显著提高录制体验,且效果优于Fraps。
7万+

被折叠的 条评论
为什么被折叠?



