Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 154

采用英特尔® 实感™ SDK 背景分割技术的聊天头像助力提升电子竞技体验

$
0
0

下载代码示例

借助英特尔® 实感™ 技术,玩家和观众可以在游戏过程中在屏幕上看到对方,从而提升玩家和观众的电子竞技体验。 通过使用背景分割视频 (BGS),玩家的“浮动头部”可以覆盖在所用屏幕空间小于全宽屏视频的游戏上,图形可以显示在他们背后(就像电视上的气象学家)。 除了相互对话以外,玩家还可以在游戏过程中相互看到对方,从而提升他们的整体游戏沟通体验。 观众将有机会在所有行动中看到自己喜欢的电子竞技选手。

在文本中,我们将讨论英特尔® 实感™ SDK 如何使这种技术成为可能。 这个示例将帮助您理解实施的各个部分(使用面向背景分割、网络、视频压缩和解压的英特尔实感 SDK)、社交互动和这个用例的性能。 这一示例中的代码用 C++ 编写,并使用 DirectX*。

图 1:示例的截图(两名玩家),英雄联盟* 视频剪辑在后面播放。

图 2:示例的截图(两名玩家),炉石传说* 视频剪辑在后面播放。

安装、构建和运行示例

下载示例的地址:https://github.com/GameTechDev/ChatHeads

示例使用下列第三方库:
(i) RakNet用于网络
(ii) Theora 播放库用于播放 OGG 视频
(iii) ImGui用于用户界面
(iv) Windows Media Foundation* (WMF) 用于 BGS 视频流编码和解码

(i) 和 (ii) 是动态链接的(要求 dll 在源库中),而 (iii) 与包含的源静态链接。
(iv) 是动态链接的,并且是 WMF 运行时的组成部分,WMF 运行时应在 Windows* 8 或更高版本的系统上默认安装。 请安装 Windows SDK(如没有)。

在构建示例之前安装英特尔实感 SDK(2015 R5 或更高版本)。 标头和库包含 Visual Studio 项目中的路径(使用 RSSDK_DIR 环境变量),该路径是在安装 RSSDK 过程中设置的。

解决方案文件位于 ChatheadsNativePOC\ChatheadsNativePOC,在 VS2013 和 VS2015 中应当已成功构建。

在运行示例之前安装英特尔® 实感™ 景深摄像头管理器,其中包括摄像头驱动程序。 示例已在 Windows® 8.1 和 Windows® 10 上,使用外部和嵌入式英特尔® 实感™ 摄像头进行了测试。

启动示例时,图 3 中显示的选项面板显示:

图 3:启动时的选项面板。

  • 场景选择:英雄联盟* 视频、炉石传说* 视频和 CPUT (3D) 场景之间进行选择。 点击加载场景按钮,呈现选择。 这无法启动英特尔实感软件;它将在后面的步骤中启动。
  • 分辨率:英特尔实感 SDK 背景分割模块支持多种分辨率。 在关闭当前的英特尔实感 SDK 会话时设置新的分辨率结果,并初始化一个新会话。
  • Is Server / IP 地址: 如果您作为服务器运行,选中“labeled Is Server”复选框。
    如果您作为客户端运行,则不要选中该复选框,输入您想要连接的 IP 地址。

    点击启动,初始化网络和英特尔实感 SDK,播放选定场景。 在 NetworkLayer.h 文件中,连接机器的最大数目(服务器和客户端)被硬编码为 4

    注:虽然服务器和客户端可以在同一系统中启动,但它们不能使用不同的颜色流分辨率。 尝试这样做会导致英特尔实感 SDK 运行时崩溃,因为两个不同的分辨率不能在同一摄像头上同时运行。

    网络和英特尔实感 SDK 成功初始化后,图 4 中的面板显示:

图 4:聊天头像选项面板。

