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

使用支持 TouchDesigner* 的英特尔® 实感™ 摄像头: 第 1 部分

$
0
0

下载演示文件 ZIP 35KB

TouchDesigner* 由 Derivative*创建,是一个全球广泛使用的平台/程序,用于现场表演期间的交互和实时动画,以及渲染三维动画序列、建筑制图、安装和最近的 VR 工作。 TouchDesigner* 中的英特尔® 实感™ 摄像头支持使其成为一款用途更广、功能更强大的工具。 还有一个实用功能就是使用 .fbx文件将对象和动画从其他 3D 文件包导入到 TouchDesigner* 中,以及接收渲染的动画和图像。

在这篇包含两个部分的文章中,我将解释英特尔® 实感™ 摄像头如何集成到 TouchDesigner* 中并在 TouchDesigner 中使用。 第 1 部分的演示使用英特尔® 实感™ 摄像头 TOP 节点。 第 2 部分的演示使用 CHOP 节点。 在第 2 部分中,我将解释如何结合英特尔® 实感™ 摄像头创建 VR 和球幕序列。 我将展示 TouchDesigner* 的 Oculus Rift 节点如何与英特尔® 实感™ 摄像头一起使用。 第 1 部分和第 2 部分包含动画和可下载的 TouchDesigner* 文件、.toe文件,可用于参考。 若要获取 TouchDesigner* (.toe) 文件,请点击文章顶部的按钮。 此外,我们还提供免费非商业版本的 TouchDesigner*,这一版本提供完善的功能(除了最高分辨率限定为 1280 x 1280 之外)。

注:目前有两种类型的英特尔® 实感™ 摄像头:短距离的 F200和较长距离的 R200。小尺寸的 R200 适用于需要隐藏摄像头的现场表演和装置。 与较大的 F200 型号不同,R200 没有手指/手跟踪功能,不支持“标记跟踪”。 TouchDesigner* 支持 F200 和 R200 英特尔® 实感™ 摄像头。

引自 TouchDesigner* 网页:"TouchDesigner* 是一款革命性的软件平台,支持艺术家和设计师在一个开放、自由的环境中联系其媒体。 TouchDesigner* 为以无限可定制的方式混合这些元素提供了一个高性能平台,适合于使用视频、音频、3D、控制器输入、互联网和数据库数据、DMX 照明、环境传感器或者您能够想象的一切的交互式多媒体项目。

在使用支持 TouchDesigner 的英特尔® 实感™ 摄像头* 方面,Derivative 公司的高级开发人员 Malcolm Bechard 这样评价:

“通过使用 TouchDesigner* 基于节点的程序架构,英特尔® 实感™ 摄像头数据可立即导入、可视化并连接到其他节点,无需花费任何时间进行编码。 创意可通过即时反馈循环快速创建原型和开发。作为 TouchDesigner* 中的本地节点意味着无需为每次开发迭代关闭/重新编译应用。英特尔® 实感™ 摄像头增强了 TouchDesigner* 功能,为用户提供了大量预置模块,如手势、手势跟踪、人脸跟踪和图像(深度)数据,用户可以利用这些数据构建交互。 用户无需通过分析低级手势数据来推断手势等方面;它已为用户完成了这些工作。”

在 TouchDesigner* 中使用英特尔® 实感™ 摄像头

TouchDesigner* 是一个基于节点的平台/程序,使用 Python* 作为其主要的脚本语言。 有 5 种执行不同操作和功能的节点类型: TOP 节点(纹理)、SOP 节点(几何)、CHOP 节点(动画/音频数据)、DAT 节点(表格和文本)和 COMP 节点(3D 几何节点和构建二维控制面板的节点),以及 MAT 节点(材料)。 咨询英特尔® 编程人员的 TouchDesigner* 编程人员设计了两个特殊节点:英特尔® 实感™ 摄像头 TOP 节点和英特尔® 实感™ 摄像头 CHOP 节点,以便将英特尔® 实感™ 摄像头整合到程序中。

注:这篇文章面向熟悉 TouchDesigner* 及其接口的用户。 如果您不熟悉 TouchDesigner*,打算按照本文章逐步操作,那么我推荐您先看看此处的一些文档和视频:

学习 TouchDesigner*

注:使用英特尔® 实感™ 摄像头时,注意其范围以获得最佳效果是很重要的。 在这个英特尔® 网页上,您可以看到每个摄像头的范围和使用摄像头的最佳操作实践。

英特尔® 实感™ 摄像头 TOP 节点

TouchDesigner* 中的 TOP 节点执行的许多操作与传统合成项目相同。 英特尔® 实感™ 摄像头 TOP 节点利用英特尔® 实感™ 摄像头传输的 2D 和 3D 数据提要,增强了这些功能。 英特尔® 实感™ 摄像头 TOP 节点有许多设置来获得不同形式的数据。

  • Color. The video from the Intel® RealSense™ camera color sensor.
  • Depth. A calculation of the depth of each pixel. 0 means the pixel is 0 meters from the camera, and 1 means the pixel is the maximum distance or more from the camera.
  • 色彩。 来自英特尔® 实感™ 摄像头色彩传感器的视频。
  • 深度。计算每个像素的深度。 0 表示像素距离摄像头 0 米,1 表示像素与摄像头之间为最大距离或更远。
  • 原始深度。数值直接取自英特尔® 实感™ SDK。 再强调一次,0 表示距离摄像头 1 米远,1 表示与摄像头之间为最大距离或更远。
  • 可视化深度。 来自英特尔® 实感™ SDK 的灰度图像,可帮助您显示深度。 它不能用于实际确定像素与摄像头的精确距离。
  • 深度转彩色 UV 贴图。 32 位浮点 RG 纹理的 UV 值(注意,没有蓝色),需要用来重新映射深度图像,以符合彩色图像。 您可以使用“重新映射 TOP 节点”来调整图像,以确保一致。
  • 彩色转深度 UV 贴图。 32 位浮点 RG 纹理的 UV 值(注意,没有蓝色),需要用来重新映射彩色图像,以符合深度图像。 您可以使用“重新映射 TOP 节点”来协调这两者。
  • 红外线:来自英特尔® 实感™ 摄像头红外传感器的原始视频。
  • 点云。 3D 空间中的点云(x、y 和 z 坐标)或英特尔® 实感™ 摄像头的扫描器所创建的点云。
  • 点云彩色 UV。 可用于从彩色图像流中获取每个点的颜色。

注:您可以下载 RealSensePointCloudForArticle.toe 这个 toe 文件,作为从英特尔® 实感™ 摄像头的数据创建 3D 动画几何图形的简单开始模板。 这个文件可以在许多方面进行修改和更改。 英特尔® 实感™ 摄像头的三个 TOP 节点(点云、颜色和点云彩色 UV)可创建一个由点(颗粒)组成的 3D 几何图形和映射到几何图形上的彩色图像。 这会带来许多令人激动的可能。


点云几何图形这是一个使用英特尔® 实感™ 摄像头制作的动画几何图形。 这一技术非常适合在现场表演中使用。 还可以添加人物说话的声音。 TouchDesigner* 还可以使用音频中的数据创建实时动画。

英特尔实感摄像头 CHOP 节点

注:还有一个控制 3D 跟踪/位置数据的英特尔® 实感™ 摄像头 CHOP 节点,我们将在本文的第 2 部分讨论。

演示 1: 使用英特尔® 实感™ 摄像头 TOP 节点

点击文章顶部的按钮,获取第一个 TOP 演示: settingUpRealNode2b_FINAL.toe

演示 1,第 1 部分:您将学习如何设置英特尔® 实感™ 摄像头 TOP 节点并将其连接到其他 TOP 节点。

  1. 打开添加运算符/OP创建对话框。
  2. 在 TOP 部分下,点击“实感”。
  3. 在英特尔® 实感™ 摄像头 TOP 节点的 “设置” 参数页面,针对图像,从下拉菜单中选择“颜色” 。 在英特尔® 实感™ 摄像头 TOP 节点中,摄像头指向内容的图像将显示,就像摄像机中一样。
  4. 将英特尔® 实感™ 摄像头的分辨率设为 1920 x 1080。
     


    英特尔® 实感™ 摄像头 TOP 节点设置起来非常简单。

  5. 创建一个水平 TOP 节点并将其连接到英特尔® 实感™ 摄像头 TOP 节点。
  6. 在水平 TOP 节点的预参数页面,选择“反转”并将滑块滑动到 1。
  7. 将水平 TOP 节点连接到 HSV 转 RGB TOP 节点,然后将其连接到空 TOP 节点。


英特尔® 实感™ 摄像头 TOP 节点可连接到其他 TOP 节点,以创造不同的外观和效果。

接下来,我们会将这个创建的图像纳入 Phong MAT(材料),以便我们绘制图像的纹理几何图形。

使用英特尔® 实感™ 摄像头数据为几何图形创建纹理

演示 1,第 2 部分: 本练习将为您展示如何使用英特尔® 实感™ 摄像头 TOP 节点创建纹理,以及如何将这些纹理添加到随后可分配到项目几何图形的 MAT 节点。

  1. 将几何图形(地区)COMP 节点添加到您的场景中。
  2. 添加 Phong MAT 节点。
  3. 将空 TOP 节点拖动到 Phong MAT 节点的颜色贴图参数中。
     


    使用面向其颜色贴图参数的英特尔® 实感™ 摄像头数据的 Phong MAT。

  4. 在地区 COMP 的渲染参数页上,针对材料参数,添加 phong1类型,使其将 phong1节点作为其材料。
     


    使用面向其颜色贴图参数的英特尔® 实感™ 摄像头数据的 Phong MAT 添加到地区 COMP 节点的渲染/材料参数。

创建 Box SOP 并通过刚刚创建的 Phong Shader 绘制纹理

演示 1,第 3 部分:您将学习如何使用英特尔® 实感™ 摄像头数据,将您创建的 Phong MAT 着色器分配到方框几何图形 SOP。

  1. 进入 geo1节点的子级 (/project1/geo1)。
  2. 创建一个方框 SOP 节点,一个纹理 SOP 节点和一个材料 SOP 节点。
  3. 删除环形 SOP 节点并将 box1节点连接到 texture1节点和 material1节点。
  4. material1节点的材料参数中,输入: ../phong1,这会将它引用到您在父级中创建的 phong1 MAT 节点。
  5. 若要在方框的每个面上放置纹理,在 texture1节点的参数中,即纹理/纹理类型中,放置并设置纹理/偏移投入 .5 .5 .5
     


    在geo1 COMP 节点的子级,方框 SOP 节点、纹理 SOP 节点和材料 SOP 节点是相连的。 材料 SOP 正在从phong1 MAT 节点获取其纹理。 ( …/phong1).

为方框几何图形创建动画和实例

演示 1,第 4 部分: 您将学习如何使用变换 SOP 节点和简单表达式旋转几何图形 SOP。 然后您将学习如何为方框几何图形创建实例。 最后我们将获得一个这样的界面:界面上布满了旋转方框,方框中包含来自英特尔® 实感™ 摄像头 TOP 节点的纹理。

  1. 若要为 X 轴上旋转的方框创建动画,在纹理 SOP 节点后插入一个变换 SAP 节点。
  2. transform1 SOP 节点的旋转参数的 x 组件(第一个字段)中插入一个表达式。 这个表达式不依赖于帧,当时间轴上的帧用完时,表达式将继续运行,不开始重复。 我乘以 10,以增加速度: absTime.seconds*10
     


    在这里您可以看到立方体是如何旋转的。

  3. 为了制造方框,回到父级 (/project1),在 geo1 COMP 节点的“实例” 页参数中 ,将实例更改为“开启”。
  4. 将网格 SOP 节点和 SOP 添加至 DAT 节点。
  5. 将网格参数设置为 10行和 10列,大小设为 2020
  6. 在 SOP 转 DAT 节点参数中,对于 SOP,放置 grid1并确保“提取” 用于设置
  7. geo1 COMP的实例页参数中,对于 CHOP/DAT 实例,输入: sopto1
  8. 分别用 P(0)、P(1) 和 P(2)填充 TX、TY 和 TZ 参数,指定实例位置将使用 sopto1节点中的哪些列。
     


    点击文章顶部的按钮下载 TOP_Demo1_forArticle.toe,查看我们在第一个英特尔® 实感™ 摄像头 TOP 演示中所做的工作。

  9. 如果您希望在未过滤的英特尔® 实感™ 摄像头中查看图像,断开或绕过水平 TOP 节点和 HSV 转 RGB TOP 节点。
     

现场渲染或执行动画

演示 1,第 5 部分:您将学习如何建立一个要现场执行或作为电影文件呈现的场景。

  1. 若要渲染项目,添加一个摄像头 COMP 节点、光 COMP 节点和一个渲染 TOP 节点。 默认情况下,摄像头将渲染场景中的所有几何图形组件。
  2. 回到 Z 轴,将摄像头平移约 20 个单位。 将光留在默认设置上。
  3. 将渲染分辨率设为 1920x1080。 默认情况下,渲染背景是透明的(alpha 为 0)。
  4. 为了使背景在正方形后面成为不透明的黑色,添加一个常量 TOP 节点并将颜色更改为 0,0,0,以便将其更改为黑色,并将 Alpha 留为 1。 您也可以选择另一种颜色。
  5. 添加一个 Over TOP 节点并将渲染 TOP 节点连接到第一个连接,将常量 TOP 节点连接到第二个连接。 这样便可以设置渲染的背景像素(0, 0, 0, 1),这一背景现在已不再透明。

将 TOP 的 alpha 更改为 1 的另一个方法是使用重新排序 TOP,并将其输出 Alpha 参数设为 Input 11


显示渲染后的场景,其背景为不透明的黑色。


在这里您可以看到,整个屏幕已经布满了纹理旋转立方体。

如果您想要呈现出动画,而不是在表演中实时播放动画,您必须在 TouchDesigner 程序顶部栏的文件下选择导出电影对话方框。 在 TOP 视频的参数中,为这一特定示例输入 null2。 否则,输入您要渲染的任何 TOP 节点。


此处是“导出电影”面板,null2 已被拖入。 如果我有一个配套的音频 CHOP,我会在放置 null2 的位置下面直接将其拖入或放入CHOP 音频插槽。

演示 1,第 6 部分: 使 TouchDesigner* 成为特殊平台的一个因素是您可以利用它制作实时性能动画。 与英特尔® 实感™摄像头配合使用时,这一功能特别有用。

  1. 添加一个窗口 COMP 节点,在操作员参数中,输入 null2 TOP 节点。
  2. 将分辨率设为 1920 x 1080。
  3. 位置参数中选择您想要的显示器。 借助窗口 COMP 节点,您可以对投射到您所选显示器的整个动画进行实时执行。 使用窗口 COMP 节点,您可以指定您希望播放表演的显示器或投影机。
     


    您可以根据自己的需要创建任意数量的窗口 COMP 节点,以便将输出引导到其他显示器。

演示 2: 使用英特尔® 实感™ 摄像头 TOP 节点深度数据

英特尔® 实感™ 摄像头 TOP 节点拥有许多对于创建纹理和动画有用的其他设置。

在演示 2 中,我们使用深度数据,在基于摄像头深度数据的图像上应用模糊。 点击文章顶部的按钮,获取下面这个文件: RealSenseDepthBlur.toe

首先创建一个英特尔® 实感™ 摄像头 TOP 并将其图像参数设为深度。 如果距离摄像头近,深度图像的像素为 0(黑色),如果距离摄像头远,像素则为 1(白色)。 像素值的范围由仪表中指定的最大深度参数控制。 默认情况下,像素值为 5,表示像素 5 或距离摄像头更远将为白色。 如果像素值为 0.5,则表示距离摄像头 2.5 米。 根据摄像头与您的距离,缩小这一数值或许有好处。 在本例中,我们将其更改为 1.5 米。

接下来,我们想要处理一下深度,使用阈值 TOP,移除我们关注范围之外的对象。

  1. 创建一个阈值 TOP 并将其连接到 realsense1节点。 我们想要剔除超过与摄像头特定距离的像素,将比较参数设为更大,将阈值参数设为 0.8。 这使得大于 0.8 的像素(如果我们将英特尔® 实感™ 摄像头 TOP 中的最大深度设为 1.5,则为 1.2 米或更远)变为 0,所有其他像素变为 1。
     

  2. 创建乘法 TOP 并将 realsense1节点连接到 第一个输入,将 thresh1节点连接到第二个输入。 用我们需要的像素乘以 1 将让它们保持原样,乘以 0 会让它们归零。 对于您想要控制模糊度的部分图像,multiply1节点现在只有大于 0 的像素。
  3. 在 TOP 中创建一个电影文件,为其文件参数选择一个新图像。 在本例中,我们从 TouchDesigner* Samples/Map目录中选择 Metter2.jpg。
  4. 创建一个 Luma Blur TOP 并将moviefilein1连接到 lumablur1的第一个输入,将 multiply1连接到 lumablur1的第二个输入。
  5. lumablur1的参数中,将白度值设为 0.4,黑色过滤器宽度设为 20,白色过滤器宽度设为 1。 这使第一个输入为 0的像素拥有 20的模糊过滤器宽度,数值为 0.4或更大的像素拥有 1的模糊宽度。
     


    整个布局。

最后您将获得一个用户所在位置的像素不模糊、其他像素模糊的图像。


通过显示 Luma Blur TOP,背景将显示图像的模糊方式。

演示 3: 通过重新映射 TOP 节点使用英特尔® 实感™ 摄像头 TOP 节点深度数据

点击文章顶部的按钮,获取下面这个文件: RealSenseRemap.toe

注:英特尔® 实感™ 摄像头 TOP 节点的深度和彩色摄像头位于全球的不同地方,因此它们生成的默认图像不会对齐。 例如,如果您的手被放置在彩色图像的中间,它将不会位于深度图像的中间,而会稍微偏左或偏右一些。 通过改变周围的像素,VU 重新贴图修复了这一问题,以便它们彼此对齐。 注意对齐和未对齐 TOP 之间的区别。


通过使用深度转彩色 UV 数据,重新映射 TOP 将英特尔® 实感™ 摄像头 TOP 的深度数据与英特尔® 实感™ 摄像头 TOP 的彩色数据进行了对齐,将它们放置在同一个空间。

演示 4: 在英特尔® 实感™ 摄像头 TOP 节点中使用点云

点击文章顶部的按钮,获取下面这个文件: PointCloudLimitEx.toe

在这个练习中,您将学习如何使用英特尔® 实感™ 摄像头 TOP 节点点云设置和限制 SOP 节点,创建动画几何图形。 注意,这种方法与本文开始时展示的点云示例文件不同。 之前的示例使用能够生成更多点的 GLSL 着色器,但操作起来更加复杂,并且不在本文的范围之内。

  1. 创建实感™ TOP 节点并将参数图像设为点云
  2. 创建一个 TOP 转 CHOP 节点并将其连接到选定 CHOP 节点。
  3. 将选定 CHOP 节点连接到数学 CHOP 节点。
  4. topto1 CHOP 节点参数 TOP 中,输入: realsense1
  5. 在选定 CHOP 节点参数“通道名称”中,输入 r g b,在字母之间留一个空格。
  6. 在 “乘法” 参数的 math1 CHOP 节点中,输入: 4.2
  7. 范围参数页上,To Range, 输入: 1 和 7。
  8. 创建一个限制 SOP 节点。

引自 www.derivative.ca在线维基页面上的信息,“限制 SOP 从通过CHOP提供给它的示例创建几何图形。 它在示例中的每个点上创建几何图形。 使用通道页面上的输出类型参数可创建不同类型的几何图形。"

  1. limit1 CHOP 通道参数页面上,在 X 通道中输入 r,Y 通道中输入 g,Z 通道中输入 b。
     

    注:将 r g 和 b 切换到不同的 X Y 或 Z 通道可更改正在生成的几何图形。 所以您可能希望以后试试这个: 在输出参数页,针对输出类型,从下拉列表中选择每个点上的球。 创建一个 SOP 转 DAT 节点。 在参数页面上,针对 SOP,放入 limit1或将您的 limit1 CHOP 拖入参数中。 保留“提取”参数中的默认点设置。 创建一个渲染 TOP 节点,一个摄像头 COMP 节点和一个光 COMP 节点。 创建一个重新排序 TOP 并将输出 Alpha 设为 Input 11并将其连接到渲染 TOP。


    由于英特尔® 实感™ 摄像头中的图像发生变化,几何图形也会发生变化。 这是最终布局。


    Over TOP CHOP 节点中的最终图像。 通过更改限制 TOP 参数中的通道的顺序,您可以更改基于点云的几何图形。

在本文的第 2 部分,我们将讨论英特尔® 实感™ 摄像头 CHOP 以及如何为表演、球幕表演和 VR 创建渲染内容和实时内容。 我们还将展示如何使用 Oculus Rift CHOP 节点。 我们将讨论手势跟踪、面部跟踪和标记跟踪。

关于作者

Audri Phillips 是洛杉矶的一位视觉论者/3D 动画师,在 Sony*、Rhythm and Hues*、Digital Domain*、Disney* 和 Dreamworks* 动画电影等工作室从事超过 25 年的视效/娱乐业工作,拥有丰富的经验。 她起初是一位画家,后来被基于时间的艺术所吸引。 她一直热衷于使用新工具,在将计算机动画/艺术用于实验电影作品(包括沉浸式表演)方面是行业先驱。 现在,她已将自身才能用于 VR 创作。 最近,三星* 已将其作品融入到了新的 Gear Indie Milk VR 渠道之中。

她最新的沉浸式作品/动画包括: 洛杉矶剧院中心 2015“内爆舞蹈节 (Implosion a Dance Festival)”的多媒体动画、Vortex Immersion 圆顶的 3 场球幕音乐会,其中一场由著名作曲家/音乐家史提夫•洛奇 (Steve Roach) 指挥。 她的第四场球幕音乐会“无情的宇宙”将于 2015 年 11 月 7 日上演。 她还为 2014 年动漫大会上展出的电视连续剧“君士坦丁(Constantine)*”创作了面向圆顶演出的动画内容。 她的几部球幕作品“迁移 (Migrations)”和“无情的美丽 (Relentless Beauty)”已被推荐参加 "Currents"(圣达菲国际新媒体艺术节)和德国的耶拿球幕节。 她在洛杉矶的 Young Projects 美术馆展示自己的作品。

她为英特尔撰写在线内容和博客。 Audri 是伍德伯里大学的兼职教授、洛杉矶抽象电影集团的创始成员和领导者、Hybrid Reality Studio(专注于创作 VR 内容)的创始者、IOTA 中心的董事会成员以及洛杉矶艺术实验室的展示成员。 2011 年,Audri 成为了 Vortex Immersion Media 和 c3: CreateLAB 的驻留艺术家。


英特尔推出 AVS 2.0 比特流,提升解码器验证效率

$
0
0

Intel Stress Bitstreams & Encoder masthead Chinese

English version

英特尔宣布在其企业级视频合规性产品 Intel® Stress Bitstreams and Encoder (Intel® SBE) 中新增音视频编码标准 (AVS) 2.0 支持。 在过去十年里,第一版 AVS(AVS 和 AVS+)在中国得到了广泛的应用;之后我们开始致力于研发下一代产品,于 2013 年推出了 AVS 2.0,旨在提供质量显著提高的视频。通过将 Intel® SBE 支持扩展到 AVS 2.0,英特尔帮助视频解决方案提供商以高品质的、经过良好测试的产品最快强势进驻市场。Intel® SBE 还支持 HEVC 和 VP9。

在本版本 (2016 R3) 中,Intel® SBE 提供全面的 AVS 2.0解码器一致性验证比特流,包括 Main (4:2:0 8-bit) 和 Main 10 (4:2:0 10-bit) 格式设置,符合最新软件参考模型 (RD12) 的要求。通过首次在 Intel® SBE HEVC 和 VP9 比特流产品中引入的技术,英特尔可提供 AVS 2.0 在语法和价值层面极高的覆盖率。随着 AVS 2.0 完成其标准化流程,Intel® SBE 也将实现更新。

Intel® SBE中了解更多信息 English | Chinese PPT

立即获取免费试用版AVS 2.0 | HEVC | VP9

 

Intel SBE is part of the Intel® Media Server Studio family of products.

设备使用现状: 开发人员在 2016 年及未来面临的机遇

$
0
0

作者:Karen Marcus

最近,英特尔用户体验创新经理 Daria Loi 博士和她的团队实施了一项调查,以了解全球技术用户对其计算设备的使用感想。 此次调查的标题是“使用现状: 全球视角”,研究了用户最喜欢什么设备、最常使用什么设备、处理某些任务时使用什么设备(及原因)以及希望设备在哪些方面进行改进。 该调查采访了 6 个国家各年龄段的 1,200 名用户。

调查发现,尽管智能手机、笔记本电脑、台式机和平板电脑等各类设备可帮助用户处理许多关键工作和个人事项,且多数用户都拥有心爱的设备(见图 1),但许多方面仍有待改进。 本文详细讨论了此次调查的结果,认为开发人员在创建完善用户体验的软件方面大有机会。

Figure 1. Study responses for favorite device

图 1. 有关最喜爱设备的受访结果

没有万能设备

“使用现状: 全球视角”的调查结果表明,最喜爱智能手机的用户最多 (39%),其次是笔记本电脑 (30%),再其次是台式机 (21%)。 但这些设备的界面都有局限性,无法独自满足用户在工作、个人琐事及娱乐方面的所有需求。 例如,手机适用于拍照,听音乐,使用社交媒体以及与人联系,但由于屏幕尺寸和(真实或认为的)安全原因,它们并不同等适用于购物、银行业务办理、图像编辑和电子邮件发送等任务。

Loi 博士表示:“智能手机非常便携,因此最常为人们拿起。 我们可能会因为这种设备的受欢迎程度而认为它完美无缺,但目前而言,没有完美的设备。正因如此,用户常常拥有多种设备。 然而,并非所有的当前用户或新用户 —— 尤其是发展中国家的用户和年轻用户 —— 都买得起多种设备,他们也不想到处带着这些设备。 因此,作为技术开发人员,我们面临的问题是‘如何在未来帮助用户使用单一设备处理一切所需事项,而无需花钱购买和费神使用多种设备。 我们如何帮助他们化繁为简?’”

在寻找融合可能性时,开发人员可能需要关注用户业已青睐的设备功能。 当被问及设备的最重要特性是什么时,受访者回答最多的是操作系统,其次依次为性能、屏幕尺寸、易用性和品牌(见图 2)。 Loi 指出,易用性应该受到格外关注,因为有关易用性的“反馈会直接影响开发人员,易用性不可或缺,否则用户不会买账。”

Figure 2. Study responses for most important features

图 2. 有关最重要特性的受访结果

设备多样性

根据调查,用户在执行一些功能时对设备的偏好并不明显。 这些功能包括阅读本地存储的书籍、杂志和文本;浏览本地或在线存储的照片;即时聊天;交互式短信平台;视频聊天和会议;以及玩休闲游戏。 对于这些功能,Loi 表示:“用户会使用具备相应功能的设备。”

根据所在的场所,用户会使用不同的设备。 在家时,用户会做一些需要使用笔记本电脑或 PC 的事情,如网上购物、网上银行业务办理、学习以及玩高级游戏。 在工作或上课时,用户会在笔记本电脑或 PC 上处理一些任务,包括展示报告、创建和编辑文档、发送电子邮件以及查阅在线新闻或短信,也会使用智能手机进行一些操作,如查看天气信息和日历。 此外,在网吧和类似的专门场所,用户使用 PC 较为普遍,通常的任务包括使用 VoIP、参加视频会议以及更新博客或网站。

在途中,智能手机是搜索位置、导航、拍照、录制视频和听音乐等任务的理想之选。 Loi 解释道:“在不同地方,用户的期望有所不同, 他们对设备响应速度的容忍度也会有所不同。 他们的期望会随着环境的改变而改变。 为此,开发人员需要创建能够适应各种环境的应用,以便用户不论在什么场合都可享受无缝体验。

智能手机更加智能

一些任务与设备无关,而另一些任务则经常在特定设备上执行。 43% 的受访者表示使用智能手机来处理日常任务,如查看天气信息、存储联系信息以及使用日历;47% 表示智能手机最适合搜索位置和导航;以及 62% 表示智能手机最适合拍照和录制视频(见图 3)。

Figure 3. Study responses for favorite device for locate and check functions

图 3. 有关执行定位和查看功能时最喜爱设备的受访结果

然而,对于通过智能手机在网上购物,用户会有所迟疑,因为他们感觉智能手机不太安全。 一些受访者还特别提到,他们无法始终看到屏幕的全部内容,担心因未看到某个按钮或其他什么要素而无法按照自己的意愿完成购买。 然而,Loi 表示:“用户愿意在任何设备上执行这些任务,因此,开发人员有机会创建可帮助用户安全操作的软件和基础架构。 这一机会正变得日益重要,而且 Google 和 Apple 正在推出将智能手机用作信用卡的解决方案。

智能手机的其他潜在改进之处包括降低用户在路途中或其他设备不可用时对这些设备的依赖。 例如,智能手机如何提供更丰富的办公功能? 鉴于用户越来越多地将手机用作摄像主力,我们该如何丰富摄像头的功能? 既然用户喜欢在手机上听音乐,我们可为智能手机配备更出色的相关功能和用户界面吗?

在智能手机方面,开发人员还面临一个机遇,即增强智能手机在教育方面的实用性。 Loi 指出:“青少年和年轻人无法想像没有手机的生活,但这些设备很少被用于学校课程教学中。 事实上,我们会要求他们将设备留在家中或关闭设备;但对他们而言,智能手机是魅力无穷、惹人怜爱的必备伴侣,有助于增添学习的乐趣。 有鉴于此,我们面临的挑战是与教育者合作,开发可助力实现流畅、无缝、愉悦、相关和深度学习的解决方案。

PC 性能独占鳌头

尽管用户钟爱手机,但在处理某些任务时,笔记本电脑和一体机则是他们的首选设备(见图 4)。 具体而言,38% 的用户选择笔记本电脑编辑或修改媒体内容,47% 选择它们创建或编辑文档,36% 喜欢使用它们更新博客或网站,41% 使用它们办理网上银行业务和支付账单,44% 使用它们浏览想要购买的产品,41% 使用它们在网上购物。 Loi 指出,屏幕尺寸是上述偏好的主要原因,并表示:“大屏幕更适合浏览各种内容,以及开展精细工作。 而且,许多软件包并不支持智能手机,或价格过于昂贵。 笔记本电脑的软件生态系统以及实用的物理性能优势让它们成为处理这些任务的理想选择。”

Figure 4. Study responses for favorite device for online purchasing

图 4. 有关网上购物时最喜爱设备的受访结果

受访者表示喜欢将笔记本电脑用于通信和娱乐,如观看在线视频 (36%);观看本地存储的视频 (37%);上传、下载、分享或传输媒体内容 (38%);发送电子邮件 (42%);以及进行 IP 语音 (VoIP) 通信和使用其他在线语音平台 (35%)(见图 5)。 Loi 解释道:“这些应用需要智能手机尚不具备的出色性能。 未来,PC 功能可能会迁移至小型设备。 再次说明,要实现这一点,除轻松传输媒体内容所需的合适端口外,合适的生态系统、软件、中间价、界面和基础架构都不可或缺。”

Figure 5. Study responses for favorite device for writing and talking

图 5. 有关书写和谈话时最喜爱设备的受访结果

受访者表示需要笔记本电脑性能和屏幕尺寸的其他任务包括展示报告 (59%)、玩高级游戏(笔记本电脑为 24%,台式机为 25%)、在线浏览或查看信息 (38%)、学习 (47%) 以及阅读在线新闻或文本 (39%)(见图 6)。 Loi 表示:“用户可通过智能手机实施其中一些功能,但手机不像电脑一样能够与其他设备(如投影仪)有效通信。性能限制使手机无法用于高级游戏等用途,而较小的屏幕尺寸使其不便用于学习或研究等需要长时间集中精神及处理多种任务的用途。”

Figure 6. Study responses for favorite device for reading, learning, and research

图 6. 有关阅读、学习和研究时最喜爱设备的受访结果

关于技术

为更好了解受访者对其设备的看法,Loi 和她的团队采访了其中一些人,以收集定性信息,丰富此次全球调查收集的定量信息。 一项重要发现是,用户对于技术越来越爱恨交加。 Loi 表示:“用户意识到生活离不开设备,但同样感到自己成为了设备的‘奴隶’”。 他们普遍‘想持续利用设备处理一些重要事项,但希望设备更加智能,在不被需要时能够靠边站’。 例如,在会议中,智能手机应该通过其环境感知功能拒绝来电。 机遇无限 —— 我们可以发挥聪明才智,创造能够学习用户行为并在不被需要时主动靠边站的机器。”

“我怀念不必时刻处于在线状态的岁月。” —Aron,20 几岁

在“爱”的方面,受访者表示设备有一些好处,包括可帮助他们简化生活、实时与人联系等。 但是,Loi 表示,即使是用户喜欢的优势功能尚有完善的空间。 她表示:“我们可以如何突破现有工具,进一步丰富通信功能? 我们可以开发什么技术解决方案来增强通信的临场,无论相距多远?

“我希望更真实地与家人通信,而不是在通话时单调乏味地看着设备。”
—Carol,40 几岁

用户一方面热爱技术,一方面又为之苦恼。 用户希望一些方面得到改进,主要包括设备电池耗电过快,运行缓慢或停止运行,容易感染病毒和泄露隐私,尺寸过大、不易于携带,容量过小、无法存储所有内容,以及不易于操作等。 受访者的一项主要不满是设备移动性能有限。 Loi 表示:“在这个移动使用需求日益增长的社会中,日常工作和生活无法离开各类设备。 但是,这些设备必须使用电池来运行。 在与用户对话时,我发现充电显然已成为多数用户的困扰,让他们无法真正享受高效的移动使用体验。 如今,我们面临大量机遇,而无线充电能够产生巨大效益;不过,我们需要高效、可靠和直观的生态系统支持它的使用。” 她指出,密码是“我们需要解决的另一个问题”,而且我们还面临技术变化过快的挑战,这需要我们不断将用户从旧版迁移至新版操作系统和应用。

“新鲜事物层出不穷,真是应接不暇。” —Raul,20 几岁

在回答有关各种困扰的问题时,受访者对技术如何更好地服务于自己发表了独到见解。 他们希望技术能够更加个性化、节能、经济和普及,更好地支持语音功能,独立于操作系统,等等,不一而足。 他们还希望技术能够根据环境信息更有效地预测一些用户需求,从而减少给用户造成的烦恼。 Loi 表示:“用户希望功耗、控制和选项能够进一步优化。 此外,易用性也至关重要。 对于开发人员而言,可用性是优先考虑要素。 如果用户找不到一项功能,那这项功能则没什么意义,用户也不会购买相关应用。”

“我喜欢选择, 不喜欢被告诉要怎么做。”—Francis,30 几岁

尽管快速变化令人感到茫然,但用户还是对即将出现的新鲜事物充满期待。 Loi 表示,许多受访者描述了希望他们的设备配置哪些面向未来的特性,一些受访者将其称为“钢铁侠”体验。 这些特性包括在思索中交流、无需将想法表达或书写出来的能力;支持聊天的实时全息图像;以及可在家中任何位置接收语音命令的超灵敏麦克风。 Loi 表示:“社交媒体和好莱坞对于未来事物提出了各种奇思妙想,让人们充满了期待。 一些人不明白这些面向未来的技术为何还未问世。 尽管这些技术非常复杂,但许多人期待它们尽早上市,而这通常不切合实际。

“向他人准确展示自己想像的能力 , 就像 3D 全息图。” —Sheila,20 几岁

总结

近年,计算技术实现了跨越式发展,许多设备功能深受用户喜爱。 然而,技术的便捷性和用户友好性在许多方面还有待改进。 英特尔的 Loi 博士领导了此次“使用现状: 全球视角”的调查,其目的在于了解全球用户当前使用设备的情况,以及希望未来如何使用设备。 此次调查显示,开发人员在以下方面面临重要机遇:

  • 简化功能,以便用户(花钱购买)和携带更少的设备。
  • 继续提升可用性。
  • 提升智能手机用于网上购物时的安全性和可视性。
  • 改进智能手机的功能(如摄像头和音乐访问),以取代单独的设备。
  • 增强智能手机在教育方面的实用性。
  • 增强 PC 软件包对于智能手机的可用性和支持,并增加智能手机的容量,使其能够处理更强大的应用。
  • 为用户创造更加无缝、环境感知程度更高的体验。
  • 改进通信技术,让用户更亲近地与人通信。
  • 延长充电后电池的使用时间,并探索新的设备充电方式。
  • 帮助用户从旧版迁移至新版应用和系统。

Loi 表示,关键是塑造更加美好的未来愿景。 为此,她表示:“在开发新的产品时,了解用户做什么、需要什么及渴望什么至关重要。 此次调查的目的是告诉行业同仁在开展工作时,需要收集相关数据,清晰了解用户在做什么以及关心什么。”

关于作者

Karen Marcus, M.A. 是一位拥有 18 年经验、屡获殊荣的技术营销撰稿人。 她为英特尔、IBM、三星、惠普、Amazon Web Services 和微软撰写了一些案例研究、手册、白皮书、数据表、文章、网站报道、视频脚本及其他内容。 Karen 熟悉当前的各种技术和解决方案,如云计算、企业计算、个人计算、IT 外包、操作系统和应用开发等。

如何使用英特尔® 系统调试器在早期启动阶段检查并读取开机自检编码

$
0
0

1. 背景 

   在借助英特尔平台开发系统过程中,您可能会面临系统甚至在启动的初始阶段也无法启动的问题。 为了确定问题,您连接 JTAG 并使用英特尔系统调试器 (R) 进行源代码行调试。 不过,如果没有源代码或 BIOS 或固件的符号文件,那么你不能做源代码行调试。 在这种情况下,您可以在遇到困难时获得开机自检编码,您将开机自检编码发送到 BIOS/固件团队。 其次,如果问题只在运行时发生,这意味着当您运行时,没有发生任何问题或只是偶发性问题,那么您需要在问题发生之前,检查开机自检编码作为软件的检查点,然后就可以猜问题点了。 最后,如果您有关于开机自检编码的信息,但没有 BIOS/固件的源代码,那么您可以通过检查开机自检编码来猜引起问题的位置。

    当系统 BIOS 或固件的早期启动阶段中有任何问题时,邮政代码非常有用。 但许多嵌入式系统或封闭机箱没有开机自检编码 LED。 但不要担心;您可以通过 JTAG 和英特尔系统调试器 (R) 来检查开机自检编码。 在文本中,我将解释如何检查英特尔系统调试器 (R) 内的开机自检编码。

 

2. 开机自检编码

   开机自检编码是一个用于调试的传统单元。 在加电自检 (POST) 过程中,当它们将代码发送至 I/O 80h 时,开机自检编码在 BIOS/固件中提供进度指示。

(1) 可以从开机自检编码中获得什么信息

  • 开机自检编码告知 BIOS/固件中启用和传递哪个主要特性。 
  • 开机自检编码可用于在初始化系统时指示设备或特性错误。

(2) 在硬件 (LED) 中哪里可以找到开机自检编码(如有)

POST 卡

(PCI 附加卡)

POST 卡解码端口并在 LED 显示屏上显示内容。

POST 卡必须安装在 PCI 总线连接器 1 上。

机载 POST 代码

LED 显示屏

一些英特尔® 台式机主板包括用于显示 POST 代码的板载 LED

(3) 每个开机自检编码描述的示例(典型用法)

范围类别/子系统
00 – 0F调试代码: 可供任何 PEIM/驱动程序用于调试
10 – 1F主机处理器
20 – 2F内存/芯片组
30 – 3F恢复
40 – 4F留作未来使用
50 – 5FI/O 总线: PCI、USB、ISA、ATA 等
60 – 6F当前未使用
70 – 7F输出设备: 所有输出控制台
80 – 8F留作未来使用(新的输出控制台代码)
90 – 9F输入设备: 键盘/鼠标
A0 – AF留作未来使用(新的输入控制台代码)
B0 – BF启动设备: 包含固定介质和可移动介质。
C0 – CF留作未来使用
D0 – DF启动设备选择
E0 – FFE0 - EE: 其他代码
F0 – FF: FF 处理器异常

 