选项面板有多个部分,每个部分都有自己的控制设置。 各部分及其字段为:

  • BGS/媒体控制
    • 显示 BGS 图像 – 如果启动,则显示背景分割图像(即无背景的颜色流)。 如果禁用,仅使用颜色流(尽管仍进行 BGS 处理)。 这也会影响远程聊天头像(即,如果双方禁用了该选项,您将在视频流中看到远程玩家的背景)。

      图 5:BGS 启用(左)和关闭(右)。 前者融入炉石传说*,后者一目了然

    • 暂停 BGS - 暂停英特尔实感 SDK BGS 模块,在 CPU 上暂停分割处理。
    • BGS 跳帧区间 - BGS 算法运行的频率。 输入 0 运行每个帧,输入 1 每两个帧运行一次,依此类推。 英特尔实感 SDK 的限制为 4。
    • 编码阈值 – 这仅适用于多人游戏场景。 如欲了解更多详情,请查看“实施”部分。
    • 解码阈值 – 这仅适用于多人游戏场景。 如欲了解更多详情,请查看“实施”部分。
  • 尺寸/Pos 控制
    • 尺寸 - 在复选框内点击/拖动,调整精灵大小。 通过不同的分辨率来使用,以对比质量。
    • Pos - 在复选框内点击/拖动,对精灵进行重新定位。
  • 网络控制/信息(当多个游戏玩家连接时才显示本部分)。
    • 网络发送间隔(毫秒) - 视频更新数据的发送频率。
    • 已发送 - 客户端或服务器所发送数据的图表。
    • Rcvd - 客户端或服务器所发送数据的图表。 客户端将其更新发送至服务器,然后广播到其他客户端。 作为参考,若要传送 1080p Netflix* 视频,推荐的所需 b/w 是 5 Mbps(625 KB/秒)。
  • 指标
    • 流程指标
      • CPU 使用量 - BGS 算法在多个英特尔® 线程构建模块线程和游戏背景下运行,可以使用比预期更多的 CPU 资源。 使用暂停 BGSBGS 跳帧间隔选项并更改聊天头像分辨率,看看它对 CPU 使用量有何影响。

实施

在内部,英特尔实感 SDK 对其从英特尔实感摄像头收到的数据的每一个新帧进行处理。 用于检索这些数据的调用被阻塞,因而在主应用线程上执行这一处理的成本很高。 因此在这个示例中,所有的英特尔实感 SDK 处理工作都在其自己的专用线程上进行。 这一线程和应用线程从未尝试写入相同的对象,使得同步变得微不足道。

还有一个专用的网络线程处理传入消息,并由使用信号的主应用线程进行控制。 网络线程接收视频更新包,将用于远程聊天头像的共享缓存更新为解码数据。

应用线程负责将更新后的图像数据复制到 DirectX* 纹理资源中。 当远程玩家更改摄像头分辨率时,网络线程会设置一个用于重新创建的 bool,应用线程负责调整缓冲大小,从而重新创建 DirectX* 图形资源(Texture2D 和 ShaderResourceView)并重新初始化解码器。

图 6 显示了这些系统(线程)之间的初始化后交互和数据流。

图 6:本地和远程聊天头像之间的交互流。

色彩转换

英特尔实感 SDK 使用 32 位 BGRA(每通道 8 位)来存储分割的图像,alpha 通道针对背景像素设为 0。 这可直接映射到 DirectX 纹理格式 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,以提供聊天头像。 在本示例中,我们将 BGRA 图像转换为 YUYV,其中每对 BGRA 像素被合并为一个 YUYV 像素。 然而,YUYV 没有 alpha 通道,因此为了保存来自原始图像的 alpha,我们将 Y、U 和 V 通道全部设为 0,以便代表背景分割像素。

然后使用 WMF 的 H.264 编码器对 YUYV 位流进行编码。 这也可以确保更好的压缩率,因为一半以上的图像通常包含背景像素。

解码时,由于压缩的有损性质,旨在代表背景像素的 YUYV 值可以是非零。 我们的解决方法是使用 8 位解码和编码阈值,在用户界面中显示。 在编码方面,如果特定 BGRA 像素的 alpha 小于编码阈值,那么 YUYV 阈值将设为 0。 然后,在解码方面,如果解码的 Y、U 和 V 通道全都小于解码阈值,那么生成的 BGRA 像素所分配的 alpha 将为 0。