3. 使用英特尔系统调试器 (R) 检查开机自检编码

(1) 下载和安装英特尔 System Studio (R) 旗舰版或英特尔系统调试器 NDA 版本(R)(您可能需要与英特尔签订保密协议。)

https://software.intel.com/en-us/intel-system-studio

(2) 转至安装目录,运行批处理文件作为您的英特尔平台

例如,如果您的产品正在使用英特尔凌动(R),那么请选择凌动产品的批处理文件。

这一批处理文件可通过产品更新进行更改。

(3) 菜单: 文件 → 连接... 选择您的探针和核心并连接。

(4) 菜单: 视图 → 断点并转至“创建断点”对话框并右击鼠标,选择“创建...”。

(5) 在“创建断点”窗口中,选择“数据”选项卡,在“位置”中添加 0x80,并选择 IO 读写。

当系统读取任何数据或将数据写入到 0x80 端口时,系统将停止。

(6)  菜单: 选项 → 选项... 并选择“重新启动关闭后运行”,使复位中断

系统将在重置后停止,您可以检查 IO RW 断点并运行。

(7) 在命令行控制台中输入重启。

系统将重启。

xdb> 重启

(8) 重启后,系统将通过复位中断来停止,检查您设置的断点并再次运行系统

xdb> 运行

(9) 当系统停止在系统通过 0x80 编写开机自检编码的断点时,您可以检查开机自检编码。

您也可以通过更改端口号来检查其他端口号。

xdb> 显示端口 0x80

e.g.) 您可以看到,当前的开机自检编码是 0xAB。

幸运的是,我的测试平台有板载开机自检编码,可以看到它也是 0xAB。

 

     简单地说,您可以在没有 LED 开机自检编码显示屏的英特尔平台中使用英特尔系统调试器 (R),从而轻松检查开机自检编码。 通过检查开机自检编码,您可以通过添加用户定义的开机自检编码,获得几个调试信息——BIOS/固件代码的进度,启用了哪些设备或软件特性,BIOS/固件的检查点。 在启动失败的极早期阶段,获取关键调试信息可能很简单。

<参考资料>

来自英特尔台式机主板网页的开机自检编码信息: http://www.intel.com/support/motherboards/desktop/sb/CS-025434.htm

 

循序渐进:使用 LEGO* Minifigures Online 创建更好的游戏

$
0
0

下载  Lego Minifigures Optimization.pdf

游戏厂商可在运行 Microsoft Windows* 的 PC 和运行 Android* 的移动设备上提供卓越的游戏体验,从而迎来前所未有的市场机遇。优化 英特尔® 酷睿™ 处理器英特尔® 凌动™ 处理器的显卡正迅速成为一种战略需要。

随着移动游戏的发展超越普通休闲游戏,预计这一细分市场的收入将会大幅增长。事实上,据市场研究公司 Newzoo 预测,移动游戏将取代游戏机,成为 2015 年收入最多的游戏细分市场,预计将达到 300 亿美元,到 2017 年将达到 409 亿美元。1

为了加强其 20 多年来在游戏领域的优良口碑,丰乐公司开发了《迷你乐高*在线》(LMO),并将采用英特尔® 架构的 2 合 1 PC和 Android 平板电脑定为主要的目标设备。乐丰公司以过去的成功记录为基础,对相关技术进行了优化,并在这两款平台上提供了卓越的图形体验,其中包括《无尽的旅程》(在 Metacritic 所有时代的 PC 游戏排行榜上,排名第 59 名)2、《混沌在线*》、《科南时代*》和《神秘世界*》。

凭借英特尔® 图形技术,获得先进的像素同步效果

最新一代的英特尔® 图形硬件扩展了英特尔在整个行业的创新领导地位,其中包括全面支持 DirectX* 12 以及推动下一代游戏采用高级特性。一个典型的示例便是采用 DirectX 11 的英特尔像素同步扩展,实现了可编程混合操作。

这组功能正被广泛采用,成为了 DirectX 12 标准的一部分(采用“光栅顺序视图”名称),得到了其他厂商(如 Nvidia Maxwell*)提供的图形硬件的支持,并且在 OpenGL* 中得到了启用,进行了 GL_INTEL_fragment_shader_ordering扩展。

英特尔像素同步扩展支持开发人员对像素着色器操作的顺序进行控制。它可用于执行诸多功能,如自定义混合、高级体积阴影和无规则透明度。它提供了一种方法可供序列化和同步对多个像素着色器中的某一像素的访问,并保证决定性像素变化。采用英特尔® 硬件时,序列化被局限到直接重叠的像素,因此对于其余代码,性能保持不变。

由这组特性启用的算法示例包括如下:

《迷你乐高在线》使用 AVSM 在 Windows 和 Android 这两款平台上实现高级的烟云效果。图 1 到图 4 展示了在采用英特尔处理器的 2 合 1 PC 上,禁用 AVSM 与启用 AVSM 时同一游戏场景的比较。在这些场景中使用 AVSM 所提升的图形质量也提供了更加逼真的身临其境般游戏体验,而且基于英特尔凌动 X5 和 X7 处理器的 Android 平板电脑上也实现了这一效果。


图 1.Actually Hopping Antelope – 第 2 关”场景,禁用了 AVSM


图 2.Actually Hopping Antelope – 第 2 关”场景,启用了 AVSM


图 3.Scarlet Serrated Brainiac – 第 5 关”场景,禁用了 AVSM


图 4.Scarlet Serrated Brainiac – 第 5 关”场景,启用了 AVSM

跨平台可玩性和扩展

《迷你乐高在线》已采用第四代英特尔酷睿处理器进行了优化。它还为 2 合 1 PC 的笔记本电脑模式和平板电脑模式提供了支持,如图 5 和 6,通过将设备转换为平板电脑模式,支持用户在更加休闲的环境中从笔记本电脑中获得强大的功能。这种灵活性支持玩家随时随地以任何模式畅玩 LMO,这样,他们就有更多机会玩游戏。


图 5.Scarlet Serrated Brainiac – 第 5 关”场景,采用笔记本电脑模式

请注意,为玩家提供的更大、更便捷的触摸图标。


图 6.Scarlet Serrated Brainiac – 第 5 关”场景,采用平板电脑模式

跨英特尔® 平台的增强型图形功能支持用户采用高端 Windows 台式电脑、Windows 笔记本电脑、2 合 1 设备以及搭载了英特尔凌动处理器的 Windows 或 Android 平板电脑,在同一个身临其境般的游戏世界一起畅玩。

英特尔® 酷睿™ 处理器有助于延长电池续航时间

优化游戏以降低功耗不仅是用户体验的一个重要方面,而且也是获得积极评价的关键因素。许多游戏本可以获得良好的口碑,但却因“非常耗电”这样的一星评价而受到严重打击。

英特尔和乐丰公司携手合作,在《迷你乐高在线》的用户控制选项添加了“省电模式”,如图 7。采用第四代英特尔酷睿处理器时,此功能可将电池续航时间延长近 80%,采用第五代英特尔酷睿处理器,则延长超过 100%。3


图 7.《迷你乐高在线》中的“省电模式”

延长电池续航时间的根本办法是降低处理器和 GPU 的使用率。《迷你乐高在线》中的“省电模式”通过封盖帧率为每秒 30 帧、禁用各向异性过滤、后处理 FX 和抗锯齿来实现这一目标。

这些措施的总体效果是减少帧绘制时间,允许处理器和 GPU 在闲置期间进入更深沉的睡眠状态,从而延长了电池续航时间。这些电池续航时间优化成果详情可通过 2015 年游戏开发者大会提供的“功效编程: 乐丰公司如何将《迷你乐高在线》的游戏时间增加 80%演示稿获取”。

对基于英特尔® 凌动™ 处理器的 Android 设备进行的优化

英特尔在 2014 年成功实现了平板电脑处理器出货量超过 4,000 万的目标4,成为最大的平板电脑芯片供应商,并且在 Android 细分市场的份额也不断增加。英特尔将这一发展势头带到了 2015 年,推出了英特尔凌动 X5 和 X7 处理器,其中采用了业界领先的 14 纳米制程工艺和紧凑的低功系统级芯片 (SoC) 设计。

  • 游戏性能的提升包括 Gen 8 显卡以及对 64 位处理和多任务处理能力的支持。
  • 延长的电池续航时间通过多项功能实现,其中包括 Intel® Display Power Saving Technology 和 Intel® Display Refresh Rate Switching Technology,帮助适时地减少面板背光源和刷新率。

在提升 Android 设备上的《迷你乐高在线》性能方面,最初焦点是英特尔平台的本地编译。非本地二进制代码,如针对 ARM* 进行编译的代码,必须凭借英特尔凌动处理器采用即时编译功能进行运行,这就会带来额外的处理负担,从而干扰了高级离线编译。

英特尔曾与乐丰公司携手合作,以确保 Android 安装包提供针对英特尔架构的本地二进制代码,从而克服之前的局限。事实上,为使用 Unity* 游戏引擎的 Android 游戏提供这项支持非常简单,正如英特尔® 开发人员专区文章中讨论的“为使用 Unity* 游戏引擎的 Android* 应用添加 x86 支持”。更多详情,请参考“Google Play* 商店提交流程: Android* APK” 和 “如何借助多 APK 支持在面向 x86 Android* 设备的 Google Play 上发布应用”文章。

结论

英特尔架构为游戏开发人员提供了一系列出色的机遇,帮助增加他们的潜在细分市场份额。经过优化的游戏可在各种目标系统上提供出色的图形化用户体验,从高端台式电脑系统到笔记本电脑、2 合 1 设备和基于英特尔凌动处理器的平板电脑。启用可响应每款平台需求的游戏能为更广泛的可用性提供支持,并助力游戏公司在未来几年从持续扩展的移动游戏中获益。

关于作者

Filip Strugar 之前是一名游戏开发人员,现就职于英特尔公司担任软件图形工程师职务。他非常喜欢处理各种算法、发明 CMAA 等项目以及帮助游戏开发人员让他们的游戏通过英特尔图像硬件展现出最佳的性能。

Landyn Pethrus 是英特尔公司的一名工程师、狂热的游戏玩家和硬件发烧友。当 Landyn 不是在畅玩 Dota2 之 Ancient Apparition 的冰魂狙击、打 boss或求学深造,就是在俄勒冈州的河边钓鱼。

更多详情,请访问英特尔游戏开发人员社区,网址: https://software.intel.com/zh-cn/gamedev/tools

1 Newzoo BV,“2014 年全球移动游戏收入将达到 250 亿美元。”2014 年 10 月 29 日。www.newzoo.com/insights/global-mobile-games-revenues-top-25-billion-2014/

2 CBS Interactive 截至 2015 年 4 月 25 日。www.metacritic.com/browse/games/score/metascore/all/pc

3资料来源:内置英特尔® 电池消耗测试。如欲了解更多信息,请访问 https://software.intel.com/sites/default/files/managed/4a/38/Power_Efficient_Programming_GDC_2015_Final.pdf

4 Brian M. Krzanich,英特尔 CEO 致股东函,英特尔 2014 年年度报告。http://www.intc.com/common/download/download.cfm?companyid=INTC&fileid=819111&filekey=43FE7343-2D01-42E3-A09C-99A3BDEAEEE9&filename=Intel_2014_Annual_Report.pdf

 

声明

本文档不代表英特尔公司或其它机构向任何人明确或隐含地授予任何知识产权。

英特尔明确拒绝所有明确或隐含的担保,包括但不限于对于适销性、特定用途适用性和不侵犯任何权利的隐含担保,以及任何对于履约习惯、交易习惯或贸易惯例的担保。

本文包含尚处于开发阶段的产品、服务和/或流程的信息。此处提供的所有信息可随时更改,恕不另行通知。联系您的英特尔代表,了解最新的预测、时间表、规格和路线图。

本文所述的产品和服务可能包含与宣称的规格不符的缺陷或失误。英特尔提供最新的勘误表备索。

如欲获取本文提及的带订购编号的文档副本,可致电 1-800-548-4725,或访问 www.intel.com/design/literature.htm

英特尔、Intel 标识、Intel Atom、英特尔凌动、Intel Core 和英特尔酷睿是英特尔公司在美国和/或其他国家(地区)的商标。

*其他的名称和品牌可能是其他所有者的资产。

英特尔公司 © 2015 年版权所有。

使用 OpenCL™ 2.0 读写图片

$
0
0

致谢

非常感谢 Javier Martinez、Kevin Patel 和 Tejas Budukh 在审核本文和相关示例过程中所提供的帮助。

简介

OpenCL™ 2.0 问世之前,人们无法在同一 kernel 中读写图像。 图像通常声明为 “CL_MEM_READ_WRITE”,但图像传递至 kernel 后,必须是 “__read_only” 或 “__write_only”。

input1 = clCreateImage(
oclobjects.context,
CL_MEM_READ_WRITE|CL_MEM_COPY_HOST_PTR,&format,&desc,&input_data1[0],&err );
SAMPLE_CHECK_ERRORS( err );

代码 1. 图像缓冲区可通过 CL_MEM_READ_WRITE 创建

__kernel void Alpha( __read_write image2d_t inputImage1,
__read_only image2d_t inputImage2,
uint width,
uint height,
float alpha,
float beta,
int gamma )

代码 2. OpenCL 2.0 推出了在 kernel 中读写图像的功能

新增功能尽管非常直观,但需要注意几点(下一节讨论)。

Read-Write 图像的价值

尽管图像卷积不如新的读写图像功能有效,但需要就地完成的所有图像处理技巧都可从 Read-Write 图像中获益。 例如,可有效使用的流程是图像合成。

在 OpenCL 1.2 及早期版本中,图像通过 “__read_only” 和 “__write_only” 限定符来限定。 在 OpenCL 2.0 中,图像可通过 “__read_write” 限定符限定,并将输出复制到输入缓冲区中。 这样可减少所需的资源量。