当解码阈值设为 0 时,您可能会注意到突出背景分割图像的绿色像素(如下所示)。 这是因为在 YUYV 中,0 对应绿色,并不是 BGRA 中的黑色(非零 alpha)。 当解码阈值设为 0 时,您可能会注意到突出背景分割图像的绿色像素(如下所示)。 这是因为在 YUYV 中,0 对应绿色,并不是 BGRA 中的黑色(非零 alpha)。

图 7:使用 0 这一编码阈值时,远程玩家周围的绿色轮廓边缘。

带宽

通过网络发送的数据量取决于网络发送间隔和本地摄像头分辨率。 最大发送速率受到 30 fps 摄像头帧速率的限制,因此是 33.33 毫秒。 在这一发送速率上,320x240 分辨率视频源在移动最少时消耗 60-75 KBps(每秒千字节),更多移动时消耗 90-120 KBps。 请注意,带宽功能取决于玩家所覆盖的像素数。 将分辨率提升至 1280x720 并不会对带宽成本造成很大影响;净增约为 10-20 KBps,因为图像中相当大的一部分是背景(YUYV 设为 0),这会在很大程度上优化压缩率。
如果将发送间隔缩短至 70 毫秒,则带宽消耗约为 20-30 KBps。

出色性能

该示例使用英特尔® 检测与跟踪技术(英特尔® ITT)标志和英特尔® VTune Amplifier XE来帮助测量和分析性能。 若要启用它们,在

ChatheadsNativePOC\itt\include\VTuneScopedTask.h 

文件中取消批注

//#define ENABLE_VTUNE_PROFILING // uncomment to enable marker code

并重建。

在启用规范代码的请款下,对示例的英特尔® VTune 并发分析可帮助理解应用的线程配置文件。 该平台视图选项卡针对每个检测部分显示一个颜色框(其长度基于执行时间),并可以帮助找到瓶颈。 下面的截图是在包含不同 BGS 工作的英特尔® 酷睿™ i7-4770R 处理器(8 个逻辑内核)上捕捉的。 底部的“CPU 使用率”行显示每个帧、每个交替帧执行 BGS 算法的成本,三个帧执行一次 BGS 算法的成本,以及暂停时执行 BGS 算法的成本。 正如所料,执行 BGS 工作的 TBB 线程在跳帧时的 CPU 利用率较低。

图 8:包含不同 BGS 工作的 VTune 并发分析平台视图

通过仔细查看实感线程,可看到平均速度约为 29-35 毫秒的 RSSDK AcquireFrame() 调用,这是 30 fps 的配置帧捕捉速率的结果。

图 9:仔细查看实感线程。 线程不旋转,在尝试获取帧数据时被阻止

CPU 使用率信息也可以通过示例的指标面板看到,在下表中显示:

BGS 频率聊天头像 CPU 使用率(近似值)
每个帧23%
每个交替帧19%
三个帧一次16%
四个帧一次13%
暂停9%

每个交替帧执行 BGS 工作,或三个帧执行一次 BGS 工作,会带来非常好的体验(当主体是游戏玩家时),因为移动最少。 示例目前没有更新跳帧的图像——使用带前一帧的分割掩码的更新颜色流很有趣。

结论

英特尔实感技术所支持的聊天头像可以使一款游戏具有真正的社交性质,并可以改进游戏和电子竞技体验,同时不影响游戏的外观、风格和性能。 目前的电子竞技节目通常在用户界面底部的空白区域显示专业玩家(和/或)团队的全视频(即带背景)覆盖。 通过使用英特尔实感 SDK 的背景分割,每个玩家的分割视频源可以覆盖在玩家的角色附近,同时不妨碍游戏视图。 通过与英特尔实感 SDK 面部跟踪结合使用,它可在游戏中提供强大而有趣的社交体验。

致谢

非常感谢 Jeff Laflam 对示例进行结对编程并对本文进行审阅。
在此还要感谢 Brian Mackenzie 实施基于 WMF 的编码器/解码器,Doug McNabb 进行 CPUT 说明,以及 Geoffrey Douglas 审阅本文。

 


Viewing all articles
Browse latest Browse all 154

Trending Articles