自 OpenCL 1.2 起,图像是 read_only 或 write_image。 执行就地图像调整需要将图像视作缓冲区,并在缓冲区上操作(见cl_khr_image2d_from_buffer: https://software.intel.com/en-us/articles/using-image2d-from-buffer-extension)。

当前的解决方案将图像视作缓冲区,并操纵缓冲区。 将 2d 图像视作缓冲区也许不是自由操作,也会阻碍 read_image 中锁定和过滤功能的发挥。 因此,用户更希望使用 read_write 限定的图像。

示例概要

示例提取两张窗口位图图像 “input1.bmp” 和 “input2.bmp”,并将它们放在图像缓冲区中。 然后,这两张图像根据 α 值(已计算像素方程的权重因素,可作为选项传递)进行合成。

Using Alpha value 0.84089642

图 1. 使用 α 值 0.84089642

图像必须为 24/32 位图像。 输出为 24 位图像。 图像必须大小相同。 图像也可以是 ARGB 格式,因此加载时需将其考虑在内。

Using Alpha value of 0.32453

图 2. 使用 α 值 0.32453

ARGB 格式转换成 RGBA 格式。 改变 β 值会导致输出发生重大变化。

使用示例 SDK

SDK 展示了如何将图像合成用于读写图像。 使用以下命令行选项控制该示例:

选项

描述

-h, --help

显示文本并退出

-p, --platform number-or-string

选择设备所使用的平台

-t, --type all | cpu | gpu | acc | default | <OpenCL constant for device type>

按照类型选择执行 OpenCL Kernel 的设备

-d, --device number-or-string

选择执行所有材料的设备

-i, --infile 24/32-bit .bmp file

首个待读取 .bmp 文件的基本名称。 默认为 input1.bmp

-j, --infile 24/32-bit .bmp file

第二个待读取 .bmp 文件的基本名称。默认为 input2.bmp

-o, --outfile 24/32-bit .bmp file

待写入输出的基本名称。 默认为 output.bmp (面向 OCL1.2)和 20_output.bmp(面向 OCL2.0)

-a, --alpha floating point value between 0 and 1

非零正值,确定两个图像的合成程度。 默认 α值等于 0.84089642。 默认 β值等于 0.15950358。

示例 SDK 包含许多默认值,支持应用在不进行任何用户输入的情况下运行。 用户将能够使用 input .bmp 文件。 该文件也必须为 24/32 bmp 文件。 α 值可用来确定图像 1 高于图像 2 的凸显度,比如:

calculatedPixel = ((currentPixelImage1 * alpha) + (currentPixeImage2 * beta) + gamma);

用 1 减去 α 值就可得出 β 值。

浮动 β = 1- α;

这两个值可以确定图像 1 到图像 2 的权重分布。

γ 值可用于提高各像素。 默认值为 0。 但用户可以提高合成后整张图像的亮度。 

程序运行示例

Read Write Image Sample Program running on OCL2.0 Device

图 3. 在 OpenCL 2.0 设备上运行的程序

Read-Write 图像的局限性

障碍不能用于需要不同工作组同步的图像。 图像卷积需要同步所有线程。 有关图像的卷积通常会涉及两个矩阵进行数学运算,从而生成第三个矩阵。 使用高斯模糊就是图像卷积的例子。 其他例子包括图像锐化、边缘检测和浮雕。

我们来看看如何使用高斯模糊。 高斯滤波器是一种低通滤波器,可以清除高频率值。 这样会降低清晰度,进而导致类似模糊的效果。 采用高斯模糊与采用高斯函数(通常称为 “mask”)进行图像卷积相同。 为有效展示 Read-Write 图像的功能,需要进行横向模糊和纵向模糊。

这需要 OpenCL 1.2 通过两个步骤来执行。 一个 kernel 专门用于横向模糊,另一个用于纵向模糊。 这样,其中一种模糊将用作输入,而另一种取决于第一种模糊的执行结果。

__kernel void GaussianBlurHorizontalPass( __read_only image2d_t inputImage, __write_only image2d_t outputImage, __constant float* mask, int maskSize)
{
    int2 currentPosition = (int2)(get_global_id(0), get_global_id(1));
    float4 currentPixel = (float4)(0,0,0,0);
    float4 calculatedPixel = (float4)(0,0,0,0);
    for(int maskIndex = -maskSize; maskIndex < maskSize+1; ++maskIndex)
    {
        currentPixel = read_imagef(inputImage, imageSampler, currentPosition + (int2)(maskIndex, 0));
        calculatedPixel += currentPixel * mask[maskSize + maskIndex];
    }
    write_imagef(outputImage, currentPosition, calculatedPixel);
}
__kernel void GaussianBlurVerticalPass( __read_only image2d_t inputImage, __write_only image2d_t outputImage, __constant float* mask, int maskSize)
{
    int2 currentPosition = (int2)(get_global_id(0), get_global_id(1));
    float4 currentPixel = (float4)(0,0,0,0);
    float4 calculatedPixel = (float4)(0,0,0,0);     
    for(int maskIndex = -maskSize; maskIndex < maskSize+1; ++maskIndex)
    {
        currentPixel = read_imagef(inputImage, imageSampler, currentPosition + (int2)(0, maskIndex));
        calculatedPixel += currentPixel * mask[maskSize + maskIndex];
    }
    write_imagef(outputImage, currentPosition, calculatedPixel);
}

代码 3. OpenCL 1.2 中的高斯模糊 kernel

使用 OpenCL 2.0 是希望将两个 kernel 整合成一个。 使用障碍迫使横向模糊或纵向模糊在下一个模糊开始前完成。

__kernel void GaussianBlurDualPass( __read_only image2d_t inputImage, __read_write image2d_t tempRW, __write_only image2d_t outputImage, __constant float* mask, int maskSize)
{
    int2 currentPosition = (int2)(get_global_id(0), get_global_id(1));
    float4 currentPixel = (float4)(0,0,0,0);      
    float4 calculatedPixel = (float4)(0,0,0,0)
    currentPixel = read_imagef(inputImage, currentPosition);
    for(int maskIndex = -maskSize; maskIndex < maskSize+1; ++maskIndex)
    {
        currentPixel = read_imagef(inputImage, currentPosition + (int2)(maskIndex, 0));              calculatedPixel += currentPixel * mask[maskSize + maskIndex];
    }
    write_imagef(tempRW, currentPosition, calculatedPixel);

    barrier(CLK_GLOBAL_MEM_FENCE);

    for(int maskIndex = -maskSize; maskIndex < maskSize+1; ++maskIndex)
    {
        currentPixel = read_imagef(tempRW, currentPosition + (int2)(0, maskIndex));
        calculatedPixel += currentPixel * mask[maskSize + maskIndex];
    }
    write_imagef(outputImage, currentPosition, calculatedPixel);
}

代码 4. OpenCL 2.0 中的高斯模糊 kernel

我们发现,障碍的效率非常低。 如果不首先执行横向模糊,使用障碍将无法确保横向模糊在纵向模糊开始之前完成。 这会产生不一致,进而导致多次运行。 障碍可用来同步一个组内的线程。 出现这种问题的原因是,边缘像素从多个工作组读取,且无法同步多个工作组。 我们最初假设可以使用 read_write 图像实施单种高斯模糊,但证明是错误的,因为工作组内的数据相关性无法在 OpenCL 中同步。

参考资料

关于作者

Oludemilade Raji 是英特尔公司视觉与并行计算事业部的一名显卡驱动程序工程师。 他拥有四年的工作经验,致力于 OpenCL 编程语言和开发英特尔高清显卡驱动程序,包括开发 OpenCL 2.0。

 

Robert Ioffe 是英特尔软件及解决方案事业部的技术咨询工程师。 他是在英特尔锐炬和英特尔锐炬 Pro 显卡上进行 OpenCL 编程和 OpenCL 工作负载优化的专家,拥有丰富的英特尔显卡硬件经验。 他积极参与 Khronos 标准工作,关注于构建最新的特性原型并确保它们在英特尔架构上出色运行。 最近,他一直从事于构建 OpenCL 2.0 的嵌套并行化 (enqueue_kernel functions) 函数的原型,并编写了大量示例来演示嵌套并行化功能,包括面向 OpenCL 2.0 的 GPU-Quicksort。 他还录制并发布了两段 “优化简单的 OpenCL Kernel” 视频和 “OpenCL 2.0 中的 GPU-Quicksort 和 Sierpinski Carpet” 视频。

 

您可能还会对以下内容感兴趣:

优化简单的 OpenCL Kernel: 调节 Kernel 优化

优化简单的 OpenCL Kernel: Sobel Kernel 优化

OpenCL 2.0 中的 GPU-Quicksort: 嵌套并行性和工作组扫描函数

OpenCL 2.0 中的 Sierpiński Carpet

下载

一个经常被忽略的游戏性能衡量指标——帧时间

$
0
0

下载 PDF

作为质量保证供应商,Enzyme 每周都会测试大量游戏。当涉及到兼容性和性能测试时,我们发现了在许多情况下,通过帧速率基准测试收集的数据并不能展示明显的性能问题。

评估性能时,帧速率或每秒帧数 (FPS) 虽是可行、简单的测量方法,但并不是要考虑的全部数据。另一项关于帧要考虑的重要指标是帧时间。

帧时间通常指的是软件渲染每个帧所需的时间。具体而言,这一时间通过基准测试运行时间乘以应用的平均 FPS 得出,或者在基准测试运行期间渲染的总帧数,而非应用实际运行的秒数。这些数据可以使用英特尔® INDE 图形性能分析器套件等基准测试工具进行收集,并且在评估性能时是重要的考虑因素。

为了说明这一点,以一秒钟的帧时间为例。如果在前 500 毫秒渲染了 60 帧,在后 500 毫秒没有帧,则帧速率测量结果将仍然显示为平均 60 FPS,这是因为这一秒钟显示的总帧数确实为 60。

虽然不可能发生这种情况,但它展示了一种最差的情况:被帧速率数据所忽略的可见的游戏内问题。

帧时间测量提供了更精确的数据,因为它记录了每个显示的帧之间的时间间隔。在上述同一示例中,运行基准测试时,500 毫秒峰值可轻松、清楚地进行识别,助力您的团队解决可能会出现的性能下降问题。

Small hitches in frames
小问题可以通过帧时间进行识别,却会被帧速率彻底忽略。

从测试的角度来看,当比较不同的硬件时经常会分析这类数据,以确定出现性能问题的原因。与帧速率相比,我们经常更依赖帧时间,这是因为涉及到游戏的性能时,它的线性性质可以让它更轻松地进行分析并且通常可提供更可靠的信息。

例如,我们使用了帧时间来比较不同存储设备的性能。下图表示了机械硬盘和固态盘之间的明显差别,但这一差别只能通过帧时间展示。

SSD&#039;s frame time
固态盘的帧时间要比机械硬盘稳定。 两者的帧速率则非常相似。

同样,FPS 基准也没有展示性能问题,而帧时间测量结果则清楚地展示了:与采用固态盘的系统相比,采用机械硬盘的系统具有显著增多的问题。这类比较可以证明对重纹理流的游戏非常有用,因为我们可以确定使用某类存储设备是否会造成瓶颈。

最后,FPS 这种测量方法往往会拉平非常短的峰值。帧时间将捕捉一切;对它进行分析可能有点更吓人,因为它包含了更多的数据,但如果您想彻底排查和调试软件,则它是一个重要的考虑因素。

如果您对帧时间测量存在疑问或想讨论其他性能分析最佳实践,请随时与我们联系。

关于作者
Enzyme 成立于 2002 年,由视频游戏行业的两名先驱 Yan Cyr 和 Emmanuel Viau 建立。 利用 Enzyme 成员的国际经验和专业知识,我们将创意和学科知识相结合,创建了可向客户的产品增添价值的质量保证 (QA) 服务和测试方法。

我们是一个充满热情的社区,致力于提供有关视频游戏、应用、软件和网站方面的质量保证服务。 无论您是需要质量保证测试、PC/手机兼容性测试、项目评估或小组座谈会,还是在寻找本地化或语言资源,还是需要使用相关方法或咨询项目管理顾问,与我们合作都能帮助您实现目标。

我们的使命就是让我们热情的员工采用您的项目并帮助您获得成功。

加速媒体处理: 哪种工具适合我?

$
0
0

英特尔拥有众多出色的软件开发工具,其中包括用于优化媒体、视频和图形的工具。 但有时候很难确定哪款工具能够最好地满足您的特定需求和用途。

下面将您找到一些见解,旨在帮助您更快速地找到合适的媒体工具,以便您专注于真正有趣的内容,比如构建新的媒体解决方案,改进媒体应用性能或视频流和质量,甚至转变为更高效的格式,如 HEVC。

加速媒体处理 - 哪种工具适合我?
英特尔媒体工具平台/设备目标和用途

英特尔® 媒体软件开发套件 (SDK)

针对以下对象开发:

  • 英特尔® 酷睿™ 或酷睿™ M 处理器
  • 英特尔® 赛扬™、英特尔® 奔腾™ 和英特尔® 凌动™ 处理器的特定 SKU,采用支持英特尔® 快速视频同步的英特尔高清显卡
  • 客户端设备 - 台式机或移动应用
  • 操作系统 - 仅限 Windows*

用途和需求

  • 快速视频播放、编码、处理、媒体格式转换或视频会议
  • 加速处理 RAW 视频或图像
  • 截屏
  • 音频解码和编码支持

英特尔® Media Server Studio

 

 

 

 

提供 3 个版本

  • 社区
  • 基本要素
  • 专业

针对以下对象开发:

格式支持 - HEVC、AVC 和 MPEG-Audio

用途和需求

  • 高密度、快速的编码、解码和转码
  • 优化媒体/GPU 管线的性能 (-> VTune)
  • 增强的图形编程或可视化分析(用于 OpenCL™ 应用)
  • 对编码质量的初级控制
  • 调试、分析和性能/质量优化工具
  • 迁移到优质的 HEVC
  • 需要测量视觉质量(视频质量卡尺)
  • 寻找一个企业级电视电影隔行换向器(高级电视电影各行换向器)
  • 音频编解码器
  • 截屏

英特尔® Video Pro Analyzer

格式支持 - HEVC、VP9、AVC 和 MPEG-2

用途和需求

  • 针对 HEVC、AVC、MPEG-2 或 VP9 解码器或编码器、分析流而开发
  • 愿意节省时间和资源
  • 调整编码管线
  • 检查全解码和编码流程、调试和优化编码器
  • 测量和改进视觉质量(视频质量卡尺)
  • 获取详细的视频流数据
  • UHD 创新,提供 HDR 颜色支持

英特尔® Stress Bitstreams & Encoder

格式/配置文件支持 - HEVC、VP9、AVS 2.0

用途和需求

  • 针对 HEVC/VP9 编码器、转码器、播放器和流媒体解决方案执行广泛的企业级生产规模媒体验证和调试
  • 开发 HEVC 或 VP9 编码器,检查解码结果
  • 显著加快验证周期、降低成本并加快产品上市
  • 为测试创建自定义比特流,优化流基础,实现覆盖和使用效率
  • 确保解码器符合标准,以出色性能运行,稳定灵活地处理错误

面向 OpenCL™ 应用的英特尔® SDK

针对以下对象开发:

基于特定英特尔® 处理器的通用 GPU 加速(参见技术规格)。 OpenCL 主要针对执行单元。 越来越多的扩展被添加到英特尔处理器中,以便为 OpenCL 应用提供英特尔固定功能硬件模块的优势。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OpenCL 和 OpenCL 标识是苹果公司的商标,需获得 Khronos 的许可方能使用。

如欲了解有关编译器优化的更多完整信息,请参见优化通知


基于 Linux* 面向微控制器的 Intel® System Studio 入门

$
0
0

< 面向微控制器的英特尔® System Studio 入门>

 本文综述了面向微控制器的英特尔® System Studio,说明了如何通过命令行和 Eclipse* IDE,在 Linux* 平台上将它用于开发和调试面向英特尔® QuarkTM微控制器 D1000 的应用,列出了各种编译器选项以及更多产品信息和技术支持的要点。

 英特尔® QuarkTM微控制器 D1000 只需要迷你 usb 连接便可进行传送 (Flashing)、针对 OpenOCD 连接的 GDB 调试以及 UART 通信。

  

< 面向微控制器的英特尔® System Studio 简介>

 面向微控制器的英特尔® System Studio 是一款集成式工具套件,用于开发和调试面向英特尔® Quark™ 微控制器 D1000 的系统和应用,它是一种可配置和完全可合成的加速器及微控制器核心(下文通常简称为 “MCU”)。 此外,在本文中,我们还会将面向微控制器的英特尔® System Studio 简称为“套件”、“工具链”或“工具集”。
该工具集包括以下组件:

  • 基于 C/C++ LLVM 且支持 MCU 的编译器,包括 Linker、汇编程序、C/C++ 运行时库。
  • 支持 MCU 的 GDB 调试器
  • 支持 MCU 的 OpenOCD

您可以使用命令行和 Eclipse* Luna Mars IDE 中的工具集。
该工具集支持下列主机操作系统:

  • Linux*(Fedora* 19 与 Ubuntu* 12.04 LTS 和 14.04 LTS)

 

安装面向微控制器的英特尔® System Studio

从 Intel Registration Center 页下载面向微控制器的英特尔® System Studio。
在安装该工具链之前,请确保磁盘上拥有至少 140 Mb 的可用空间。
该存档名称为:
- l_cembd_iqd_p_1.0.n.xxx.tgz (for Linux*)
,其中“n” 代表“更新版本”号,“xxx” 代表程序包构建号。

安装该工具链时需将与操作系统相对应的存档内容提取至
您具有写入权限的目录。 请注意,该工具链没有默认安装目录
。 请确保安装目录没有空格。

将存档内容提取至您具有写入权限的目录,如您的
$HOME 目录。 使用以下命令:

tar –xzf l_cembd_iqd_p_1.0.0.001.tgz –C $HOME

在该示例中,您的安装目录是 $HOME/l_cembd_iqd_p_1.0.n.xxx。

 

安装有效的 glibc 版本

请确保您拥有有效的 GNU C 库 (glibc) 版本。 如欲安装请访问 http://www.gnu.org/software/libc/

对于 Fedora*,请安装 glibc.i686。 在终端以根身份执行下列命令:

yum install glibc.i686

对于 Ubuntu*,请安装 ia32-libs。 在终端以根身份执行下列命令:

apt-get install ia32-libs

 

安装 USB 驱动程序

 默认情况下,非根用户不可访问通过 USB 连接的 JTAG pod。 每当连接的设备使用非根账户运行 OpenOCD 时,您必须为合适的 /dev/bus/usb 条目授予写入权限。

通过添加 udev规则可实现该流程的自动化:
1. 在规则目录中创建文本文件:

sudo vim /etc/udev/rules.d/99-openocd.rules

2. 输入下列命令:


SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6010",MODE="0666"


3. 拔出设备并再次插入(或重启系统)
采取这些步骤,否则 OpenOCD 无法运行,并会显示错误消息:


Error: libusb_open() failed with LIBUSB_ERROR_ACCESS
Error: no device found
Error: unable to open ftdi device with vid 0403, pid 6010, description '*'
and serial '*'

 

4. 安装成功且插入 D1000 开发板后,仔细观察显示的内容。 输入 'sudo dmesg -c',然后将开发板插入您的机器,并再次输入 'sudo dmesg -c'。

 

 

编译项目 + 调试项目

请参阅附带的 PDF 版用户指南了解详情。

 

FirmWare 示例

您可以修改面向微控制器的英特尔 System Studio 程序包附带的固件。 以下截图为该固件的 PushButton 测试修改版本。

它检测到了按钮按动操作,并通过 UART 打印了字符串。

 

       

英特尔推出 AVS 2.0 比特流,提升解码器验证效率

$
0
0

Intel Stress Bitstreams &amp; Encoder masthead Chinese

英特尔宣布在其企业级视频合规性产品 Intel® Stress Bitstreams and Encoder (Intel® SBE) 中新增音视频编码标准 (AVS) 2.0 支持。 在过去十年里,第一版 AVS(AVS 和 AVS+)在中国得到了广泛的应用;之后我们开始致力于研发下一代产品,于 2013 年推出了 AVS 2.0,旨在提供质量显著提高的视频。通过将 Intel® SBE 支持扩展到 AVS 2.0,英特尔帮助视频解决方案提供商以高品质的、经过良好测试的产品最快强势进驻市场。Intel® SBE 还支持 HEVC 和 VP9。

在本版本 (2016 R3) 中,Intel® SBE 提供全面的 AVS 2.0解码器一致性验证比特流,包括 Main (4:2:0 8-bit) 和 Main 10 (4:2:0 10-bit) 格式设置,符合最新软件参考模型 (RD12) 的要求。通过首次在 Intel® SBE HEVC 和 VP9 比特流产品中引入的技术,英特尔可提供 AVS 2.0 在语法和价值层面极高的覆盖率。随着 AVS 2.0 完成其标准化流程,Intel® SBE 也将实现更新。

Intel® SBE中了解更多信息 | Chinese PPT

立即获取免费试用版AVS 2.0 | HEVC | VP9

联系 Fred Fan (fred.fan@intel.com) 获取报价。

 

Intel SBE is part of the Intel® Media Server Studio family of products.

激战幽灵游戏: 面部跟踪技术在游戏《Mystery Mansion》*中的应用

$
0
0

Mystery Mansion* 是一款灵异类隐藏物品冒险游戏,由资深游戏开发人员 Cyrus Lum 倾力打造而成。 这款游戏在 2014 年英特尔® 实感™ 应用挑战赛中,凭借创新的实验性方法赢得评委们的肯定,一举夺得“创新先锋 (Pioneer)”类别的冠军。

在进行自我介绍时,Lum 表示希望通过这款游戏“带给玩家更多的悬念,让大家沉浸在我精心构建的故事和世界中。” 《Mystery Mansion》开创性地在用户界面 (UI) 中使用了面部跟踪技术,成功为玩家带来卓越的沉浸式体验。 然而,在 Lum 寻求实施直观控制,并使用简单 UI 打造满意的用户体验的过程中,这一跟踪面部的方法带来许多的开发挑战。 在本文中,我们将探讨 Lum 遇到的挑战,以及用于解决这些挑战的代码,包括如何准确地为不同玩家校准游戏 UI,以及使用有意限定的控制方案,移动和操纵物品。


《Mystery Mansion》* 闪屏,展现了其核心的灵异惊悚主题。

优化和挑战

面部跟踪

Lum 在研究使用英特尔® 实感™ SDK的功能,而非手势控制功能的过程中,产生了开发《Mystery Mansion》的灵感。 最终他决定开发一款游戏,完全通过面部跟踪技术来进行控制。

在研究了能够与相应简化的 UI 搭配的游戏主题和机制后,Lum 决定开发一款第一人称的点击式隐藏物品冒险游戏。 在研究仅用头部控制游戏的过程中(就像没有身体一样),Lum 产生了使用“无形”幽灵作为游戏主要角色的想法。 在《Mystery Mansion》中,玩家扮演一个困在公寓中的幽灵的角色,尝试找出自己死亡的秘密。

鼻子和眼睛

游戏要求玩家用眼睛探查环境,寻找并收集一系列物品。 针对水平和垂直移动,英特尔® 实感™ 摄像头 F200会跟踪面部的移动(主要是鼻子),让玩家可以直观地观察周围的环境。 玩家面部的方向性移动在屏幕上以十字线呈现。


红色十字线由玩家面部的移动控制,面部移动使用英特尔® 实感™ 摄像头进行跟踪。

Lum 希望玩家能够 360 度探查环境,包括向左,向右,甚至向后看。 为了实现这一目标,他实施了一种机制,当玩家超越特定水平移动阈值时,视野就会向这一方向偏移,在玩家的视野靠近屏幕的边缘时,移动将会加速。

在放大和缩小环境时,英特尔实感摄像头会跟踪玩家眼睛与摄像头的距离。 用户眼睛距离摄像头越近,用户就会离环境越远,从而缩小环境(反之则放大环境)。 摄像头焦距进行了精心校准,确保玩家无需太靠近屏幕,就能有效放大物品。

/* get face data and calculate camera FOV based on eye distance.  Use face data to rotate camera. */
	void OnFaceData(PXCMFaceData.LandmarksData data) {
		if (!visualizeFace) return;
		if (colorSize.width == 0 || colorSize.height == 0) return;

		PXCMFaceData.LandmarkPoint[] points;
		if (!data.QueryPoints(out points)) return;

		/* Use nose tip as the control point */
		PXCMPointF32 xy=points[data.QueryPointIndex(PXCMFaceData.LandmarkType.LANDMARK_NOSE_TIP)].image;

		/* Get Left and Right Eye to calculate distance */
		PXCMPointF32 xyEyeLeft=points[data.QueryPointIndex(PXCMFaceData.LandmarkType.LANDMARK_EYE_LEFT_CENTER)].image;
		PXCMPointF32 xyEyeRight=points[data.QueryPointIndex(PXCMFaceData.LandmarkType.LANDMARK_EYE_RIGHT_CENTER)].image;

		float tmpEye = Mathf.Abs ((xyEyeLeft.x - xyEyeRight.x) * eyeDistScale);
		if (tmpEye < eyeDistNear) tmpEye = eyeDistNear;
		if (tmpEye > eyeDistFar) tmpEye = eyeDistFar;

		/* Use eyes apart distance to change FOV */
		Camera.current.fieldOfView = eyeFOVcenter - tmpEye;

代码示例 1:这一代码使用用户眼睛与摄像头的距离来计算其与屏幕的距离,然后相应调整视野。

优化 UI

校准

Lum 注意到每一个玩家的玩游戏方式均略有差异,同时每一个面部五官的大小和位置也切实存在不同。 这意味着在每一次游戏开始时校准面部跟踪功能至关重要,以确保每一名玩家均能够正确使用方向控制功能。 Lum 在每一次游戏开始时插入了一个校准环节,以便为玩家建立“起始位置”,确保他们处于摄像头的有效跟踪范围内。

要在校准阶段建立“起始位置”,玩家需要移动头部,使十字线处于屏幕中心的方框内。 这可以确保玩家在转动头部,向前或向后移动头部时,均能够始终处于摄像头范围内(跟踪范围)。 这一流程可确保每一名玩家不会受到面部形状、大小和相对于摄像头的位置的影响,始终能够获得出色体验。


每一次游戏开始时的校准环节确保可为每一名游戏玩家带来一致、准确的体验。

//check to see if target graphic is within the box
if (!calibrated && calibratedNose && gameStart && (295 * screenScaleWidth) < targetX && targetX < (345 * screenScaleWidth) && (235 * screenScaleHeight) < targetY && targetY < (285 * screenScaleHeight)) {
			calibrated = true;
			tutorialImg = tutorial1Img;
			LeanTween.alpha(tutorialRect, 1f, 2f) .setEase(LeanTweenType.easeInCirc).setDelay(1.5f);
			LeanTween.alpha(tutorialRect, 0f, 2f) .setEase(LeanTweenType.easeInCirc).setDelay(8f).setOnComplete (showTutorialTurn);
		}

代码示例 2:这一代码通过确保目标十字线位于校准屏幕截图上的红色框内,来校准游戏。

水平移动

摄像头在水平方向上的自由移动非常重要,有助于帮助创建出 Lum 希望为玩家提供的 360 度视野。 安全区和旋转加速功能对于使用游戏内建摄像头确保提供最佳用户体验至关重要。

//— rotate camera based on face data ———
		/* Mirror the facedata input, normalize */
		xy.x=(1-(xy.x/colorSize.width));
		xy.y=(xy.y/colorSize.height);

		/* exponentially accelerate the rate of rotation when looking farther away from the center of the screen, use rotateAccelerationScale to adjust */
		newX = (0.5f-xy.x)*(rotateAccelerationScale*Mathf.Abs((0.5f-xy.x)*(0.5f-xy.x)));
		newY = (0.5f-xy.y)*(rotateAccelerationScale*Mathf.Abs((0.5f-xy.y)*(0.5f-xy.y)));

		/* Camera is a hierarchy  mainCamBase  with Main Camera as a child of mainCamBase.  We will horizontally rotate the parent mainCamBase  */
		mainCamBase.transform.Rotate(0, (newX * (lookTimeScale*Time.deltaTime)), 0);

		/* angleY is a rotation accumulator */
		angleY += newY;
		if (angleY > lookUpMin && angleY < lookUpMax) {

			mainCam.transform.Rotate ((newY * (lookTimeScale * Time.deltaTime)), 0, 0);
			if(angleY < lookUpMin) angleY = lookUpMin;
			if(angleY > lookUpMax) angleY = lookUpMax;
		}
		else angleY -= newY;

代码示例 3:这一代码负责在用户将头部从屏幕中心转向周围时,控制摄像头的旋转和水平加速。

如果玩家将十字线保持在屏幕中心的特定区域,约水平范围的 50%,摄像头不会旋转,这可以确保玩家能够探查区域,同时摄像头不会无意中移动。 当十字线从该区域移出时,水平移动开始在玩家视线方向上发生,并随着玩家将十字线移向屏幕边缘进行加速。 这可以为玩家带来准确、直观的 360 度控制能力。

垂直移动

Lum 的实验显示,摄像头的自由移动在垂直方向上不太实用,因为如果两个方向都发生作用,玩家会失去方向感。 此外,考虑到游戏的互动元素集中在视野的水平地带,玩家看天花板或地板没有多大的用处。 然而,玩家也需要一定的垂直移动,以发现靠近地板或突起表面上的物品。 为了提供此功能,Lum 在上下方向上提供了 30 度的移动范围,这使得玩家能够观察四周而不会失去方向感。

游戏过程优化

在评估了各种游戏过程机制后,Lum 决定在核心的物品收集游戏内容之外,添加一些简单的解谜元素。 解谜元素能够无缝融入整个游戏设计之中,并可仅使用面部跟踪 UI 直观有效地完成实施。

玩家通过将十字线移动到物品上面将其捡起,就如同将鼠标指针放在物品上面一样。 在触发点,物品如同受到超自然力牵引一样,从环境中飞向玩家,进入屏幕上的物品背包中。


在上图中,玩家通过移动面部将十字线放在一个物品上将其选中,使得物品(本例中为一个药品箱)飞向玩家,进入背包。

Ray ray = Camera.current.ScreenPointToRay(new Vector3((float)targetX, (float)Screen.height-(float)targetY, (float)0.1f));
RaycastHit hit;
if (Physics.Raycast(ray, out hit,100 )) {
	if(hit.collider.name.Contains("MysItem")){
		hit.collider.transform.Rotate(new Vector3(0,-3,0));
	}
}

代码示例 4:这一代码让玩家可以使用面部跟踪 UI 捡起物品。

Lum 还需要玩家能够以一种适合简单 UI 和游戏逻辑的方式,从一个房间移动到另一个房间。 在此方面,每一个房间出口门,仅会在玩家收集到所有设定的物品后打开。 此时,玩家通过移动面部将十字线移动到门上,使门打开,然后移动游戏场景进入下一个空间。

为了增加游戏的多样性,Lum 评估并添加了不同的解谜机制,可以通过同样简单的逻辑方式加以操纵。 其中一个谜题是方块谜题,玩家需要使用方向控制键将方框移动到框架内。 Lum 以多种方式实施了此操作,包括移动方块到一个图片框以重建图像,以及移动门上的管道将其打开等。

else if(hit.collider.name.Contains("puzzleGame")){
	room currentRoom = (room)rooms[roomID];
	puzzleItem tmpPuzzleItem = (puzzleItem)currentRoom.puzzleItems[hit.collider.name];
	if(!LeanTween.isTweening(hit.collider.gameObject) && !tmpPuzzleItem.solved){
		if(hit.collider.name.Contains("_Rot")){
			LeanTween.rotateAroundLocal ( hit.collider.gameObject, Vector3.up, 90f, 2f ).setEase (LeanTweenType.easeInOutCubic).setOnCompleteParam (hit.collider.gameObject).setOnComplete (puzzleAnimFinished);
		}
	}
}

代码示例 5:这一代码允许玩家使用面部跟踪 UI 移动方块,以完成某些游戏谜题。


谜题包括此方框图。 玩家使用方向控制键移动组件,重建图像,从而找到线索。


在此谜题中,玩家使用面部跟踪方向控制键移动管道部件。

此外,当玩家需要离开房间时,屏幕上还会显示文本提示,帮助玩家确定下一步骤。

测试和分析

《Mystery Mansion》由 Lum 独自开发而成,因此大部分的测试工作也由他自己完成。 然而,在开发期间,他请求三个朋友帮助测试了游戏。

在视频游戏领域,没有玩家会以完全相同的方式玩游戏,对一名玩家直观的设定,对另一名可能就并非如此。 这一差异很快便在外部测试期间成为 Lum 亟需解决的一个挑战,尤其是在面部跟踪方面。 由于他们会以不同的方式为自己定位,或者仅仅是因为面部大小和五官位置的简单差异,测试人员很难推进游戏。 Lum 经过仔细观察,决定在开始游戏前实施一个校准环节,并在开始前添加了教程,以确保 UI 原理易于理解。


教程让玩家能够能好地了解如何进使用面部跟踪界面与游戏进行互动。

重要经验

对于 Lum 而言,在使用英特尔实感技术和人机界面技术的过程中,简单性至关重要。在其开发《Mystery Mansion》的过程中,一个核心理念就是 UI 将仅适用于面部跟踪。 他对于不进行太多工作添加机制和特性的重要性坚信不疑,尽管这些机制和特性在开始时看起来非常不错。 在环境中移动并仅使用面部跟踪 UI 操纵物品要求对精简的 UI 进行精心迭代开发,并提供详细的教程,以确保玩家永远不会不知道该做什么,或如何推进游戏。

测试在《Mystery Mansion》的开发过程中发挥了重要作用。 Lum 发现开发人员不应假定对一名玩家奏效的方式,会自动适用于其他玩家。 每一名玩家在游戏中均有不同的行为,在英特尔实感摄像头的人机界面中,每一名玩家的面部和手均具有不同的尺寸、形状、移动方式和位置属性,必须在代码中加以调整。

英特尔实感 SDK 的 Unity Toolkit中包含的资源为 Lum 提供了一个直观的开发环境。 Unity* 是一个简单易用的开发环境,经过了英特尔实感 SDK 的全面测试,与该 SDK 具备出色的兼容性。它包含丰富的资源(包括通过英特尔实感 SDK 提供的资源),强大的支持社区,以及由 Asset Store 提供的可立即使用的广泛图形资产库。

Lum 认为开发人员应始终考虑长时间用手势控制玩游戏对健康的影响,如果 UI 未能针对玩家进行有效设计,此类游戏有时会导致四肢疲劳。

工具与资源

Lum 发现使用英特尔实感 SDK开发游戏的过程非常简单直接。 他还投入时间观看可用的演示,来寻找实用的提示,包括在英特尔实感 SDK 中提供的 Nine Cubes 样本等。

Unity

Lum 选择使用 Unity开发游戏,它兼容英特尔实感 SDK,提供了一个完整的开发环境。 Lum 在使用 C# 语言编程方面成就卓著,Unity 平台帮助他消除了许多基础的编程工作,让他能够在开发和测试原型方面快速进行迭代。

MonoDevelop*

为了开发 C# 游戏脚本,Lum 使用了由 Unity 提供的集成开发环境 MonoDevelop。 Lum 使用 MonoDevelop 放置物品,设置属性,添加行为和逻辑,以及为集成英特尔实感摄像头数据编写脚本。

Nine Cubes

构建《Mystery Mansion》的一个基础构建模块是 Nine Cubes样本,它是一个在英特尔实感摄像头 SDK 中提供的 Unity 软件样本(可以在 SDK 的样本目录的框架文件夹中找到)。 这一演示让用户可以使用面部跟踪技术移动立方体,具体则主要是通过跟踪鼻子来完成。 这一功能为《Mystery Mansion》的 UI 奠定了重要基础。

Unity Technologies Asset Store

Lum 在前一个项目中,已经在使用 Unity Technologies Asset Store 方面积累了丰富的经验。通过从这里为《Mystery Mansion》寻找图形元素,Lum 节省了宝贵的时间,依靠一己之力开发出了这一图形效果出色的游戏。 同时幸运的时,他在寻找素材的时候适逢万圣节,因此这让他能够轻松找到许多会将人尖叫不已的图形素材。

《Mystery Mansion》的未来发展

在提交《Mystery Mansion》参加英特尔实感应用挑战赛之后,Lum 继续试验各种特性,致力于营造出更加沉浸式的体验。 例如,最近的迭代开发允许玩家通过将箱子或容器倾向一边,查看里面的东西。 这一操作最终将会使得一些东西掉出来,营造出真正的惊悚感觉。 Lum 的观点是,实际操作在游戏中越真实,对于玩家的吸引力就越强,带给他们的体验就越精彩。

目前,《Mystery Mansion》主要适用于配备英特尔实感面板跟踪摄像头的笔记本电脑和台式机。 Lum 已经在 Google Tango* 平板电脑上进行了测试,渴望在采用英特尔实感技术的平板电脑和移动平台上开展类似的工作,尤其是考虑到英特尔正在与 Google 合作为采用英特尔实感技术的手机 Project Tango,Lum 坚信其中将蕴含着巨大的商机。

英特尔实感 SDK: 展望未来

根据 Lum 的经验,上下文对于成功实施英特尔实感技术至关重要。 Lum 认为该项技术在 3D 扫描物品,并将相关信息与日益普及的 3D 打印进行关联方面蕴含巨大潜力,并对此充满期待。

在 Lum 自己的人机技术工作方面,他当前正在最近开始的另一个英特尔实感 SDK 项目中试验其想法。该项目名为《My Pet Shadow》,在 2013 年英特尔感知计算挑战赛中夺得了第一名。 《My Pet Shadow》是一款“投影现实”原型游戏,使用 LCD 投影仪投射阴影,支持用户以不同方式与其进行交互。 这一现实与数字世界的交互融合极大地吸引了 Lum,随着他不断探索英特尔实感技术的无限可能,这为他提供了一个新的发展方向。


Lum 的英特尔® 实感™ 项目《My Pet Shadow》在 2013 年英特尔® 感知计算挑战赛中夺得第一名。

开发人员介绍

Cyrus Lum 在游戏制作、开发和管理方面具有超过 25 的经验,曾在出版和独立开发公司就职,包括位于德州奥斯汀的 Midway Studios、Inevitable Entertainment Inc.、Acclaim Entertainment 和 Crystal Dynamics 等。 他所担任的职位包括总监、联合创始人和数字制作副总裁等。 当前,Lum 是 Phunware Inc. 的顾问,以及软件开发公司 21 Pink 的副总裁。 此外,他还自 1997 年起一直是游戏开发人员大会顾问委员会 (Game Developer Conference Advisory Board) 的成员。

更多资源

Cyrus Lum 网站

MonoDevelop

Unity

英特尔® 实感® 技术英特尔® 开发人员专区

英特尔® 实感™ SDK

英特尔® 实感™ 开发人员套件

英特尔实感技术教程

Camera360 记录生活每一刻----适配英特尔®平板电脑及英特尔®2合1电脑的拍照应用

$
0
0

下载PDF文档

挑战

  • 拍照应用应能否在英特尔®2合1电脑中实现智能切换,移动。
  • 视频人像美化时人脸识别能否更灵敏。
  • 人机交互能否更自然。

解决方案

  • 借助Windows* 10通用应用平台,以单一平台的开发量实现了跨平台、 跨设备的照片管理应用开发。
  • 基于Camera360人像处理技术结合英特尔®实感™技术,为“QQ视频通话”提供基于人脸的识别与处理。
  • 在Windows* 10版本上添加了完善的自适应机制。

影响

  • Camera360用户可以很方便的在Windows* 10平台上对自身拥有的不同平台的智能手机上的照片实现无缝同步、浏览编辑和分享。
  • 视频人像美化更自然。
  • 当应用运行在不同的设备上时,用户体验到的不仅是与当前使用环境最契合的用户界面,更包括令人得心应手的交互方式。

拍照应用开发的新挑战

随着越来越多的人喜欢用移动设备进行拍照和视频通话,人们对手机上、平板上或者电脑上的拍照软件要求越来越高,如今各式各样的拍照软件涌入人们的视线,但是大部分都拍照软件都如昙花一下,并不能立于不败之地。而且随着2合1电脑的普及,拍照软件也需要适应这种智能切换,移动。
拍照软件的不断更新催生拍照应用开发者的不断创新,拍照应用开发商要在行业中崭露头角,站稳领头羊角色,就需要不断迎接以下挑战:

  • 便于分享。支持将照片分享到多个社交媒体。
  • 更灵敏的捕捉动态。为了配合好时下很受欢迎的视频聊天,拍照应用应该能够更灵敏的捕捉人物动态。
  • 更精简的滤镜。过去臃肿的滤镜效果被进行有效管理和精简后供用户随意搭配,满足用户的爱美之心,将美表现到极致。
  • 让用户在不同的设备上使用拍照应用时,体验到的不仅是与当前使用环境最契合的用户界面,更包括令人得心应手的交互方式。

基于Windows* 10 UAP开发全新的Camera360照片应用是以单一平台的开发量实现了跨平台、 跨设备的照片管理应用开发。同时基于Camera360人像处理技术结合英特尔®实感™技术,为“QQ视频通话”提供基于人脸的识别与处理。

Camera360 记录生活每一刻

Camera360 是成都品果科技有限公司推出的功能强大的摄影软件。多种相机拍摄模式,能拍摄出不同风格,不同特效的照片,特效相机里还提供了丰富的特效滤镜,不会PS可轻松拍出大师级照片。还支持拍后可编辑照片,分享照片到微博、微信等主流社交站点。同时具有云服务和互联网分享功。Camera360已有全球用户近5亿。
一直致力于为用户提供拍照软件及移动影像服务的服务商让我们看到了相机应用进化发展的另一个模式和可能:从一个纯工具属性产品走向提供移动影像与服务的平台。Camera360在整体上把产品提升到一个新的价值高度,实现工具属性到平台级应用的转变:

  • UI界面由繁到简,功能专业优化 在智能效果下可自动识别场景对光线进行测试,并为用户设定最佳拍照效果。
  • 加入手动操纵 在拍摄界面中,从页面底部向上滑,出现调节光圈、白平衡和微距等参数按钮,长按屏幕即可进行测光与聚焦功能的调节,以及右下角隐藏的功能按钮和众多有趣好玩的随机效果供用户选择应用。
  • 精简滤镜效果 过去臃肿的滤镜效果被进行有效管理和精简后供用户随意搭配。
  • 视频画面更逼真基于Camera360人像处理技术结合英特尔®实感™技术,为“QQ视频通话”提供基于人脸的识别与处理。
  • 在不同平台实现无缝衔接 Camera360用户可以很方便的在Windows* 10平台上对自身拥有的不同平台的智能手机上的照片实现无缝同步、浏览编辑和分享。

值得关注的是除了提供了相机、相册、自拍等主体功能的“相机”页面外,“灵感”和“发现”页面给我们带来了更大的惊喜。“灵感”承载图片发布功能,“发现”跟移动影像服务相关,包括电商,一些有趣的跨界合作等。

英特尔平板电脑及2合1设备

英特尔芯平板是屏幕尺寸小于等于10英寸,采用英特尔最新发布的英特尔架构芯片,且搭载英特尔®凌动™ 处理器的平板电脑产品,操作系统方面有采用Windows操作系统的,也有采用安卓操作系统的。内置Office办公套件。满足商务人士的工作需求。
“芯不凡,敢过界”英特尔®2合1电脑是便携的平板,更是强大的PC。随意切换的产品形态,无论是翻转、插拔、还是滑盖,都可以轻松切换PC和平板的应用模式,快速文字输入,轻松指尖触控时刻满足消费者的使用需求。
英特尔®实感™技术,实感3D摄像头是全世界首款集成了3D深度和2D镜头模块的设备,将赋予设备以类似于人眼的视觉深度。英特尔®实感™3D摄像头采用同类设备中最好的深度传感器和全1080p彩色镜头。它甚至能够感知手指的动作,实现高度精确的手势识别、面部特征识别,从而理解人的动作和情感。

方案价值

Camera360一直致力于为用户提供拍照软件及移动影像服务的服务商让我们看到了相机应用进化发展的另一个模式和可能:从一个纯工具属性产品走向提供移动影像与服务的平台。

  • Camera360用户可以很方便的在Windows*10平台上对自身拥有的不同平台的智能手机上的照片实现无缝同步、浏览编辑和分享。
  • 结合英特尔®实感™技术使视频画面更逼真。
  • Camera360在整体上把产品提升到一个新的价值高度,实现工具属性到平台级应用的转变。

客户嘉评

在设计产品的过程中,我们的设计完美适配英特尔®2合1电脑。当链接电脑时,我们的APP会自动适配成PC模式,而当键盘一旦移开,我们的APP会自动适配成移动端模式。

敬亮
产品经理
成都品果科技有限公司

无线互联,翻转随心----快牙与基于英特尔处理器的2合1电脑无缝衔接,实现数据高速传输与共享

$
0
0

下载PDF文档

概述

APP介绍

快牙(ZAPYA),是一款全球首创,实现跨平台文件传输的应用;帮助智能手机用户之间实现高速海量数据传输。

解决方案

快牙结合基于英特尔®处理器的2合1电脑的性能、灵活性和极速响应,使用户无时无刻都能与朋友分享更多精彩乐趣!

价值

  • 更便捷的传输工具
  • 更流畅的操作体验
  • 更紧密的沟通渠道

ISV嘉评

在基于英特尔®处理器的2合1电脑上使用快牙时,无论是在触控模式还是键鼠模式首要目标都能轻松满足传输分享内容的需求,无论在哪种模式下,快牙都保持了统一的交互操作,给用户简单极致的体验。

邻动网络科技(北京)有限公司

正文

快牙——领先的跨平台传输工具和媒体中心

随着智能手机和平板电脑的爆炸式应用,人们将更多的时间用于在移动设备上交流、娱乐或进行创意性的工作。这使得智能移动终端逐渐占据人们数字化生活的重要地位,承载着越来越多的照片、音乐、书籍、视频和各种文件,成为每个人随身携带的小型数据处理终端。
但在不同系统的移动设备间传输与共享大文件,依然存在挑战:

  • 朋友之间的数字化分享内容仅限于压缩后的照片和小视频,大文件的传输,通常要先接入Wi-Fi网络,而且依旧受到网速限制。
  • 而移动设备和个人电脑间传输数据,更要依赖传统数据线的传输。

针对这一挑战,邻动网络科技(北京)有限公司(以下简称邻动科技)依托自身在无线通讯与移动互联网领域的技术底蕴,研发出可以支持多个平台,实现跨平台文件传输,兼具近场传输与轻社交功能的工具类软件——快牙(ZAPYA)。
快牙允许用户在不联网、不走流量的情况下与身边人点对点分享手机内容,具有如下特性:

  • 跨平台分享:可以实现基于 Windows 操作系统的笔记本电脑和智能移动终端、基于 Android 系统的智能移 动终端,基于 iOS 系统的智能移动终端和基于Mac系统的电脑之间的无网互联互通,兼容性超过99.5%,打造智能 设备间的直通传播通路。 
  • 高速无网传输:多种连接方式,适应多种不同的网络环境,传输稳定便捷零流量。1分钟可传输260张无压缩照片、60首MP3、5款3D手游或3部百兆高清电影。
  • 互动娱乐:支持多种格式歌曲和视频,兼具媒体中心和文件管理中心的作用。另有独有的近景对战功能,支持数十款多人对战游戏,可以邀请身边好友一起联机对战。

凭借上述特性,截止目前,快牙的用户已遍及全球178个国家和地区,全球用户数量超过3亿,在同类型的传输应用中稳居第一,成为很多地区最受欢迎的移动分享传输工具之一。

转换随心——基于英特尔®处理器的2合1电脑

一直以来,“让用户能在不同平台、不同设备之间轻松分享内容”就是快牙的核心理念,因此,在基于英特尔®处理器的2合1电脑上使用快牙时,无论处于触控模式还是键鼠模式,首要目标都是满足传输分享内容的需求,适应应用环境差异,使得快牙可在两种模式间自行“适应”及调整。
在英特尔技术工程师的支持下,快牙在基于英特尔®处理器的2合1电脑上进行全面优化,不仅可以自动识别设备状态,而且可以快速适配UI界面。

  • 在笔记本形态下,快牙为了满足批量操作、修改文件等更精细的操作需要,会适应出现特定的用户界面,以适合鼠标、键盘操作模式; 
  • 在平板电脑模式下,快牙会自动转换适合触摸的用户界面,进行UI自适配,让窗口更大,操作部件更容易,满足用户触摸点选的要求。

基于英特尔®处理器的2合1电脑能够合二为一,工作时是强劲的PC,娱乐时是轻盈的平板。

  • 至轻至薄:英特尔®处理器让2合1电脑非常轻薄,方便携带,还能在办公室、家中、户外等多种场合自由变换PC、平板造型。
  • 强劲性能:英特尔®处理器让全新2合1电脑性能强劲,在拥有平板的灵活性的同时,全面胜任PC工作。
  • 卓越视效:英特尔®处理器让2合1电脑在PC和平板模式下都能畅玩充满精彩细节的3D游戏;4k高清视频播放,流畅不卡顿。
  • 超凡续航:英特尔®全新处理器,让2合1电脑无论作为平板使用,还是作为PC高负荷运行,都能一整天不插电源工作。

方案价值与用户收益

快牙结合基于英特尔®处理器的2合1电脑的性能、灵活性和极速响应,使用户无时无刻都能与朋友分享更多精彩乐趣!

  • 更便捷的传输工具:基于英特尔®处理器的2合1电脑,不论在PC模式还是平板模式下,用户都可以通过快牙,在不费流量的情况下高效稳定地传输文件,分享内容。
  • 更流畅的操作体验:不论文件传输还是娱乐游戏功能,快牙在基于英特尔®处理器的2合1电脑上的表现都非常流畅,极大增强了朋友间传输分享和互动交流体验。
  • 更紧密的沟通渠道:快牙凭借其去中心化的传输网络,建立了一个相互沟通互动的网络社交体系,通过云连接,帮助用户更方便地发现内容,跟好友以及同好交流信息。

未来快牙将会拓展其社交属性,强化去中心化的特点,搭建人与人相互沟通互动的生态含量。而快牙与基于英特尔®处理器的2合1电脑全新结合,也将给用户带来无限互联、翻转随心的全新体验。

小行星与 DirectX* 12:强大的性能与能耗优势

$
0
0

下载代码样本

英特尔在 2014 年国际图形学年会 (SIGGRAPH 2014) 上首次展示了所开发的小行星样本。该样本举例说明了如何使用 Microsoft DirectX* 12 图形 API 实现高于前代 API 的性能与能耗优势。 DirectX 12 现已公布,我们将发布面向该样本的源代码。 其中,我们采用两种模式(最高性能模式和最节能模式)渲染由 50,000 颗完全动态并且不重复的小行星所组成的场景。 只需轻击一个按钮,该应用便可在 DirectX 11 和 DirectX 12 API 之间进行切换。

当平板电脑在稳定的低散热状态下运行时,Microsoft Surface* Pro 3 可捕捉此处的所有结果。 该状态相当于连续 10-15 分钟以上运行一款复杂的游戏。

性能

在性能模式下,应用可在平台的散热和能耗限制内以最快的速度运行。 使用 DirectX 11 时我们可以看到:

frame rate and the distribution of power between the CPU and GPU

上图所示为帧速率(左上角)以及 CPU 和 GPU 之间的能耗分布。 切换样本后在 DirectX 12 上运行,此时性能得到了显著的提升。

Performance with DirectX 12 increases ~70 percent (from 19 FPS to 33 FPS).

DirectX 12 将性能提升了约 70%(从 19 FPS 到 33 FPS)。 能耗图表说明了性能提升的原因。 DirectX 12 面向低开销、多线程化渲染而设计。 使用新 API 后,对 CPU 能耗的要求有所降低,因此这部分能源可用于 GPU。

能耗

为了直接对比 DirectX 12 和其他 API 的节能特性,我们还支持锁定帧速率模式,以便该样本在各 API 中完成相同的工作量。 通过从 DirectX 11(能耗表左半部分)切换至 DirectX 12(右侧)并保持固定的工作负载,我们可以看到:

DirectX 12 uses less than half the CPU power when compared to DirectX 11

相比于 DirectX 11,用 DirectX 12 渲染相同场景时,CPU 能耗降低了超过一半,因此设备的外形更加炫酷,电池续航时间也得以延长。

DirectX 12 能够显著提高能效的原因有两点:降低图形提交开销和提高多线程化效率。 相比于高频率运行一条线程,以较低的频率将工作分布于多个 CPU 内核可显著提高能效。

总结

我们通过样本证明了 DirectX 12 能够显著降低能耗、提高性能。 我们创建此样本是为了展示两种极端:固定能耗和固定工作负载。 在真实情况下,开发人员可以根据其应用,选择任意组合的能耗与性能。

其中的关键是,能耗和性能密不可分。 传统的 “CPU 和 GPU 密集型” 观点会对 Surface Pro 3 等现代设备造成误导。 即使应用不是 “CPU 密集型”,CPU 能效的提升也会有助于提高性能。

更多信息

GitHub: https://github.com/GameTechDev/asteroids_d3d12

DirectX 开发人员博客: http://blogs.msdn.com/b/directx/
DirectX 12 Twitter feed: https://twitter.com/DirectX12
英特尔软件 Twitter feed: https://twitter.com/IntelSoftware

英特尔技术可能要求激活支持的硬件、特定软件或服务。 实际性能会因您使用的具体系统配置的不同而有所差异。 请咨询您的系统制造商或零售商。

在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下才能得到优化。 诸如 SYSmark* 和 MobileMark* 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其它信息及性能测试(包括结合其它产品使用时的运行性能)以对目标产品进行全面评估。

如欲了解更多信息,请访问 http://www.intel.com/performance

 适用于 OpenCL 内核的并行噪声和随机函数

$
0
0

立即下载Noise.zip

示例介绍

本文中的噪声示例代码包括一个柏林噪声算法的实施,可为 3D 显卡生成外观自然的纹理,如大理石和云。 其中还包括使用柏林噪声生成“云”图片的测试。 (如欲了解关于柏林噪声的更多信息,请参阅“参考文献”部分。) 包括 2D 和 3D 两种版本,这意味着函数需要两个或三个输入才能生成一个柏林噪声输出值。

“噪声”示例还包括伪随机数生成器 (RNG) 函数,它可以生成较好的结果,至少能够让生成的图像看上去具备随机的效果。 包括 1D、2D 和 3D 三种版本,同样,需要参考输入的个数来生成一个伪随机值。

介绍和目的

许多应用都需要一定程度的“随机性” — 事实上是“伪随机性”。 即一系列的值以随机或“噪声”的形式呈现。 但是,为了能够重复,应用通常还要求,在给定相同的输入“种子”值时,RNG 能够可靠地生成相同的值序列。

多数 RNG 算法都是通过根据上一个生成值来创建生成值,并且直接从种子值中生成序列的第一个值来满足这些要求。 RNG 的这种方法不适用于高度并行的处理语言,如 OpenCL。 强迫诸多处理线程中的每个线程等待一个连续 RNG 源,将会降低或取消使用该源的算法的并行性。

解决这一问题的其中一个方法是,预生成一个包含随机值的大型表,并让每个并行线程向该表生成唯一但确定的目录。 例如,处理一个映像的 OpenCL 内核根据正在处理或生成的像素坐标来计算索引,进而从预生成的表中选择一个条目。

但是,这种方法要求在开始并行算法前,先执行可能会非常耗时的串行 RNG 流程,这可能会限制并行性带来的性能改进。 它还要求在运行并行算法前,了解大概需要使用的随机数个数。 对于需要动态决定每个线程需要使用多少个随机值的并行算法而言,这可能不太适用。

本文“噪声”示例代码中的 OpenCL 内核层函数更适合使用 OpenCL 方法将任务划分为并行操作。

面向 OpenCL 的噪声和随机数生成

OpenCL 使用一维、二维或三维定义了一个全局工作空间(工作项目阵列)。 该全局工作空间内的每个工作项目都有一个唯一的数据集,可根据全局空间内的 x、y 和 z 坐标来确认整数值。

“噪声”示例中的柏林噪声和 RNG 函数可根据最多三个输入值(这可作为每个工作项目的全局 ID)来生成一个随机数或噪声序列。 或者,您也可以结合全局 ID 和内核获取或生成的一些数据值来生成一个或多个值。

例如,以下 OpenCL 内核代码片段展示了根据工作项目的 2D 全局 ID 生成随机数的情况。

kernel void	genRand()
{
	uint	x = get_global_id(0);
	uint	y = get_global_id(1);

	uint	rand_num = ParallelRNG2( x, y );

	...

图 1随机数使用示例 — 二维。

 

这种方法可让随机或噪声函数在不同的工作项目间并行运行,生成的结果拥有可重复的值序列,对工作项目均呈现为“噪声”状态,且在工作项目中为顺序状态。 如果需要生成多个 2D 数值集,则可使用 3D 生成函数,前两个输入根据工作项目的全局 ID 生成,按顺序增加每个所需的新增值的初值来生成第三个维度。 这可延伸为提供多个 3D 随机或噪声值集,如以下柏林噪声示例所示:

kernel void multi2dNoise( float fScale, float offset )
{
float	fX = fScale * get_global_id(0);
float	fY = fScale * get_global_id(1);
float	fZ = offset;

float	randResult = Noise_3d(  fX,  fY,  fZ );
...

图 2柏林噪声使用示例 — 三维。

 

限制

Noise_2d 和 Noise_3d 函数按照相同的基本柏林噪声算法进行计算,但是根据柏林噪声算法的推荐,在实施上会有所差别。 (参见参考资料 1。) 在“噪声”示例中,只有 Noise_3d 实施“噪声”示例,但是 Noise.cl 中包含了针对 Noise_2d 的测试内核,以便读者在修改示例时,可以测试该变量。

Noise_2d 和 Noise_3d 函数应使用浮点输入值来调用。 这些值应限定在一个范围内(如 (0.0, 128.0)),以设置随机值“网格”的尺寸(参见 图 3)。 读者应了解一下示例,以便了解如何将柏林噪声转换为各种“真实自然”的图像。

随机测试中使用的默认 ParallelRNG 函数可提供视觉上随机排列的结果,但并不是最快的 RNG 算法。 此函数基于 “Wang hash”,并非专门用作 RNG 而设计。 但是,当填充 2D 图像,尤其在低阶的二进制结果中,一些常用的 RNG 函数(Noise.cl文件中包含一个注释掉的示例)会表现出明显的规律。 读者可能想要尝试一些其他更快的 RNG 函数。

默认的 ParallelRNG 函数仅生成无符号 32 位整数结果,如果需要一定范围(如 (0.0, 1.0))内的浮点值,那么应用必须将映射应用到该范围内。 随机示例将无符号的随机整数结果映射到 (0, 255) 的范围内,以生成灰度像素值,仅使用一个 AND 二进制操作选择 8 位。

默认 ParallelRNG 函数在使用以前生成的值进行顺序调用时,不会生成全部的 4,294,967,296 (2^32) 无符号整数值。 对于一个初始种子值而言,伪随机序列/循环最小为 7,000 个唯一值长度,最大约为 20 亿个值的长度。 ParallelRNG 函数默认约生成 20 个不同的周期。 作者认为,一个 OpenCL 内核的工作项目所需的顺序生成随机数多于最小周期可提供的数量的情况不太常见。

2D 和 3D 版函数,即 ParallelRNG2 和 ParallelRNG3,使用混合周期,将上一个调用之间的 XOR 二进制操作应用到 ParallelRNG 和下一个输入值中,这将会改变周期的长度。 但是,改变行为尚未做出具体的归纳,所以建议读者仔细确认 ParallelRNG 函数是否满足应用的需求。

项目结构

这一片段仅列出了示例应用源代码的主要元素。

NoiseMain.cpp:

main()
主要入口点函数。 解析命令行选项后,它将初始化 OpenCL,从 Noise.cl 文件构建 OpenCL 内核程序,准备一个要运行的内核,调用 ExecuteNoiseKernel()以及 ExecuteNoiseReference()。 在确认两个实施可以生成相同的结果后,main()可输出每个实施返回的定时信息,并存储每个实施生成的图像。

ExecuteNoiseKernel()
设置并运行所选的采用 OpenCL 的“噪声”内核。

ExecuteNoiseReference()
设置并运行所选择的“噪声”参数 C 代码。

Noise.cl:

defaut_perm[256]
3D 柏林噪声内核随机值 0—255 的表。 注意,这可生成并传递到柏林噪声内核,以提高随机程度。

grads2d[16]
16 个面向 2D 柏林噪声内核均匀间隔的单位向量、梯度。

grads3d[16]
16 个面向 3D 柏林噪声内核的向量梯度。

ParallelRNG()
伪随机数生成器,每个随机数通过 1 个输入传递。 一个可替换的 RNG 函数已经注释掉,以防读者在测试较快的函数时得到较差的结果。

ParallelRNG2()
RNG 针对 2 个输入执行 2 次传递

ParallelRNG3()
RNG 针对 3 个输入执行 3 次传递

weight_poly3()、weight_poly5() 和 WEIGHT()
它们是柏林噪声使用的替换加权函数,可确保所有位置以连续梯度计算。 第二个(首选)函数也可让所有位置以连续二阶导数计算。 WEIGHT宏选择使用哪一个。

NORM256()
宏将范围 (0, 255) 转换为 (-1.0, 1.0)

interp()
使用一个 OpenCL 构建的双线性插值

hash_grad_dot2()
选择一个梯度,用输入 xy 和部分柏林 Noise_2d函数进行点积运算。

Noise_2d()
包含 2 个输入的柏林噪声生成器。

hash_grad_dot3()
选择一个梯度,用输入 xyz 和部分柏林 Noise_3d函数进行点积运算。

Noise_3d()
包含 3 个输入的柏林噪声生成器。

cloud()
使用 Noise_3dCloudTest生成一个像素的“云”输出图像。

map256()
从柏林噪声输出范围 (-1.0, 1.0) 转换为灰度像素所需的范围 (0, 255)。

CloudTest()
云图像生成测试。 将 slice参数传递到 cloud,让主机代码生成可替代的云图像。

Noise2dTest()
Noise_2d的测试 – 默认状态下不使用。

Noise3dTest()
Noise_3d的测试 – 默认柏林噪声函数。 使用 map256为灰度图像生成像素值。

RandomTest()
ParallelRNG3测试,目前使用低阶字节的无符号整数结果输出灰度图像。

针对 Visual Studio 2012 版和 2013 版提供了两个 Microsoft Visual Studio 解决方案文件,  分别是 “Noise_2012.sln” 和 “Noise_2013.sln”。   如果读者有更新的 Visual Studio 版本,应使用 Visual Studio 解决方案或者项目更新根据当前解决方案创建新的解决方案。

注意,两种解决方案都假定已经安装了英特尔® OpenCL™ Code Builder

控制示例

本示例可从 Microsoft Windows* 命令行控制台上通过包含 EXE 文件的文件夹运行:

Noise.exe < Options >

选项:

-h--help
显示命令行帮助。 不会运行任何演示。

-t or --type [ all | cpu | gpu | acc | default |<OpenCL constant for device type>
按设备类型选择运行 OpenCL 内核的设备。 默认值: 全部

<OpenCL constant for device type>

CL_DEVICE_TYPE_ALL | CL_DEVICE_TYPE_CPU | CL_DEVICE_TYPE_GPU |
CL_DEVICE_TYPE_ACCELERATOR | CL_DEVICE_TYPE_DEFAULT

-p or --platform< number-or-string > 
选择要使用的平台。 当运行演示时,可输出一个包含所有平台编号和名称的列表。 所使用的平台将会在右侧输出 “[Selected]”。 如果使用 string,请使用较多的字母作为平台名称,以便将其区别开来。 默认值:英特尔

-d or --device < number-or-string >
根据设备编号或名称选择运行内核的设备。运行演示时,将会输出正在使用的平台的设备编号和名称。 当前平台将会在右侧输出 “[Selected]”。 默认值: 0

-r or --run [ random | perlin | clouds ]
选择要运行的函数演示。 随机数、柏林噪声或云图像生成器各自拥有自己的演示内核。 默认值: 随机

-s or --seed < integer >
提供整数值,以区分算法输出。 默认值: 1

Noise.exe可输出 OpenCL 内核和参考 C 编写的等值的参数运行的时间,以及二者输出文件各自的名称。 当程序输出信息完成后,它会等待用户按 ENTER 后再退出。 请注意,我们没有对用 C 语言编写的参考代码函数的性能进行优化;这些函数仅用作验证 OpenCL 内核代码是否正确。

检查结果

Noise.exe运行完成后,在工作文件夹中检查生成的 BMP 格式图像文件 OutputOpenCL.bmpOutputReference.bmp ,分别与 OpenCL 和 C++ 的代码结果进行比较。 两个图像应是相同的,但是两个柏林噪声或云图像之间可能会有少许的差别。

(柏林)噪声输出应如图 3所示:


图 3柏林噪声输出。

随机输出应与图 4相似:


图 4随机噪声输出。

函数输出应与图 5相似:


图 5生成的云输出。

参考资料

  1. Perlin, K., “噪声改进”,http://mrl.nyu.edu/~perlin/paper445.pdf
  2. “4 位整数散列法”,http://burtleburtle.net/bob/hash/integer.html
  3. Overton, M. A.,“快速、高质量的并行随机数生成器”,Dobb 博士的网站(2011 年)。 http://www.drdobbs.com/tools/fast-high-quality-parallel-random-number/229625477
  4. 英特尔® 数字随机数生成器 (DRNG) 库实施和使用,https://software.intel.com/zh-cn/articles/intel-digital-random-number-generator-drng-library-implementation-and-uses?utm_source=Email&utm_medium=IDZ
  5. 英特尔示例源代码许可协议,https://software.intel.com/zh-cn/articles/intel-sample-source-code-license-agreement/
  6. 英特尔® OpenCL™ Code Builderhttps://software.intel.com/zh-cn/opencl-code-builder

 平台分析器 — 分析健康状态和非健康状态的应用

$
0
0

最近,我的妻子买了一本又厚又贵的书。 作为儿童超声波诊断医生,她购买了许多书,但是这本书让我感到很不解。  书名是《论健康儿童的超声解剖》。  她为什么需要一本只针对健康儿童的书呢?  我向她提出了我的疑问,她的答案非常简单:如果要诊断所有疾病,包括尚未发现的疾病,你必须要了解健康的儿童是什么样的。 

在本文中,我们将像医生一样,对健康的应用和不太健康的应用进行分析和比较。

咚 — 咚 — 咚。

医生: “门开着,请进。”

Warrior Wave* 是一款非常棒的游戏,在游戏中,您的手就像是一条路,让战士通过;接下来我们把这个游戏当作病患来诊断一下。 使用英特尔® 实感™ 技术玩游戏和进行创新是一件极为有趣的事情。 

在玩游戏时,有些性能不太尽如人意。  这是我以前使用基于英特尔® 实感™ 技术时从来没感到过的。  问题可能是由许多事情导致,但是在这种情况下是什么原因呢?  

像优秀的医生配备最新、最棒的分析工具来诊断问题一样,我们也使用了最完美的工具来分析“病患”。

使用英特尔® 图形性能分析器(英特尔® GPA)平台分析器,我们可以接收到应用 CPU 负载、帧时间、每秒帧数 (FPS) 和绘制调用的时间线视图:

我们来看一下。

最吸引我们眼球的是定期出现的常规 FPS 激增。 在大约 200 毫秒内时,所有的进展都是相对平顺的,然后就是大幅上下动荡。

为了作比较,我们来看一下下面的健康 FPS 轨迹。 此轨迹中的游戏流畅,游戏体验较好。  

在帧时间内没有发现任何模式,只有正常的随机偏差。

但是,在我们的研究中,我们看到的是常规激增。 这些激增大约每秒钟出现四次。  我们更进一步了解了这个问题,并将重点放在其中一个激增以及线程中的运行情况:

我们可以看到正在工作的线程 2780 在同步方面花费了大部分的时间。 线程几乎不执行任何操作,只等待英特尔® 实感™ 软件开发套件的下一帧:

同时,我们可以看到该渲染在另一个工作线程中运行。 如果我们向下滚动,就会发现线程 2372。

游戏在“积极”等待英特尔实感软件开发套件的下一帧时,完全可以执行一些有价值的任务。 绘制和英特尔® 实感™ 软件开发套件工作可以在一个(而不是两个)工作线程中完成,以简化线程的通信。

线程过度通信会显著降低执行速度并导致出现诸多问题。

以下是“健康”游戏的示例,其中英特尔® 实感™ 软件开发套件任务和 DirectX* 调用位于同一个线程中。 

实感™ 专家表示:“等待英特尔® 实感™ 软件开发套件的帧毫无意义。 他们并不会更快做好准备。 

但是,我们可以看到主要问题出现在时间线顶端。

平均六分之五的 CPU 帧不会在一个 GPU 帧中。 这也是 GPU 帧速率速度较慢且不均匀的原因,平均低于 16 FPS。

接下来我们了解一下尝试的管线,并理解一下代码是如何执行的。  看一下“引擎 0”中的数据包数量,管线已经溢出,但是执行几乎为空。

处理器每秒钟可以处理 10 至 12 个单独的图像,并分别感知它们。 这也是为何最初的电影以 16 FPS 的速率进行剪辑的原因:该速率是多数人将静态图看作动态图的速率。

我们看一下拥有漂亮外观的游戏的档案: 

注意,GPU 帧按照 CPU 帧的速率运行,几乎没有变化。 对于每个 CPU 帧,都有一个 GPU 在稍作延迟之后开始执行。

我们来了解一下我们的游戏为什么没有此模式。

首先,我们来检查一下 DirectX* 调用。 带有工具提示并突出显示的调用是我们的 “Present” 调用,该调用可向 GPU 发送已经完成的帧。 在上方的截图中,我们可以看到,它能够在 GPU 管线上生成一个 “Present” 包(使用 X 标记)。  在大约 2215 毫秒的标记处,它更靠近执行,跳过 3 个位置,但是在 2231 毫米处时,它没有完成执行直接消失。

如果我们看一下轨迹中的每一个 present 调用,就会发现没有一个调用成功使其执行。

问题: 如果忽略所有 DirectX* Present 调用,游戏如何自动绘制? 好在我们可以使用出色的工具来解决。 我们来看一下。

您是否能看到灰色椭圆图案内有些奇怪? 我们可以看到该数据包不是由于 DirectX* 调用代码而生成,却仍然在快速且无序地执行。 嘿,慢一点!!!

我们来进一步了解一下该数据包。 

现在,我们来看一下执行的数据包。 

哇! 它来自一个“外部”线程。 这代表什么意思? 外部线程是指不属于游戏的线程。

我们自己的数据包被忽略,而一个外部线程绘制了我们的游戏? 什么? 嘿,这个工具疯了!

不,图像非常正确。 出现这种情况的原因是在 Windows* 系统上(自 Windows Vista* 起),有一个名为桌面窗口管理器 (DWM) 的程序,可以在屏幕上进行合成。 它的包便是我们所看到的以高优先级快速运行的数据包。  所以,我们的数据包并没有丢失,它们是由 DWM 截取,创建最后的图片。

DWM 为何会截取全屏游戏的数据包? 想了一下,我发现答案很简单: 我采用的是多显示器台式机配置。 将第二台显示器关闭会使得 Warrior Wave像其他游戏一样运行:正常的 GPU FPS,没有小故障,没有 DWM 包。

找到病因了! 真令人欣慰!

但是其他的游戏在多显示器配置下仍然能够正常运行,对吗(我脑袋中的另一个声音这么说)?

为了更深入地研究,我们需要另一种工具。 英特尔® GPA 平台分析器可帮助我们查看不同时间 CPU 和 GPU 的运行情况,但是它无法更详细地展示每一帧。

我们需要进一步了解一下 Direct3D* 设备生成代码。 对此,我们可以使用面向 DirectX* 的英特尔® GPA 帧分析器,但是我将会在另一篇文章中介绍该主题。

我们来总结一下学到的内容:

在此次调查中,我们检查到导致 FPS 激增的使用情况较差的线程,以及一个讨厌的 DWM 问题,该问题可通过切换到桌面方案的第二台显示器轻松解决。

结论: 英特尔® GPA 平台分析器是初步调查该问题的必备工具。 熟悉一下该工具,并将其添加到您的工具箱内。

关于作者:

Alexander Raud 是俄罗斯英特尔® 图形性能分析器团队的一员,以前在 VTune Amplifier 工作。 Alex 拥有俄罗斯和欧洲国家双重国籍,会讲俄罗斯语、英语、法语,目前正在学习西班牙语。  Alex 已婚,有两个孩子,是前卫金属职业乐手,并且是 Jesus Embassy Church 国际部的负责人。

Direct3D 12 翻转模型交换链示例应用

$
0
0

下载代码样本

相比于 D3D11,在 D3D12 中使用交换链会增加复杂性。 可能仅翻转模型 [1] 交换链适用于 D3D12。 它会涉及到许多必选参数,比如缓冲器数量、动态帧数量、显示 SyncInterval,以及是否使用 WaitableObject。 我们内部开发了这款应用,以帮助了解不同参数之间的交互,发现最实用的参数组合。

该应用包含渲染帧通过显示列队从 CPU 到 GPU 再到显示屏这一过程的交互可视化。 所有参数都可以实时调整。 通过屏幕统计数据显示器可以观察调整后对帧速率和延迟产生的影响。

Sample App Direct3D

图 1:含有注释的示例应用截屏

交换链参数

这些参数用于调查 D3D12 交换链。

参数描述
Fullscreen窗口覆盖屏幕时为真值(例如,无边框窗口模式)。 注: 不同于面向互斥模式的 SetFullscreenState。
Vsync控制 Present() 函数的 SyncInterval 参数。
Use Waitable Object交换链是否通过 DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT 创建而成
Maximum Frame Latency该值传递至 SetMaximumFrameLatency。 如果未启用 “Use Waitable Object”,则忽略。 如果没有可等待对象,Maximum Frame Latency 的有效值为 3。
BufferCount该值在 DXGI_SWAP_CHAIN_DESC1::BufferCount 中加以规定。
FrameCount等待最早的一个游戏帧完成之前在 CPU 上生成的 “game frames” 的最大值。 game frame(游戏帧)是一种用户数据结构,D3D12 栅栏负责追踪它在 GPU 上的完成情况。 多个游戏帧可以指向同一个交换链缓冲区。

其他参数

这些参数也纳入至了交换链调查。 不过它们的值是固定的。 下面我们通过列表来解释这些值为何固定不变。

参数描述
Exclusive mode由于显示统计数据机制不在互斥模式下运行,因此示例从不调用 SetFullscreenState。
SwapEffect该值在 DXGI_SWAP_CHAIN_DESC1::SwapEffect 中加以规定。 通常设为 DXGI_SWAP_EFFECT_FLIP_DISCARD。 DISCARD 是最不常规定的行为,它为操作系统提供最大的灵活性来优化演示。 另外唯一的一个选项 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 仅用于涉及重新使用之前显示的映像区的操作(例如,滚动矩形)。

了解 BufferCount 和 FrameCount

BufferCount 指交换链中缓冲区的数量。 借助翻转模型交换链,操作系统可能针对显示时的整个同步间隔锁定 1 个缓冲区,因此,供应用写入的缓冲区数量实际上是 BufferCount-1。 如果 BufferCount = 2,表示操作系统在下一个同步期间发布第 2 个缓冲区之前,只有 1 个供写入的缓冲区。 这样会导致一种后果,即帧速率无法超越刷新率。

当 BufferCount >= 3,表示至少有 2 个供应用写入的缓冲区,相互之间可以循环(假设 SyncInterval=0),这样帧速率将是无限的。

FrameCount 指动态 “渲染帧” 的最大数量,其中渲染帧指 GPU 必须执行渲染的资源和缓冲区的集。 如果 FrameCount = 1,表示 CPU 不会构建下一个渲染帧,直到前一个彻底处理完。 这意味着,FrameCount 必须至少是 2,这样 CPU 和 GPU 才能并行运行。

最长帧延迟,以及 “Waitable Object” 如何降低延迟

延迟指帧从生成到显示于屏幕期间所消耗的时间。 因此,为了将间隔固定(同步)的显示系统中的延迟降到最低,帧生成后必须尽快显示。

排队显示操作的最大数称为“最长帧延迟”。 如果应用在达到该限值后尝试排列其他显示,Present() 将阻止这种排列,直到前一个帧完成显示。

渲染线程用于阻止 Present 函数的时间均发生在帧生成和帧显示期间,因此,这样会直接延长帧显示的延迟。 使用“可等待对象”可以消除这种延迟。

从概念上来说,“可等待对象”可视作初始化为“最长帧延迟”的旗语 (semaphore)。如果显示从“显示队列”中删除,该旗语会收到信号。 如果应用在渲染之前等待旗语收到信号,显示队列就不会填满(Present 也将不会阻止),这样延迟就会消除。

最佳参数预设

调查结果根据您的具体要求,提供了 3 个不同的 “最佳” 值。 我们认为这些参数组合最适合于游戏。


Direct3D Game Mode

游戏模式

  • 同步启用
  • 3 个缓冲区,2 帧
  • 可等待对象,最长帧延迟 2

游戏模式很好地平衡了延迟和吞吐量。


Direct3D Classic Mode

经典游戏模式

  • 同步启用
  • 3 个缓冲区,3 帧
  • 未使用可等待对象

在 D3D11 带有 3 次缓冲的情况下,这种模式会隐式地发生,故称为 “经典” 模式。 经典游戏模式侧重于吞吐量。 额外帧排列能够更好地利用峰值,但要以延迟为代价。


Direct3D Minimum Latency

最低延迟

  • 同步启用
  • 2 个缓冲区,1 帧
  • 可等待对象,最长帧延迟 1

在不使用 VR 风格的同步竞态技巧的情况下,延迟绝对是最低的。 如果应用错过同步,帧速率会立即下降至刷新率的 1/2。 CPU 和 GPU 将以串行,而非并行的方式运行。


应用版本

源代码包含一个项目文件,以将示例构建为 Windows 10 通用应用。 Direct3D 代码的唯一区别是调用 CreateSwapChainForCoreWindow,而非 CreateSwapChainForHWND。

如果想在无需编译的情况下试用应用版本,请点击此处的链接进入 Windows 应用商店页面:https://www.microsoft.com/store/apps/9NBLGGH6F7TT

参考资料

1 - “DXGI 翻转模型。”https://msdn.microsoft.com/zh-cn/library/windows/desktop/hh706346%28v=vs.85%29.aspx

2 - “借助 DXGI 1.3 交换链降低延迟。”https://msdn.microsoft.com/zh-cn/library/windows/apps/dn448914.aspx

3 - DirectX 12:Windows 10 中的演示模式。https://www.youtube.com/watch?v=E3wTajGZOsA

4 - DirectX 12:非节流帧速率。https://www.youtube.com/watch?v=wn02zCXa9IU

采用英特尔® 实感™ 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 审阅本文。

 

使用英特尔® 实感™ SDK 手标模块创建虚拟摇杆

$
0
0

摘要

本文演示了使用英特尔® 实感™ SDK中包含的全新手标模块,创建虚拟摇杆应用的代码编写过程。 本项目使用 C#/XAML 开发,并可以使用 Microsoft Visual Studio* 2015构建。


图 1:控制 Google Earth* 飞行模拟器的 RS 摇杆应用。

简介

英特尔实感 SDK 的 R5 中推出了对全新 英特尔® 实感™SR300型摄像头的支持。 SR300 是 F200 型的后续产品,提供了一组改进,以及被称为手标模块的全新功能。

正如 SDK 文档中所介绍的,手标模块会返回手上的单个点,实现准确、响应迅捷的跟踪。 其目的是,促进基于手部的 UI 控制使用案例,以及对有限手势集的支持。

本文介绍的摇杆模拟器应用 RS Joystick 将 SDK 提供的 3D 手部数据映射到虚拟摇杆控件,无需手即可与摇杆控制器使用的软件应用交互。

RS Joystick 应用充分利用了以下手标模块功能:

  • 体侧类型– 该应用会基于近远进入顺序,通知用户正在控制虚拟摇杆的手。
  • 鼠标单击手势– 用户可以做手指点击手势,切换虚拟摇杆控制器按钮 1 的开-关状态。
  • 自适应点跟踪– 应用会在手标模块定义的想象“边界框”内显示基准 3D 点,并使用此数据控制虚拟摇杆的 x、y 和 z 轴。
  • 提醒数据– 当用户的手超出 SR300 摄像头的范围时,应用会使用未检测到光标光标脱离光标在边界之外提醒,并将摇杆边界从绿色变成红色。

(有关手标模块的更多信息,请访问“您可以使用英特尔实感光标模式做什么?”)

前提条件

您应拥有一些 C# 知识,同时了解 Visual Studio 的基本操作,如生成可执行文件。 拥有添加第三方库到自定义软件项目的经验非常有用,但本演示会提供详细的步骤(如果还不熟悉)。 您的系统需要安装前置 SR300 摄像头、最新版本的 SDK 和英特尔® 实感™ Depth Camera Manager (DCM),同时必须满足此处列出的硬件要求。 最后,您的系统必须运行 Microsoft Windows* 10 Threshold 2。

第三方软件

除了英特尔实感 SDK之外,该项目还包含了名为vJoy* 的第三方虚拟摇杆设备驱动程序,以及一些动态链接库 (DLL)。 这些软件组件不是本定制项目相关的任何分布式代码的一部分,因此以下提供了下载和安装设备驱动程序的详细信息。

安装英特尔实感 SDK

https://software.intel.com/zh-cn/intel-realsense-sdk/download下载并安装所需 DCM 和 SDK。 编写本文时,这些组件的当前版本是:

  • 英特尔实感 Depth Camera Manager (SR300) v3.1.25.1077
  • 英特尔实感 SDK v8.0.24.6528

安装 vJoy 设备驱动程序和 SDK

下载并安装 vJoy 设备驱动程序:http://vjoystick.sourceforge.net/site/index.php/download-a-install/72-download。 当收到指示完成安装时,重启计算机。

安装后,vJoy 设备驱动程序会显示在设备管理器中的人机界面设备下(参见图 2)。


图 2:设备管理器。

接下来,打开 Windows 10 开始菜单并选择所有应用。 您会找到几个已安装的 vJoy 组件,如图 3 所示。


图 3:Windows 开始菜单。

要打开默认浏览器并转到下载页面,单击 vJoy SDK按钮。

下载后,复制 .zip 文件到临时文件夹,解压缩,然后找到 \SDK\c#\x86 中的 C# DLL。

一旦创建,我们将添加这些 DLL 到 Visual Studio 项目,如同后续步骤所述。

创建一个新的 Visual Studio 项目

  • 启动 Visual Studio 2015。
  • 从菜单栏选择文件新建,项目…。
  • 在“新建项目”屏幕中,展开“模板”并选择 Visual C#Windows
  • 选择 WPF 应用
  • 指定新项目的位置及其名称。 对于本项目,我们的位置是 C:\,同时应用名称是 RsJoystick

图 4 显示了本项目使用的新项目设置。


图 4:Visual Studio* 新项目设置。

单击“确定”,创建项目。

复制库到项目

在 C# 中创建英特尔® 实感™ 应用需要两个 DLL:

  • libpxcclr.cs.dll – 托管 C# 接口 DLL
  • libpxccpp2c.dll – 非托管 C++ P/Invoke DLL

类似地,需要两个 DLL 以便应用与 vJoy 设备驱动程序进行通信:

  • vJoyInterface.dll – C 语言 API 库
  • vJoyInterfaceWrap.dll – 针对 C 语言 API 库的 C# 打装程序

为简化项目的整体结构,我们将直接复制所有这四个文件到项目文件夹:

  • 右键单击 RsJoystick 项目并选择添加现有项目…
  • 导航到 vJoy DLL 的位置(即 \SDK\c#\x86)并同时选择 vJoyInterface.dll 和 vJoyInterfaceWrap.dll。 注意:您可能需要为文件类型指定所有文件 (*.*) 以便 DLL 可见。
  • 单击添加按钮。

类似地,复制英特尔实感 SDK DLL 到项目:

  • 右键单击 RsJoystick 项目,然后选择添加现有项目…
  • 导航到 x86 库所在的位置,在默认 SDK 安装中,这是 C:\Program Files (x86)\Intel\RSSDK\bin\win32。
  • 同时选择 libpxcclr.cs.dll 和 libpxccpp2c.dll。
  • 单击添加按钮。

现在,所有四个文件应在 RsJoystick 项目下的 Solution Explorer 中可见。

创建库的引用

物理复制所需库文件到 Visual Studio 项目后,您必须创建托管 (.NET) DLL 的参考,以便它们可以被您的应用使用。 右键单击引用(位于 RsJoystick 项目下)并选择 Reference Manager 窗口中的添加引用…,单击浏览按钮并导航到项目文件夹 (c:\RsJoystick\RsJoystick)。 同时选择 libpxcclr.cs.dll 和 vJoyInterfaceWrap.dll 文件,然后单击添加按钮。 单击 Reference Manager 中的确定按钮。

要让托管打包程序 DLL 正常运行,运行应用之前,您需要确保非托管 DLL 被复制到项目的输出文件夹。 在 Solution Explorer 中,单击 libpxccpp2c.dll 以选择。 “属性”屏幕将显示 libpxccpp2c.dll 的文件属性。 找到复制到输出目录字段,并使用下拉列表选择始终复制。 为 vJoyInterface.dll 重复本步骤。 这可确保当生成应用时,非托管 DLL 会被复制到项目输出文件夹。

此时,您可能会看到警告,显示正在生成项目的处理器架构和参考库的处理器架构不匹配。 要清除本警告,请完成以下操作:

  • 在菜单栏的下拉列表找到 Configuration Manager 的链接(参见图 5)。
  • 选择 Configuration Manager
  • 在 Configuration Manager 屏幕中,展开平台列中的下拉列表,然后选择新建
  • x86选为新平台,然后单击确定
  • 关闭 Configuration Manager 屏幕。


图 5:Configuration Manager。

此时,应可以生成和运行项目,不会出现任何错误或警告。 此外,如果查看输出文件夹 (c:\RsJoystick\RsJoystick\bin\x86\Debug) 的内容,您应看到所有四个 DLL 也被复制。

用户界面

用户界面(参见图 6)显示以下信息:

  • 基于近远进入顺序控制虚拟摇杆的用户的手(即,最靠近摄像头的手是控制手)。
  • 虚拟摇杆控制器上的按钮 1 的开-关状态,通过做手指单击手势来控制。
  • 椭圆跟踪用户的手在 x 和 y 轴的相对位置,并基于 z 轴更改直径,从而指示手部距摄像头的距离。
  • x、y 和 z 轴自适应点数据来自 SDK,这将在零至一的范围内显示为基准值。
  • 当用户的手远离 SR300 摄像头范围时,彩色边框将从绿色变成红色。
  • 滑块控件允许调整每根轴的灵敏度。


图 6:用户界面。

表 1 列出了完整 XAML 源代码列表。 这可直接复制并粘贴到创建项目时自动生成的 MainWindow.xaml 代码。

表 1:XAML 源代码列表: MainWindow.xaml。

<Window x:Class="RsJoystick.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RsJoystick"
        mc:Ignorable="d"
        Title="RSJoystick" Height="420" Width="420" Background="#FF222222" Closing="Window_Closing"><Window.Resources><Style x:Key="TextStyle" TargetType="TextBlock"><Setter Property="Foreground" Value="White"/><Setter Property="FontSize" Value="14"/><Setter Property="Text" Value="-"/><Setter Property="Margin" Value="4"/><Setter Property="HorizontalAlignment" Value="Center"/></Style></Window.Resources><StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="320"><TextBlock x:Name="uiBodySide" Style="{StaticResource TextStyle}"/><TextBlock x:Name="uiButtonState" Style="{StaticResource TextStyle}"/><Border x:Name="uiBorder" BorderThickness="2" Width="200" Height="200" BorderBrush="Red" Margin="4"><Canvas x:Name="uiCanvas" ClipToBounds="True"><Ellipse x:Name="uiCursor" Height="10" Width="10" Fill="Yellow"/><Ellipse Height="50" Width="50" Stroke="Gray" Canvas.Top="75" Canvas.Left="75"/><Rectangle Height="1" Width="196" Stroke="Gray" Canvas.Top="100"/><Rectangle Height="196" Width="1" Stroke="Gray" Canvas.Left="100"/></Canvas></Border><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiX" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderX" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiY" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderY" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><TextBlock x:Name="uiZ" Style="{StaticResource TextStyle}" Width="80"/><Slider x:Name="uiSliderZ" Width="150" ValueChanged="sldSensitivity_ValueChanged" Margin="4"/></StackPanel></StackPanel></Window>

程序源代码

表 2 显示了 RSJoystick 应用的完整 C# 源代码列表。 这可直接复制并粘贴到创建项目时自动生成的 MainWindow.xaml.cs 代码。

表 2.C# 源代码列表: MainWindow.xaml.cs

//--------------------------------------------------------------------------------------
// Copyright 2016 Intel Corporation
// All Rights Reserved
//
// Permission is granted to use, copy, distribute and prepare derivative works of this
// software for any purpose and without fee, provided, that the above copyright notice
// and this statement appear in all copies.  Intel makes no representations about the
// suitability of this software for any purpose.  THIS SOFTWARE IS PROVIDED "AS IS."
// INTEL SPECIFICALLY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, AND ALL LIABILITY,
// INCLUDING CONSEQUENTIAL AND OTHER INDIRECT DAMAGES, FOR THE USE OF THIS SOFTWARE,
// INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PROPRIETARY RIGHTS, AND INCLUDING THE
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  Intel does not
// assume any responsibility for any errors which may appear in this software nor any
// responsibility to update it.
//--------------------------------------------------------------------------------------
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using vJoyInterfaceWrap;
using System.Threading;
using System.Windows.Shapes;

namespace RsJoystick
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private PXCMSenseManager sm;
        private PXCMHandCursorModule cursorModule;
        private PXCMCursorConfiguration cursorConfig;
        private vJoy joystick;
        private Thread update;
        private double joySensitivityX;
        private double joySensitivityY;
        private double joySensitivityZ;
        private const uint joyID = 1;
        private const uint MaxSensitivity = 16384;

        public MainWindow()
        {
            InitializeComponent();

            // Configure the sensitivity controls
            uiSliderX.Maximum = MaxSensitivity;
            uiSliderY.Maximum = MaxSensitivity;
            uiSliderZ.Maximum = MaxSensitivity;
            joySensitivityX = uiSliderX.Value = MaxSensitivity / 2;
            joySensitivityY = uiSliderY.Value = MaxSensitivity / 2;
            joySensitivityZ = uiSliderZ.Value = MaxSensitivity / 2;

            // Create an instance of the joystick
            joystick = new vJoy();
            joystick.AcquireVJD(joyID);

            // Configure the cursor mode module
            ConfigureRealSense();

            // Start the Update thread
            update = new Thread(new ThreadStart(Update));
            update.Start();
        }

        public void ConfigureRealSense()
        {
            // Create an instance of the SenseManager
            sm = PXCMSenseManager.CreateInstance();

            // Enable cursor tracking
            sm.EnableHandCursor();

            // Get an instance of the hand cursor module
            cursorModule = sm.QueryHandCursor();

            // Get an instance of the cursor configuration
            cursorConfig = cursorModule.CreateActiveConfiguration();

            // Make configuration changes and apply them
            cursorConfig.EnableEngagement(true);
            cursorConfig.EnableAllGestures();
            cursorConfig.EnableAllAlerts();
            cursorConfig.ApplyChanges();

            // Initialize the SenseManager pipeline
            sm.Init();
        }

        private void Update()
        {
            bool handInRange = false;
            bool joyButton = false;

            // Start AcquireFrame-ReleaseFrame loop
            while (sm.AcquireFrame(true).IsSuccessful())
            {
                PXCMCursorData cursorData = cursorModule.CreateOutput();
                PXCMPoint3DF32 adaptivePoints = new PXCMPoint3DF32();
                PXCMCursorData.BodySideType bodySide;

                // Retrieve the current cursor data
                cursorData.Update();

                // Check if alert data has fired
                for (int i = 0; i < cursorData.QueryFiredAlertsNumber(); i++)
                {
                    PXCMCursorData.AlertData alertData;
                    cursorData.QueryFiredAlertData(i, out alertData);

                    if ((alertData.label == PXCMCursorData.AlertType.CURSOR_NOT_DETECTED) ||
                        (alertData.label == PXCMCursorData.AlertType.CURSOR_DISENGAGED) ||
                        (alertData.label == PXCMCursorData.AlertType.CURSOR_OUT_OF_BORDERS))
                    {
                        handInRange = false;
                    }
                    else
                    {
                        handInRange = true;
                    }
                }

                // Check if click gesture has fired
                PXCMCursorData.GestureData gestureData;

                if (cursorData.IsGestureFired(PXCMCursorData.GestureType.CURSOR_CLICK, out gestureData))
                {
                    joyButton = !joyButton;
                }

                // Track hand cursor if it's within range
                int detectedHands = cursorData.QueryNumberOfCursors();

                if (detectedHands > 0)
                {
                    // Retrieve the cursor data by order-based index
                    PXCMCursorData.ICursor iCursor;
                    cursorData.QueryCursorData(PXCMCursorData.AccessOrderType.ACCESS_ORDER_NEAR_TO_FAR,
                                               0,
                                               out iCursor);

                    adaptivePoints = iCursor.QueryAdaptivePoint();

                    // Retrieve controlling body side (i.e., left or right hand)
                    bodySide = iCursor.QueryBodySide();

                    // Control the virtual joystick
                    ControlJoystick(adaptivePoints, joyButton);
                }
                else
                {
                    bodySide = PXCMCursorData.BodySideType.BODY_SIDE_UNKNOWN;
                }

                // Update the user interface
                Render(adaptivePoints, bodySide, handInRange, joyButton);

                // Resume next frame processing
                cursorData.Dispose();
                sm.ReleaseFrame();
            }
        }

        private void ControlJoystick(PXCMPoint3DF32 points, bool buttonState)
        {
            double joyMin;
            double joyMax;

            // Scale x-axis data
            joyMin = MaxSensitivity - joySensitivityX;
            joyMax = MaxSensitivity + joySensitivityX;
            int xScaled = Convert.ToInt32((joyMax - joyMin) * points.x + joyMin);

            // Scale y-axis data
            joyMin = MaxSensitivity - joySensitivityY;
            joyMax = MaxSensitivity + joySensitivityY;
            int yScaled = Convert.ToInt32((joyMax - joyMin) * points.y + joyMin);

            // Scale z-axis data
            joyMin = MaxSensitivity - joySensitivityZ;
            joyMax = MaxSensitivity + joySensitivityZ;
            int zScaled = Convert.ToInt32((joyMax - joyMin) * points.z + joyMin);

            // Update joystick settings
            joystick.SetAxis(xScaled, joyID, HID_USAGES.HID_USAGE_X);
            joystick.SetAxis(yScaled, joyID, HID_USAGES.HID_USAGE_Y);
            joystick.SetAxis(zScaled, joyID, HID_USAGES.HID_USAGE_Z);
            joystick.SetBtn(buttonState, joyID, 1);
        }

        private void Render(PXCMPoint3DF32 points,
                            PXCMCursorData.BodySideType bodySide,
                            bool handInRange,
                            bool buttonState)
        {
            Dispatcher.Invoke(delegate
            {
                // Change drawing border to indicate if the hand is within range
                uiBorder.BorderBrush = (handInRange) ? Brushes.Green : Brushes.Red;

                // Scale cursor data for drawing
                double xScaled = uiCanvas.ActualWidth * points.x;
                double yScaled = uiCanvas.ActualHeight * points.y;
                uiCursor.Height = uiCursor.Width = points.z * 100;

                // Move the screen cursor
                Canvas.SetRight(uiCursor, (xScaled - uiCursor.Width / 2));
                Canvas.SetTop(uiCursor, (yScaled - uiCursor.Height / 2));

                // Update displayed data values
                uiX.Text = string.Format("X Axis: {0:0.###}", points.x);
                uiY.Text = string.Format("Y Axis: {0:0.###}", points.y);
                uiZ.Text = string.Format("Z Axis: {0:0.###}", points.z);
                uiBodySide.Text = string.Format("Controlling Hand: {0}", bodySide);
                uiButtonState.Text = string.Format("Button State (use 'Click' gesture to toggle): {0}",
                                                    buttonState);
            });
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            update.Abort();
            cursorConfig.Dispose();
            cursorModule.Dispose();
            sm.Dispose();
            joystick.ResetVJD(joyID);
            joystick.RelinquishVJD(joyID);
        }

        private void sldSensitivity_ValueChanged(object sender,
                                                 RoutedPropertyChangedEventArgs<double> e)
        {
            var sliderControl = sender as Slider;

            switch (sliderControl.Name)
            {
                case "uiSliderX":
                    joySensitivityX = sliderControl.Value;
                    break;
                case "uiSliderY":
                    joySensitivityY = sliderControl.Value;
                    break;
                case "uiSliderZ":
                    joySensitivityZ = sliderControl.Value;
                    break;
            }
        }
    }
}

代码细节

为保持本代码尽可能简单,所有方法都包含在单个类中。 正如表 2 中显示的源代码一样,MainWindow 类由以下方法组成:

  • MainWindow()– 在 MainWindow 类的开始声明几个私有对象和成员变量。 实例化这些对象并在 MainWindow 构建器中初始化变量。
  • ConfigureRealSense()– 本方法处理创建 SenseManager 对象和手标模块,以及配置光标模块的详细信息。
  • Update()– 正如英特尔实感 SDK 参考手册中介绍的那样,SenseManager 接口可被程序调用或事件回调使用。 在 RSJoystick 应用中,我们正在使用程序调用作为选定接口技术。 获取/释放帧循环在 Update() 线程中运行,独立于主 UI 线程。 此线程连续运行,并可在此获取手标数据、手势和提醒数据。
  • ControlJoystick()– 当检测到用户的手时,将从 Update() 线程调用此方法。 自适应点数据被传输给此方法,包括虚拟摇杆按钮的状态(通过 CURSOR_CLICK 手势切换)。 使用来自灵敏度滑块控件的值扩展自适应点数据。 滑块控件和缩放计算让用户能够为发送到 vJoy SetAxis() 方法的值选择完全范围,预期是 0 至 32768 范围的值。 通过设为最大的灵敏度滑块,相应光标数据点会转换为 0 至 32768 范围的值。 对于同一手轨迹,更低的灵敏度设置会缩小这一范围。 例如: 8192 至 24576。
  • Render()– 从 Update() 线程调用此方法,并使用 Dispatcher.Invoke() 方法执行要在 UI 线程上执行的操作。 这包括更新画布控件上的椭圆位置,以及在 TextBlock 控件中显示的数据值。
  • sldSensitivity_ValueChanged() – 只要调整任何滑块控件,此事件处理程序就会发出。

使用应用

您可从 Windows 10 开始菜单运行 vJoy Monitor 来测试应用(参见图 3)。 正如图 7 所示,您可以监控在三根轴中移动手,并执行单击手势以切换按钮 1 时的效果。


图 7:使用 vJoy Monitor 测试应用。

为实现更加有趣和实用的使用,您可以运行 Google Earth 提供的飞行模拟器*(参见图 1)。 据其网站介绍,“Google Earth 让您可在地球的任何地方飞行,查看卫星图像、地图、地形、3D 建筑,从外太空的星系到大海的峡谷。” (https://www.google.com/earth)。

下载并安装 Google Earth 后,请参见此处的说明来运行飞行模拟器。 从降低 RSJoystick 中的 x 和 y 轴灵敏度控件以减少部手动作对飞机的影响开始,并将 z 轴滑块设到最大位置。 经过一些尝试后,您应能够以轻柔的手部动作控制飞机。

总结

本文提供了简单的演示,介绍如何从头开始生成支持 英特尔实感 SDK 的摇杆模拟器应用,以及如何使用 SR300 摄像头支持的手标模块。

关于英特尔实感技术

如欲了解更多有关面向 Windows 的英特尔实感软件开发套件的信息,请访问:https://software.intel.com/zh-cn/intel-realsense-sdk

关于作者

Bryan Brown 是英特尔公司软件和服务部门的软件应用工程师。

借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流

$
0
0

下载代码示例 

简介

该可下载代码示例简要介绍了如何使用英特尔® 实感™ SDKMATLAB 的图像采集工具箱适配器套件MATLAB® 工作区获取英特尔® 实感™ 摄像头(R200F200)的原始摄像头数据流。 该示例代码支持 MATLAB 开发人员开发面向英特尔® 平台、并具备以下特性的英特尔® 实感™ 应用:

  • 多数据流同步。同时获取颜色数据流和景深数据流(见图 1)。
  • 多摄像头支持。同时获取多个摄像头的原始数据流。
  • 用户可调整属性。该适配器支持包含特定于摄像头的不同属性的视频输入。
Raw Intel® RealSense™ camera (F200) color and depth streams in the MATLAB* figure.
图 1. MATLAB* 中的原始英特尔® 实感™ 摄像头 (F200) 颜色和景深数据流图。


软件开发环境

该代码示例使用 Microsoft Visual Studio* 2013 在 Windows 8* 上创建而成。 本项目使用的 MATLAB 版本为 MATLAB R2015a。

本项目使用的 SDK 和景深摄像头管理器 (DCM) 版本分别为:

  • 英特尔实感 SDK V7.0.23.8048
  • 英特尔实感景深摄像头管理器 F200 V1.4.27.41944
  • 英特尔实感景深摄像头管理器 R200 V2.0.3.53109

硬件概览

我们使用了英特尔® 实感™ 开发人员套件 (F200)英特尔实感开发人员套件 (R200)

关于代码

该代码示例可内置于动态链接库 (DLL),从而通过英特尔实感 SDK 连接 MATLAB 图像采集工具箱™ 和英特尔实感摄像头。 图 2 所示为该适配器与 MATLAB 和英特尔实感摄像头之间的关系。 MATLAB 的图像采集工具箱™ 是一种标准界面,可用于采集成像设备是图像和视频。

The relationship of the adaptor to the MATLAB* and Intel® RealSense™ cameras.
图 2. 适配器与 MATLAB 和英特尔® 实感™ 摄像头之间的关系。


我使用的 MATLAB 安装路径和 SDK 安装路径分别为 C:\MATLABC:\Program Files (x86)\Intel\RSSDK。 请注意,如果 SDK 和 MATLAB 安装路径不同,需要更改包含目录和库目录。 还需要在包含 MATLAB 安装文件夹名称的系统变量中设置环境变量 MATLAB。

用于放置整个代码示例 RealSenseImaq的文件位置是 C:\My_Adaptor\RealSenseImaqRealSenseImaq解决方案位于该目录下方。 RealSenseImaq解决方案实际上由两个项目组成:

  • imaqadaptorkit是 MATLAB 提供的一个适配器套件项目,有助于轻松参考 MATLAB 中的一些适配器套件文件。 本项目的文件位置是:<your_matlab_installation_directory>\R2015a\toolbox\imaq\imaqadaptors\kit
  • RealSenseImaq是用于采集原始摄像头数据流的适配器项目。 可同时采集多个摄像头的颜色和景深数据。 它还能够支持包含不同属性(特定于摄像头)的视频输入。

如何运行代码

如欲通过此代码示例构建 DLL:

  • 首先以管理员身份运行 Microsoft Visual Studio,并打开 RealSenseImaq解决方案。 必须确保在项目属性中的平台设置下方指定 “x64”。
  • 如欲构建该代码示例,在解决方案浏览器中右击项目 RealSenseImaq,然后从菜单选项以启动项的形式选择并构建。
  • MATLAB 开发人员以及对源代码不感兴趣的用户可从 C:\My_Adaptor\RealSenseImaq\x64\Debug\文件夹中查找预构建 DLL。 请注意,如果将代码示例放在不同的位置,需要更改 DLL 目录。

如欲将 DLL 寄存在 MATLAB 中:

  • 必须借助 Imaqregister函数寄存 DLL,以将 DLL 的存在告知图像采集工具箱™ 软件。 可使用以下 MATLAB 代码来寄存 DLL:

Imaqregister (‘<your_directory>\RealSenseImaq.dll’);

  • 启动 MATLAB,并调用 imaqhwinfo函数。 此时您应该能看到,InstalledAdaptors字段中已列出包含在适配器中的 RealSenseImaq适配器。

如欲在 MATLAB 中运行 DLL:

我创建了 3 个 MATLAB 脚本,并将其放在代码示例目录 C:\My_Adaptor\RealSenseImaq\matlab的下方。

如欲开始在 MATLAB 中运行 DLL,可使用以下脚本:

  • MATLAB 脚本 “test1” 可用于在 MATLAB 中采集原始 F200 颜色数据流。
  • 使用 MATLAB 脚本 “test2” 可同时采集英特尔实感摄像头 (F200) 的原始颜色和景深数据流(见图 1)。
  • 您还可以使用该适配器调整特定于摄像头的属性,并检索属性的当前值。 例如,代码示例文件中的 MATLAB 脚本 “test3” 可用于检索色彩亮度的当前值,并对其进行调整。

立即查看

点击下载链接,获取代码。

关于英特尔® 实感™ 技术

如要开始使用,了解更多有关面向 Windows 的英特尔实感软件开发套件的信息,请访问:https://software.intel.com/zh-cn/intel-realsense-sdk

关于 MATLAB®

MATLAB 是一种高级语言和交互式环境,可支持您探索和呈现各种创意,并进行跨学科协作。 如欲了解有关 MATLAB 的更多信息,请访问 http://www.mathworks.com/products/matlab/

关于作者

Jing Huang 是英特尔开发人员关系部门的软件应用工程师。 她目前专注于基于英特尔平台的英特尔实感 SDK 的应用性能,但她在视频与图像处理,以及计算机愿景方面拥有丰富的经验,大多应用于医疗成像应用和多摄像头应用,比如视频追踪和分类。

Viewing all 154 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>