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

使用英特尔® 软件开发仿真器的优势

0
0

简介

全新的英特尔处理器引入了增强型扩展指令集,以此提升应用的性能或增强其安全性。  英特尔 AVX1和 AVX21等扩展指令集主要用于提升性能,而英特尔 SHA2指令则用于 SHA 加速,从而增强应用的安全性。

如果开发人员希望用这些新指令创建应用,但目前的硬件不支持这些指令该怎么办?  公司如何证明购买新系统来支持新指令的价值,同时确保其应用能够充分利用这些新指令来提升性能?

英特尔® 软件开发仿真器可用于在不支持新指令的系统上执行包含这些指令的应用。

本文将探讨使用 SDE 测试使用新指令的代码所带来的优势。

什么是英特尔软件开发仿真器 (SDE)?

顾名思义,SDE 是一套仿真器,支持带有新指令的代码在不支持这些指令的系统上运行。 如欲了解关于 SDE 的更多信息,请访问 [3]。   但有一点需注意,SDE 仅用于评估功能,而无法评估性能,因为其运行程序的速度比本地硬件慢。  SDE 可点击 此处进行下载。

如果要使用 SDE 测试带有新指令的应用,首先需要使用支持新指令集的编译器编译该应用。  比如,编译带有 AVX2 指令的应用时,可以使用英特尔编译器 14.0、gcc 4.7 或 Microsoft* Visual Studio*,或这些编译器的最新版本。  SDE 以汇编语言列出所有指令,  不仅包括用户应用的指令,还包括函数库和内核中的指令。

如需显示完整的 SDE 选项列表,请在命令提示符后输入以下命令:

sde –help

图 1. 列出所有 SDE 选项

如需显示更多 SDE 选项类别:

% sde –帮助使用:

如何使用 SDE

本文将介绍如何使用两种常用的 SDE 选项。  请访问 [4],观看介绍如何下载、安装和运行 SDE 的视频。

下面仅介绍两种最常用的 SDE 选项:

混合

        

图 2. mix 选项

图 2 显示了带有默认输出或用户定义的输出文件的 mix 选项。“-mix” 和 “-omix” 选项将列出所有执行的动态         指令,以及指令长度、指令类型和 ISA 扩展指令集分组。 要使用该选项运行 SDE,请在命令提示符后输入以下命令:

        sde.exe -mix -- <application name>

结果将被写入名为 mix.out 的文件。  如需为该输出文件指定一个不同的名称,请使用下列命令:

        sde.exe –omix <user-defined output file name> -- <application name>

ast

        

图 3. ast 选项

图 3 显示了带有默认输出或用户定义的输出文件的 ast 选项。使用 “-ast” 或 “-oast” 选项检测 SSE 和 AVX/AVX2 指令之间是否发生转换。  该选项非常有用,因为这两类指令之间的转换活动通常耗费多个执行周期。  减少指令的转换将有助于提升应用的性能。  请在命令提示符后输入以下命令,运行使用该选项的 SDE:

        sde.exe -ast -- <application name>

结果将被写入名为 avx-sse-transition.out 的文件。  如需为该输出文件指定一个不同的名称,请使用下列                 命令:

         sde.exe -oast <user-defined output file name> -- <application name>

: 这两个选项还可合并为一个命令,如下所示:

sde.exe -mix -ast -- <application name>

sde.exe –omix < output mix file name> -oast < output ast file name> -- <application name>

详细了解 ‘mix’ 选项的输出

使用 mix 选项得出的输出文件包含大量信息,本文不对此一一作出解释。  我们重点了解文件中的某几个部分。

图 4. 这部分输出文件显示了该应用 (linkpack_xeon64) 目前正运行 28 条线程。

图 5. 本图中的输出显示了一部分同时使用指令和指令类型(AVX、FMA 和 SSE)的线程 0 (TID 0)。

图 6. 线程结尾部分汇总了线程中所使用的指令以及被调用的频率。

图 7. 输出文件结尾部分汇总了应用中的所有指令,以及该应用所使用的函数库。

详细了解 ‘ast’ 选项的输出

使用 ast 选项运行 SDE 时所得出的输出有助于识别 SSE 与 AVX 之间的双向转换。

图 8.  SSE 与 AVX 之间不存在转换

图 8 显示了 SSE 与 AVX 之间不存在转换时的情况。 SSE 与 AVX 两者之间的转换需耗费多个宝贵的执行周期。  有时,耗费的周期多达 20,000 个。  因此减少这些转换活动非常重要。  如果7存在转换活动,其转换输出文件如图 9 所示。

图 9.  SSE 与 AVX 之间存在转换

[9] 中的文章很好地介绍了如何避免这些转换惩罚。

使用 SDE 的优势

检测指令

SDE 仅计算应用运行过程中所(动态)执行的指令,而不计算代码中的(静态)指令。  假设某些指令要在代码的某些部分内执行,这种方法可以很好地调试有问题的应用。 如果与代码的某些部分所对应的特定地址块中未检测到预期的指令,那么肯定会出现意外分支或其他状况。 SDE 可提供起始地址,结束地址等选项来应对这种状况。  请注意,SDE 尚未记录这类选项5。  希望以后的 SDE 版本会记录这些选项。

这里有一点需注意,即运行带有不同选项或输入的应用还将触发不同的行为和动态执行,因此不能指望通过单次运行应用来确定整体应用性能。  通常情况下,我们建议您使用不同的工作负载运行应用并观察其行为。

潜在的性能提升

SDE 可检测 SSE 与 AVX 两者之间的转换。  减少这些转换活动可有效提升性能。

检查“无效指标”和“数据未对齐”

SDE 还可检查无效指标和数据未对齐。  下面是从 SDE 文档8中截取的快照,简要介绍了这两项功能的选项。

图 10. 针对调试的选项

结论

SDE 可在硬件不支持全新英特尔指令的情况下,用于测试使用这些指令的应用;因此,它有助于评估应用是否能够受益于英特尔发布的新平台。   但值得注意的是,SDE 的运行速度比本地平台慢得多,且其设计并非针对提供关于未来性能的洞察。  SDE 可动态计算所执行的指令(而非代码中的指令),以及 SSE 与 AVX 之间的转换。  这些功能可用于调试和优化任务。  SDE 还可通过检测无效指标和数据未对齐来辅助调试。   这些只是仿真环境提供的一小部分功能:   请查阅本文“参考文献”部分的文档,以了解更多详情。

参考文献

[1] http://en.wikipedia.org/wiki/Advanced_Vector_Extensions

[2] http://en.wikipedia.org/wiki/Intel_SHA_extensions

[3] https://software.intel.com/en-us/articles/intel-software-development-emulator

[4] http://goparallel.sourceforge.net/installing-running-intel-software-development-emulator/

[5] https://software.intel.com/en-us/forums/topic/533825

[6] http://en.wikipedia.org/wiki/Intrinsic_function

[7] https://software.intel.com/en-us/forums/topic/538142

[8] https://software.intel.com/en-us/articles/intel-software-development-emulator#BASIC

[9] https://software.intel.com/en-us/articles/avoiding-avx-sse-transition-penalties

 

注意:本文件中包含关于英特尔产品的信息。 本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。 除英特尔产品销售的条款和条件规定的责任外,英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。 除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。 英特尔有权随时更改产品的规格和描述而毋需发出通知。 设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有“保留权利”或“未定义”说明或特性描述。 对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。 此处提供的信息可随时改变而毋需通知。 请勿根据本文件提供的信息完成一项产品设计。 本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。 英特尔提供最新的勘误表备索。 在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。 索取本文件中或英特尔的其他材料中提到的、包含订单号的文件的复印件,可拨打 1-800-548-4725,或登陆:http://www.intel.com/design/literature.htm。对本文件中包含的软件源代码的提供均依据相关软件许可而做出,任何对该等源代码的使用和复制均应按照相关软件许可的条款执行。 英特尔、Intel 标识、Intel Core、英特尔酷睿和 Intel Xeon、英特尔至强是英特尔公司在美国和/或其他国家(地区)的商标。 英特尔公司 © 2015 年版权所有。 所有权保留。

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


英特尔® 实感™ SDK 代码示例

0
0

下载PDF

下载SDK 代码示例

 

Intel® RealSense™ Logo

 

摘要

本套代码示例针对巴西英特尔实感动手实验室创建,旨在帮助参与人员了解如何使用英特尔® 实感™ 软件开发套件。 12 个示例使用 C# SDK 包装程序,提供了简单的基于控制台的应用,支持显示从实感程序 (modality)(包括面部和手部追踪、语音识别)获取的信息。 此外,我们还提供了 2 个 WPF 应用,用于展示如何显示摄像头数据流以及如何实现背景移除。  

简介

为帮助巴西动手实验做好准备,我们创建了 12 个代码示例,并提供了英特尔实感语音和摄像头功能的使用说明以及一些简单的示例。 代码带有注释(英文),可在全球的开发人员社区内免费共享。

我们使用 C# 实施了这些示例,它们基本是简单的控制台应用,显示了如何使用实感 SDK 功能。  代码使用英特尔实感软件开发套件 R2 (RSSDK) 进行测试。

我们希望这些资源能够对您有帮助;如果您有任何问题或需要帮助,请通过下方的评论部分提出。

运行示例的前提条件

运行示例的前提条件

可用示例

摄像头校准库

摄像头校准是一个库项目,可接收设备和程序,进行适当校准,改进某一模式(手部追踪)的摄像头识别质量。

参考链接:

设备

设备示例支持设备枚举。 选择一台设备,获取可用数据流,并设置设备配置。 注意:该示例使用摄像头校准库配置设备。

参考链接:

情绪 

情绪示例可列出使用 SenseManager 的情绪以及程序实施。 本示例能够查找所有的情绪数据,并将所有数据及其强度值打印。

参考链接:

包含回调的情绪

包含回调的情绪示例与情绪示例拥有相同的功能,但采用不同的实施方式。 它展示了如何使用 RSSDK 中的处理程序获取模块数据。 它使用情绪模块,但是也可以使用其他模块实施。

参考链接:

面部

面部示例是能够实施 Face 模块的各种功能的示例。 它能够分别使用以下功能中列出的 PXCMFaceData 对象和流程信息:

参考链接:

面部识别

面部识别示例能够检测面部,并确认用户是否已经注册。 当程序检测到没有注册的面部时,用户可以按空格键在数据库(在内存)中注册面部.. 注册后,示例将显示所识别面部独特的标识符。

参考链接:

手部

手部示例可追踪手部、手指和手势。 本示例可显示全部检测到的手及其位置(图片和真实世界)、手部两侧、关节和检测到的手势。

参考链接:

对象追踪

对象追踪示例可使用英特尔实感软件开发套件检测 2D 对象。 它可使用 JPEG/PNG 标记,随着摄像头对对象的追踪来追踪 X、Y 和 Z 轴的位置。 注意: 本示例要求摄像头使用特定标记进行校准。

参考链接:

划分 (Segmentation)

Segmentation

划分 (Segmentation) 示例使用 WPF 结构以 WPF 形式显示摄像头数据流,使用划分 (Segmentation) 功能移除图像背景。

参考链接:

语音识别

语音识别示例可展示如何使用两种语音识别模式: 口述或命令。 在口述模式中,它能够识别用户说出的所有词,并在屏幕上显示。 在命令模式中,程序可设置一个标准词典,用户每增加一个命令,它便在屏幕上进行显示。

语音合成

语音合成示例是英特尔实感软件开发套件文本到语音功能部署。 当一个句子进入档案后,它将会把句子转换为音频并进行播放。

参考链接:

数据流

红外数据流视图(请注意背景中外部光线的影响。)

Streams

数据流示例使用 RSSDK 以 WPF 形式显示 Creative 摄像头数据流(色彩、深度和红外线)。 本示例可按照类型选择一条数据流,并显示带有选中摄像头数据流的窗口,在指定的 FPS 配置中逐帧更新图片。  

参考链接:

下载示例

如要想要尝试这些示例,了解更多有关如何使用英特尔实感软件开发套件的信息,请 点击此处下载代码. .

关于英特尔® 实感™ 技术

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

作者介绍

João 是巴西开发人员关系事业部的软件分析实习生。 他目前就读于圣保罗大学信息系统专业,主要开发面向移动平台、 Web 应用和实感的软件。

Felipe 是巴西开发人员关系事业部的英特尔实感技术推广人员。 他曾就读计算机工程专业,并处理过各种技术、平台和编程语言。  他主要对游戏开发、移动平台和 HTML5 感兴趣。

沉浸式学习促进教育发展

0
0

转变 UI — 利用今天的技术设计明天的交互界面(第三部分)

随着英特尔® 实感技术对交互式学习增强,真实和虚拟世界之间的区别消失

作者:John Tyrrell

触摸和手势控制、图片识别和增强现实 (AR) 融入各式各样的教育应用和玩具,将虚拟和现实世界交融在一起,创造出即使成年人也难以理解的世界。 英特尔® 实感™ 技术等日益开放和复杂的技术正在推动这些变化,而且随着设备不断推出新特性,界限变得越来越模糊。 结果创造了一个新型的娱乐和学习世界,其中虚拟和现实的区别越来越模糊。

3D4Medical、PlayTales 和 Scholastic 是首批尝试在教育和学习领域部署英特尔实感技术的开发团队。 他们与英特尔密切合作,探索技术潜力并克服技术障碍,其即将推出的应用和产品将为儿童和成年人同时带来新一轮交互式创新。

感知治疗

交互式学习不仅适用于面向儿童的交互式应用,还适用于许多其他应用。 总部位于爱尔兰的 3D4Medical开发了跨解剖、健康和健身以及医疗参考等平台的应用。 3D4Medical Essential Anatomy* (图 1)已经过四代更新,目前是 Windows*、Android* 和 iOS* 中最畅销的医学应用。
 

1 Essential Anatomy 截图

该团队目前正在努力利用英特尔实感技术的优势,以满足医疗空间内使用的应用的严格需求。 3D4Medical 软件开发部门经理 Sergey Bushtyrkov 选择使用带有 Unity 插件的英特尔® 实感™ SDK,以便更轻松地实现在虚拟空间为肢体建模的预期结果。

Bushtyrkov 解释:“英特尔® 实感™ 3D 摄像头和英特尔实感 SDK 可提供信息以创建您所需的最终的商业应用,而不只是数据。 我们需要一个 3D 引擎创建具有吸引力的模型,因此我们使用 Unity 创建了一个环境来操作双手。”

绘制人体四肢和关节的精细程度在医疗环境中具有非常重要的意义。 Bushtyrkov 目前正在集中开发自动精确映射手部的特性,其功能将远超过多数由手势来控制的应用。 Bushtyrkov 表示:“摄像头可以捕获手部特定的点,并对其进行数字化处理。 该数据流包括手部每个点(共 22 个点)的坐标和旋转角度(图 2)。”

2  英特尔实感 3D 摄像头追踪的手部点

将原始数据转化为精确建模的虚拟手部是一个复杂的过程,它要求团队特别注意医疗应用所需的细节。 Bushtyrkov 表示:“我们创建人手的定性模型,将其与我们从英特尔实感 3D 摄像头获取的信息进行整合,使其活动并对其进行调整,极大推动了技术的发展。

Bushtyrkov 继续表示:“我们尝试应用到手部的数据准确性极具挑战性。 借助英特尔,我们解决了这一挑战,我们使用 Unity 引擎插入手部动画。”

3D4Medical 团队长期以来一直使用英特尔实感技术,确保一直使用最前沿的新兴技术来执行基本任务。 3D4Medical 业务发展部门副总裁 Niall Johnston 强调:“从我们合作的企业来看,我们在许多领域都保持技术领先。我们在早期开发阶段便采用了该技术,这于我们而言是一个宝贵的机会,因为我们可以研究能够使用它做什么。”

讲故事

总部位于西班牙的 PlayTales早在 2012 年便开始在 Apple App Store 上出售交互式书籍,并很快成为市场领头羊。 该企业在全球各大知名品牌(包括加菲猫*、芝麻街* 和小王子)与自己的品牌 My New Baby*的基础上开发了多款产品。 PlayTales 门店采用七种语言推出了 200 多种出版物,成为想购买交互式故事书的全球亲子的首选之地。

该团队积极倡导在其即将推出的 Wizard of Oz*交互式立体书及其教育科学应用 Professor Garfield* 中使用英特尔实感技术(图 3)。 PlayTales 的首席执行官 Enrique Tapias 表示:“我们了解到英特尔的新技术后,觉得必须研究一下从体验、3D 显卡和交互方面能够为客户做哪些改进。”

图 3: 儿童用手在Professor Garfield应用中操作蝴蝶

虽然英特尔实感技术还处于预发布阶段,PlayTales 获得的不仅是在产品中部署一项新技术, 还是一次与技术领先企业合作的机会。 PlayTales 的首席技术官 Pablo Benitez 表示:“在部署应用的过程中,英特尔同时开发了英特尔实感 SDK。 我们需要适应这一点。 好的一面是,我们可以第一手测试新特性。我们亲眼看到应用和 SDK 不断发展,提供出许多能够帮助我们增强交互的酷炫特性。 我们非常喜欢轮廓模式功能,因为它能够追踪距离摄像头最近的对象的轮廓。 我们利用该功能将用户的手部转换为游戏中的 3D 模型,绘制出一个手部形象。 借助它,用户可以使用自己的手绘制一个桶的形状接水,或用手指指引蝴蝶。”

行为变化

采用英特尔实感技术为 PlayTales 带来诸多显著优势。 Tapias 表示:“我们提前采用数年之后才会上市的技术, 这对我们非常重要。” Benitez 继续表示:“我们还提前了解了儿童的体验。 我们进行了自己的可用性测试,现在,英特尔焦点小组对我们的内容及英特尔实感技术的部署进行了测试,也为我们提供了诸多帮助。  在测试 Wizard of Oz Professor Garfield过程中,我们注意到,儿童在全新的 3D 世界中进行交互时,无法理解深奥的概念。 而且,他们总是离开摄像头的视野。 因此,我们部署了分步指导、教程和提示,以教授他们能够移动到哪里以及如何做。”

随着客户及其预期快速发展,PlayTales 利用这些洞察引领目前和未来的产品。 Tapias 表示:“孩子的行为变化非常快,这主要由于其获得的技术和设备所导致。 我认为,借助英特尔实感技术,孩子们将有更多选择。 孩子们不仅能够学习或阅读,还能够与内容交互,比如,在 Professor Garfield中引导蝴蝶的移动。”

Tapias 及其团队认为英特尔实感技术带来的全新交互方式具有极大的潜力,同时认为需要细心控制每一项部署,向高标准完善,并根据不同的环境(学习或娱乐)进行调整。 对于 Tapias,前景无疑是乐观的: “英特尔实感技术绝对是未来几年内最重要的技术之一,它不仅适用于计算机和平板电脑,还适用于儿童使用的设备,如平板电脑和智能手机。”

神奇的 Scholastic

Scholastic 在儿童娱乐领域享有很高的声誉,其产品包括跨多平台的书籍、艾美奖获奖电视作品、视频游戏和交互式学习产品等。 Scholastic Media数字产品部门主管 Jennifer Contrucci 表示:“我们将品牌主题和人物与技术相结合来生产内容。 我们使用技术是因为它能够带来很好的效果,而不是一种附加特性。”

该公司的许多品牌已经成为构成美国及其他国家儿童文化的一部分,包括 Clifford the Big Red Dog*Magic School Bus*。 目前,该公司在 I Spy*品牌中采用了英特尔实感技术,该品牌最初创建于 1992 年,是一系列儿童书籍,现在成为了交互式世界。

4  I Spy Pirate Ship 截图

I Spy Pirate Ship*(图 4) 是该品牌的新增内容,专门针对便携式一体机和 2 合 1 电脑设计。 Contrucci 表示:“该款应用采用了英特尔实感 SDK 中的许多特性,包括手势、手部张开-握住检测以及面部点追踪等。 您可以在游戏中感受到各种感知功能。”

儿童和摄像头

I Spy Pirate Ship的一个活动是通过乌鸦巢穴中的望远镜寻找星体上躲藏的物体(图 5)。 当部署英特尔实感技术,以便追踪用户扫视天空时头部的运动情况时,该团队遇到了一些有趣的挑战。

图 5: I Spy Pirate Ship 的望远镜视图

Contrucci 解释:“因为孩子的运动不平稳且不受控制,所以我们无法在他们观看时持续检测到他们的方向。 我们将编程更改为点追踪。 现在,游戏将会寻找面部的特定点,比如鼻尖,结果证明非常有效。”

当用户发现一个物品时,将会停住来通知程序,这一看似简单的交互,为受众带来出色的体验。 Contrucci 表示:“结果证明,这对于孩子们来讲是一个神奇的体验,因为他们感觉自己真正处在乌鸦巢穴环境中,他们实际做的事情非常重要。”

对于 Contrucci,当用户面部停在特定位置时应用能够识别的能力具有很大的未来潜力。 她继续表示:“我们能够看到这种功能可以产生许多其他应用。 比如,如果一个幼儿正在看 eBook*,她在一张狮子图片上停住,这时候非常适合做出反应,提供动物的名称及描述。 这能够为幼儿提供“适时”的帮助。”

社交学习

对于交互性在教育过程中是否能够带来真正的优势的问题,英特尔游戏和教育产品经理 Ornit Gross 表示毋庸置疑。 “当提供活灵活现、沉浸式和有趣的教育材料时,能够帮助记忆, 帮助学习。”

Ornit 继续表示:“当初入该领域时,我们发现,许多因素可以共同作用,提供有效的学习体验。 其中之一是交互性 — 无论是与教师、朋友还是应用交互,只有交互才能够加深学习过程。”

虽然英特尔实感技术代表了一流的交互性技术,但是它只是其中一个因素。 Ornit 表示:“另一个因素是社交。 您不是自己学习,而是在一个团队中学习。 这是我们认为可以继续改进的部分,我们期待在下一代中看到这一改进。 主要是让儿童感受一对多而非一对一的体验,让他们认为自己在和朋友一起学习。”

全面支持

同时,英特尔实感技术从根本上对开发团队(最终对最终用户)与电脑和移动设备的交互带来突发式的转变,为其带来巨大价值。 Ornit 及其团队对挑战的渴望为其赢得丰厚的奖励。 “令我感到惊喜的是,开发人员了解到英特尔实感 SDK 能够同时适用于低级别数据和高级别数据后,他们随即利用所有的 SDK API 编写了自己的交互方式。 例如,SDK 能够追踪整个面部的 78 个特征,并可检测睁眼/闭眼和张嘴等面部表情。 开发人员将这些功能全部结合在一起,以便 SDK 能够发现用户做鬼脸。 再如手势识别。 英特尔实感 SDK 可追踪 22 个手部关节点和捏合手势;一位开发人员将这些 SDK API 进行整合,能够识别一种特殊的捏合手势,这种手势专为游戏的主要角色而设计。”

如英特尔所知,技术只是开始。 内容才是最重要的。 Contrucci 总结了 Scholastic 探索英特尔实感技术可能性的动机: “许多人认为,手势控制将是未来的一大浪潮,因为其带来的潜力不仅是儿童交互所需要的,而是自然操作所需要的。 当我们使用 I Spy Pirate Ship来测试儿童的自然交互特征时,这对于他们而言是一个全新的体验, 非常令人兴奋。”

资源

如欲进一步探索英特尔实感技术,了解关于面向 Windows 的英特尔实感 SDK 的内容以及下载开发人员套件,请点击此处

未来,英特尔实感 3D 摄像头将嵌入笔记本电脑、一体机和平板电脑。 快速了解 faceshift如何使用它在 16台平板电脑上部署化身,实现超级虚拟自拍。

借助英特尔实感技术,我们的数字世界与物理、有机的世界能够以有意义的方式进行交互。 查看开发人员Stefan Sadchikov 如何跨越界限,将几年前无法想象的情况变为现实。

借助英特尔实感技术,游戏行业也将获得沉浸式体验。 本文介绍了四个负责实施技术的团队所带来的深刻见解。

了解英特尔实感技术如何消除远程通信和面对面通信之间的鸿沟,重新定义“参加会议”这一表述。 点击此处,阅读文章。

英特尔和英特尔实感是英特尔公司在美国和其他国家(地区)的商标

节奏小子,一款随新技术发展的独立制作游戏

0
0

简介

独立游戏开发公司如何与时俱进,不断拓展市场? 让我们了解一家多次获奖的独立游戏公司 Threaks —— 开发了《节奏小子 (BeatBuddy)》。 我们采访了该公司的联合首席执行官 Wolf Lang,以 了解他们如何驰骋游戏开发市场。

 从学生到负责独立项目

Threaks GmbH 是一家总部位于汉堡的独立游戏开 发公司,专门从事非线性音乐游戏的创建,以推动数字音乐实现可持续的商 业化发展。  2011 年,他们凭借早期 版本的控制台式 PC 游戏《节奏小子》获得了德国视 频游戏奖“最佳学生项目”的提名,首度获得认可。

他们认为视频游戏是一种艺术媒介,可提供独特的 用户创建体验。根据这一思路,他们打造了首款非 线性音乐动作冒险游戏,支持用户对音乐进行前进或 后退操作。 每个关卡使用不同的歌曲和手绘图 形组合,游戏机制和关卡设计基于相应歌曲的结构。在整个游戏中,独唱部分(谜题和战斗)的游戏设置 不同于合唱部分(游乐场风格、Bubblebuggy 旅行)。 Threaks 联合创始人 Wolf Lang比较 了《节奏小子》和一款类似于《超级马里奥 (Super Mario)》的游戏,后者采用了视觉解构乐曲进行构建 。

《节奏小子》经历了多个原型测试,能够在视效和 游戏设置之间取得完美平衡。这款出色的游戏受到了 音乐游戏爱好者和主流玩家的青睐。Wolf Lang 的一 篇文章引用了一张有关这两类玩家对该游戏不同反应 的有趣图表,详情请访问 http://www.makinggames.biz/featur es/5-reasons-why-music-games- suck,7085.html。  这篇文章 还谈及了玩家们在玩游戏时遇到的一些极为耗时的音 乐播放问题。

在随后的几年内,Threaks 根据玩家反馈不断改进 了这款游戏。Wolf 认为英特尔游戏设计大赛极大地促 进了该公司的发展。《节奏小子》赢得了 2012 年英 特尔游戏设计大赛“最佳音效”奖和 “最佳艺术”奖,受到了行业领导者的广 泛关注。由此,这家小公司开始迈入真正的游戏世界 。他们成功使这款游戏的前期制作版本在 Steam 上得 到了认可,并收到了更多反馈意见。在 PAX East 2013 上,《节奏小子》赢得了“最佳 PC 游戏 ”奖。

借助触控优先用户界面扩展至新平台

在与英特尔继续开展合作的同时,Threaks 开始针 对 2 合 1 设备优化界面,以此拓展开发范围。 Threaks 工程师在 Unity 中开发和共享了 2 合 1 设 备迁移代码。该代码通过下列许可证提供。

迁移内容包括一个自 动弹出窗口以及系统进入平板电脑模式时切换至触控 状态的设置。有关 2 合 1 设备迁移的更多信息,请 参见下列参考。

然后,他们推出了该游戏的 OS X* 和 iOS*版 本,并在 Apple Store 中同时销售游戏和音乐。在 Apple Store 中,《节奏小子》获得了编辑推荐。 该 游戏的 iPad* 版本在 6 个国家和地区赢得了 “2014 年最佳游戏”奖。

在将游戏业务转向移动设备时,该公司面临了诸多 挑战,从玩家关闭音效到因未压缩音乐生成大文件致 使磁盘空间不足。多数游戏使用 MP3 音乐文件,但 这种文件有其局限性。对于使用音乐符干将动画与音 乐和旋律精确匹配的游戏而言,该类文件无法提供关 键的音乐信息。 此外,该游戏甚至需要在计算性能变 化时流畅运行。 为此,Threaks 开发了自己的音效技 术(专利申请中),它能够让动画与连接至游戏机制 的声音文件进行毫秒级精确匹配。

新平台需要重新评估整个界面。Threaks 花费了 6-9 个月考虑和创建移动用户界面,他们不想添加按 钮或虚拟控制杆,因为这会损害自然体验。因此,他 们重新设计了每个游戏机制以确保整体流畅性,并使 用了免 TouchScript 插件

结果,他们成就了一 款出色的游戏:用户体验完全支持直观触控,游戏设 置可跟随玩家手指控制角色,同时支持用户畅玩节奏 谜题。

他们使用了什么开发工具?Threaks 使用了 Unity* 进行跨平台开发。他们表示,他们通常会在纸 上设计游戏,将自己的想法描绘出来,进行讨论,并 决定如何实施。之后,他们会使用 Unity 开始原型设 计,确保各种要素能够成功交互。被问及如何开发 iOS 版游戏时,他们表示使用了 Unity3D(基本支持 在 Windows* 上开发所有项目),为此仅需一台 Mac* 进行编译和测试。

进军 Android*

Threaks 的下一个挑战是将该游戏推向 Android 设备。在 2015 年游戏开发者大会上,Threaks 将展 示他们的最新成果,而一个面向搭载英特尔® 凌动™ 处理器 Z3000 系列(面向 Android* 平板电脑)的 Android 设备的版本已经登陆 Google 游戏商店。( 在 2015 年游戏开发者大会上,欢迎光临英特尔展台 ,了解 Threaks 游戏!)。

Wolf 指出,他们激动地发现英特尔架构 Android 设备极其强大。由于具有 3D 手绘图形和复杂的音效 技术,他们的游戏过去无法在移动设备上运行。如今 ,借助全新的芯片和功耗技术,“他们的游戏能 够在新设备上流畅运行,英特尔架构 Android 真是一 种既有趣又重要的平台”。

此外,在开发 Android 版游戏时,他们需要解决 玩家在小型设备上玩游戏时注意力持续时间较短的问 题,让玩家能够在 30 秒内理解游戏设置。为此,他 们制作了新教程,以帮助玩家更快速掌握游戏。Wolf 解释道,通过支持更多的平台和外形,他们发现过去 的 PC 游戏控制方式并不适用于移动设备,同时,并 非每款移动游戏都适用于 PC。一些游戏对于平板电脑 过于复杂,而一些游戏(如节奏游戏) 可能更适合在移动设备上运行。

回馈

独立开发人员如何取得成功?Wolf Lang 想要拜访 欧洲的一个独立社区,它与美国的独立社区采取了相 似的合作模式。2013 年,他们帮助在德国科隆国际游 戏展 (Gamescon) 上创建了 Indie Arena,初始成员 包括 10 名欧洲开发人员,这一数字在 2014 年增加 至 18 名。Indie Arena 让人们直观了解到玩家对独 立游戏的兴趣,并促使科隆国际游戏展主办方在 2014 年的游戏展上决定将 Indie MEGABOOTH 首次带到欧洲 。英特尔看到了这些展区的价值,因此将在 2015 年 游戏开发者大会上赞助 Indie MegaBooth。

Threaks 还与 Humble Bundle 团队开展合作,该 团队首次在德国展示了他们的店面,并介绍了他们的 12 位德籍独立游戏开发人员。

火热的社交媒体

Threaks 还 竭力使用创新性网络广播和视频获得媒体和玩家的关 注。
Wolf 和 Steve 能够给人带来欢乐,
还 向人们介绍一些卓越的艺术家。请观看
TSC (Forsythe) 随 Parov Stelar《节奏小子》起 舞的视频Wo lf 和 Steve 与 Austin Wintory 的对话

给独立开发人员的建议

Wolf 建议,任何想要获得曝光度和积极反馈的开 发人员都应该让他们的应用参加英特尔游戏设计大赛 。Wolf 表示:“参赛者将会获得宝贵的反馈意 见,而且获奖者有机会认识行业领导者,这简直太棒 了!而且,如果有机会让自己的游戏在英特尔展台内 进行展示,独立开发人员则能让游戏获得高曝光度。 要知道,展台能够引起媒体关注和提升知名度,但需 要花费一笔不菲的开销。英特尔展台能够为您提供绝 佳的展示机会。”

更多资源

Threaks 提供了可在 Unity 中使用的附加的 2 合 1 检测实用程序级代码。它包含 MonoBehaviour 级 “TwoInOneUtil”,可通过订阅 “ModeChanged”事件,发出进入或退出平 板电脑模式的通知。您将需要定义一个名为 “TWOINONE”的额外“脚本定义符 ”。代码附加在本文底部。

英特尔提供触 控开发人员指南(网址)http://software.intel.com/en-us/touch- and-sensors、有关开发面 向 Windows 8 的高 DPI 应用的信息以及有关检测外形 变化如何编写 2 合 1 感知应用的信息。  

Microsoft 提供有关扩展至不同屏幕支持多种分辨率的信息

关于作者

Colleen Culbertson 是开发人员关系部门的平台 应用工程师,负责在英特尔® 开发人员专区上撰写文 章和一般博客。

英特尔、Intel 标识、英特尔实感超极本和 Intel RealSense Ultrabook 是英特尔在美国和/或其他国家 的商标。
英特尔公司 © 2015 年版权所有。所有 权保留。
*其他的名称和品牌可能是其他所有者的 资产。代码和图片为版权所有 © 2014 THREAKS GmbH

 

使用Cocos2d-x 3.0或更新版本创建多平台游戏

0
0

下载文档

在本教程中,您将了解到如何使用 3.0 版或更高版本 Cocos2d-x 框架在 Windows* 开发环境中创建简单的游戏,以及如何实施编译以便它在 Windows 和 Android* 上运行。

Cocos2d-x 是什么?

Cocos2d-x 是一种跨平台的游戏(及互动书本等其他图形应用)框架,基于 iOS* cocos2d,但使用 C++、JavaScript* 或 Lua*,而非 Objective-C*。

该框架的一个优势在于支持创建可部署于不同平台(Android、iOS、Win32、Windows* Phone、Mac*、Linux* 等)上的游戏,有助于保持相同的代码库,只需针对每种平台进行特定的调整。

Cocos2d-x Console

Cocos2d-console 配置在 3.0 版本中。它是一种命令行工具,提供了一些管理 Cocos2d-x 或 Cocos2d-JS 项目的功能,如创建、执行、构建、调试等。

创建您的第一款游戏

1 - 下载最新版框架,并在您的开发环境中对它进行解压。本教程使用了 3.3rc0 版,且框架解压至桌面 (C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0)。


图 1。Cocos2d-x 3.3 RC0 版目录结构

2 – 如欲在 cocos2d-x 中创建新项目,请使用框架文件夹中的 setup.py(一种 Python* 脚本)配置所有的环境变量,以针对 Win32 和 Android 平台进行构建。在执行 setup.py 之前,您将需要下载、安装和配置以下项:

如果您未安装 Python Runtime,请访问下列网址下载 2.7.6 版:http://www.python.org/download/


图 2。setup.py 位置

3 - 打开命令提示符 (cmd.exe) 并执行下列命令:

- 导航至脚本文件夹(框架文件夹):
cd C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0

- 运行脚本 setup.py
python setup.py(或仅 setup.py)

注意:如欲运行命令提示符中的 Python 命令,请将安装有 Python 的文件夹添加至环境变量路径

- 该脚本将会请求 Android SDK、Android NDK 和 ANT 的安装路径。

  • Android NDK 文件夹路径:


图 3。Cocos2d-console 请求 NDK 文件夹路径

  • Android SDK 文件夹路径:


图 4。Cocos2d-console 请求 SDK 文件夹路径

  • Apache ANT bin 文件夹路径:


图 5。Cocos2d-console 请求 ANT bin 文件夹路径

包含请求的路径之后,重新打开命令提示符 (cmd.exe)。该操作需要使用 cocos2d-console 命令

4 – 键入 cmd.exe 访问命令提示符(cocos2d-console 命令只可通过此处发布)并再次打开框架文件夹:

cd C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0

在下一步,我们将创建新的 Cocos2d-x 项目:

cocos new MyGame –p com.Project.MyGame –l cpp –d Project


图 6。已创建的 Cocos2d-x 项目

下面简要解释一下相关参数:

  • new:创建新项目,必须紧跟项目名称(如 MyGame)
  • -p:定义包名称
  • -l:选择编程语言,值可以是 cpp 或 lua
  • -d:框架将要创建项目结构的目录

如果各项操作进展顺利,您的项目将在框架被提取的目录中的项目文件夹中被创建。


图 7。MyGame 目录结构

所创建的项目包含游戏(类别))的基础代码、资源(图像和音频等)以及每个框架所支持平台的一个项目。

构建 Android* 应用

要求

  • 您需要配置所有的环境变量,以构建 Android 应用游戏(Android SDK、Android NDK 和 ANT)。若您还未完成此步骤,请参见本文中“创建您的首款游戏”部分。
  • 安装的 Java 开发套件 (JDK)

注:Cocos2d-console 使用 javac 命令针对 Android 进行构建,因为有必要添加 JAVA_HOME 环境变量 (JDK 路径)。

1 – 我们将针对一种以上的架构对我们的游戏进行编译,因为框架不会默认针对 x86 和 armeabi-v7a 进行编译。编辑 Application.mk 文件,它位于:

C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0\Project\MyGame\proj.android\jni


图 8。Application.mk 位置

2 – 将下行添加至该文件:

APP_ABI := armeabi armeabi-v7a x86


图 9。添加了 APP_ABI 行之后的 Application.mk

既然已添加好我们的目标架构,那让我们编译游戏吧!

3 – 使用命令提示符,找到框架文件夹:

cd C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0

4 – 执行以下命令以针对 Android 编译并运行游戏。

cocos run –s Project\MyGame –p android


图 10。执行命令以针对 Android* 编译并运行游戏

  • run:编译并运行项目
  • -s:项目文件夹的路径
  • -p:选中的平台

注:若只进行编译,请输入:cocos compile –s Project\MyGame –p android

若一切正常,该 cocos2d-console 命令将使用 adb(若配置在环境变量中)将 APK 文件安装进所连接的设备或初始化模拟器中。若它们不可用,则该命令会等待直至设备和模拟器可用,如下图所示:


图 11。命令等待设备和初始化模拟器

若您已初始化了模拟器或连接了设备,那么将会出现该屏幕:


图 12。Android* 平台上的游戏屏幕

构建 Win32 应用(针对 Windows* 7 或 Windows* 8 桌面模式)

您将需要 Visual Studio* 2012或更高版本进行构建。

1 – 使用命令提示符 (cmd.exe),找到提取了框架的文件夹:

cd C:\Users\intel-user\Desktop\cocos2d-x-3.3rc0

2 – 执行以下命令以在 Windows 上编译并运行游戏:

cocos run –s Project\MyGame –p win32


图 13。执行命令以在 Windows 上编译并运行游戏

下面简要解释一下相关参数:

  • run:编译并运行所选定的项目
  • -s:项目文件夹的路径
  • -p:选中的平台

注:如只进行编译,使用“编译”而非“运行”,如下所示:

cocos compile –s Project\MyGame –p win32

执行完运行命令,若一切正常您将会看到以下屏幕:


图 14。Windows* 平台中的游戏屏幕

可以使用 Visual Studio 来编译并运行游戏项目:

1 – 在项目目录中,用 Visual Studio 打开 MyGame.sln文件,该文件在 “proj.win32” 文件夹中。


图 15。Win32 项目目录结构

2 – 要编译项目,请按 F6 (或 Build menu -> Build Solution)并按 F5 执行它(或 Debug menu -> Start Debugging)。在构建和执行完毕后,您会于 console 步骤之后看到相同的屏幕显示。


图 16。在 Visual Studio* 中打开了 Win32 项目

现在您了解如何针对 Android(x86 和 ARM*)、Windows 7 和 Windows 8 (桌面模式)创建和编译游戏!

参考文献

Cocos2d-x 框架的源代码根据 MIT 许可证进行了授权,如欲了解相关信息请点击此处

Cocos2d-x 及其文档:http://www.cocos2d-x.org/

cocos2d-console:http://www.cocos2d-x.org/wiki/Cocos2d-console

此时,Cocos2d-x 3.3 的发行版本在项目创建时会出现问题,不支持用户创建项目(详情请点击此处)。该问题已在最新的预发布版本中得到了解决,但该解决方法还未用于 Cocos2d-x 的最新发布版本中。

英特尔® INDE:使用商用游戏引擎的游戏开发人员的工具

0
0

摘要

如今,游戏开发行业的日子并不好过。一方面,开发人员需要面对多种平台上产品“半衰期”不断缩短的问题;另一方面,多种操作系统版本也带来了更多挑战。甚至针对单个平台优化游戏也变得更困难,因为系统复杂性不断加剧,而且现在功耗对游戏性能的好坏发挥着关键作用。如今,Windows* 和 Android* 设备的数量有数十亿之多,这使得潜在的投资回收期也变得颇为漫长。

在本文中,我们将介绍去年发布的跨平台工具套件英特尔® Integrated Native Development Experience(英特尔® INDE)可如何帮助您便捷创建能够在 Windows* 和 Android* 设备上实现本地运行性能的一流游戏。这些工具即使对于使用 Unity* 或 Epic Unreal Engine* 等第三方游戏引擎也非常有用。英特尔 INDE 工具仍能够提供额外功能,帮助您的游戏在竞争激烈的市场中脱颖而出。

英特尔 INDE 能够帮助您创建出色的游戏,从而为玩家带来畅快淋漓的沉浸式游戏体验。

简介

游戏开发人员正在寻找实用工具,以帮助缩短游戏上市时间,使游戏更快速部署在日益增多的平台上。因此,许多开发人员开始使用商用游戏引擎,因为它们可缩短上市时间,并让开发人员快速影响许多平台上的广泛客户群。但如果您不使用游戏引擎之外的其他工具,您可能会丧失部分性能。而这部分性能原本可为您带来更快、更一致的帧速,或更逼真的地形细节或两倍数量的僵尸 (!),从而在任何目标平台上提供令人震撼的游戏体验。换言之,在竞争激烈的市场中,您需要独树一帜,率先推出一款非凡游戏才是您的成功之道。

虽然本文面向使用商用游戏引擎的开发人员,但英特尔 INDE 也可为喜欢“运行自己的”游戏引擎的独立游戏开发人员提供帮助。不过这是本系列中另一篇文章的主题(敬请关注!)

将英特尔 INDE 与 Game Engine Workflow 配合使用

使用 Unity* 游戏引擎或 Epic* (Unreal Engine*) 时,您可能会觉得它们能够满足您的所有需求,而认为英特尔 INDE 等产品没什么用处。具体而言,许多开发人员希望游戏引擎能够“包办一切”,自己只需负责创建一些游戏资产并确保每帧中的僵尸数量合适。

幸运的是,英特尔一直在与一些重要的游戏开发人员合作,确保您使用的游戏引擎经过了英特尔 INDE 产品工具的优化。显然,英特尔 C++ 编译器一直在为引擎提供平台依赖优化方面发挥着重要作用,但其他的英特尔 INDE 分析和优化工具可帮助确保整个游戏引擎为实现自上而下的峰值性能进行了优化。具体而言,英特尔与 Unity 和 Epic 的合作可确保这些游戏引擎能够带来出色性能,无论您的目标英特尔平台是什么(Windows 或 Android)。

但即使对于使用这些游戏引擎的开发人员,英特尔 INDE 团队仍确信可从几个重要方面帮助他们提升游戏运行速度,并大幅提升单独使用游戏引擎时的运行性能。这些之前在英特尔图形性能分析器(英特尔 GPA)产品系列下发布的工具,现在只配置在英特尔 INDE 内,并可帮助实施下列工作:

  • 调试游戏资产
  • 性能分析和优化
  • 功耗分析

英特尔 INDE 优化工具可帮助高效调试游戏资产。例如,浏览 Unity 用户论坛时,我们发现很多客户都谈到会把英特尔 INDE 工具用于他们的工作流程。一个常见示例是,捕获帧进行详细分析,再使用图形帧调试器(此时仅支持 Android)在场景中一次实施一个绘制调用。在每一步中,深度了解对象的所有视觉因素和属性,实时旋转对象以寻找错位的顶点,查看线框模型以检查细节层次 (LOD) 问题,检查对象的图形属性,并查看帧缓冲器和深度缓冲器。例如,若僵尸的出现并不符合预期,请检查深度缓冲器,您可能会发现该僵尸竟然是在小屋 (shack) 后而不是小屋前被渲染。

对于性能分析,需预先计划针对性能与视觉效果设置合理目标,然后在整个开发过程中跟踪目标的实现情况。在这方面,您将会发现英特尔 INDE 系统分析器、图形帧分析器和平台分析器对于您的工作流程是极为重要的分析和优化工具。本文讨论了一些用于选择不同性能选项和验证性能影响的策略。如我所述,您需要不断地测试并证明您可为您的目标平台提供最佳游戏体验。再次强调,从竞争对手中脱颖而出的唯一秘诀是提供比他们更加出色的游戏体验。为实现特定帧速,您实施了真正的优化以部署客户要求的特性和交互性吗?此外,由于英特尔与游戏引擎开发人员正在进行紧密合作,现在很多游戏引擎都提供了分析提示,即英特尔 INDE 在运行您的游戏时可收集相关信息,然后再通过平台分析器回放跟踪文件以直观性地检查 CPU 和 GPU 中的线程交互性。您的游戏是 CPU 密集型还是 GPU 密集型?

对于移动平台,了解功耗利用率也是一个关键因素。最新英特尔系统具有相同且固定的 CPU 和 GPU 功耗范围,使用功耗太多会造成 CPU 或 GPU 的速度减慢,并影响重要的游戏交互性。运行英特尔 INDE 系统分析器以了解您的功耗利用率,在某些场景中功耗是否会突然飙升?若如此,请检查您的游戏资产或其他关键参数和选项以了解问题所在。

总之,不要一切都依靠您的游戏引擎,英特尔 INDE 作为一款非常实用的工具可助您从竞争对手中脱颖而出。英特尔 INDE 工具可帮助您选择合适选项,实现最大的成本效益。

后续步骤……

欢迎购买并使用该产品。了解更多关于英特尔 INDE 的信息,请登录产品主页。在此,您可了解到各种产品“版本”之间的差异,以及如何下载该产品的免费入门版或该产品终极版本的免费试用版。

若您想于今年三月份在旧金山参加游戏开发者大会 (GDC),请一定要查阅英特尔的各种演示文稿(部分演示文稿由英特尔与顶级游戏开发人员联合制作)。此外,还请光临英特尔 INDE 展台,我们将为您重点介绍各种性能分析和优化工具的最新版本。

敬请关注本系列其它文章,以更加详细地了解英特尔 INDE 将如何帮助您快速、轻松地开发出精品游戏。具体而言,请寻找相关文章,了解英特尔 INDE 可如何帮助那些喜欢“运行自己的”游戏引擎的开发人员。英特尔 INDE 可提供更多特性和优势,帮助您快速、轻松地开发出精品游戏!

英特尔® 实感™ SDK 前置摄像头 (F200) 常见问题解答

0
0

该常见问题解答提供了英特尔® 实感™ SDK 黄金版 R1 和 R2 的硬件要求和特性信息。

要求

使用英特尔® 实感™ SDK 运行和开发有哪些硬件要求?
  • 第四代智能英特尔® 酷睿™ 处理器 (代号 Haswell) 或更高版本
  • 8 GB 可用硬盘空间
  • 英特尔实感 3D 摄像头
有哪些软件要求?
  • Microsoft Windows* 8.1
  • 带有服务包 1 或更高版本的 Microsoft Visual Studio* C++ 2010 ~ 2013
  • 用于 C# 开发的 Microsoft .NET 4.0 或更高版本框架
  • 用于 Unity 游戏开发的 Unity* PRO 4.1.0 或更高版本
  • 用于 Processing 框架开发的 Unity* PRO 2.1.2 或更高版本
  • 用于 openFrameworks 开发的 openFrameworks* v0071 或更高版本
  • 用于 Havok Vision SDK 开发的 Havok Vision* SDK 2012.2.1 或更高版本
  • 用于 Java 开发的 Java* JDK 1.7.0_11 或更高版本
  • 以下任意用于 JavaScript* 开发的浏览器:
    • Microsoft Internet Explorer 10.0.13
    • Google Chrome* 33.0.1750.146
    • Mozilla Firefox* 27.0.1
英特尔实感 SDK 是否适用于其他任何摄像头?
不能。它仅适用于英特尔实感前置摄像头。
是否有 Linux* 版 SDK?
没有。

性能

与英特尔® 感知计算 SDK 相比,英特尔实感 SDK 的 CPU 利用率如何?
单模块为 30%,组合模块 < 50%。 这只是粗略标准,具体的性能可能会有所差异。

Unity

Unity 支持哪些版本?
Unity v4.1 专业版及更高版本
什么是 Unity 工具套件?
Unity 工具套件是英特尔开发的 Unity 软件包,旨在支持 Unity 游戏开发人员使用 Unity Inspector 拖放类型的操作进行交互。  该工具套件替代了许多使用英特尔感知计算 SDK 时必须执行的固定 (boiler plate) 代码。
使用 Unity Web Player 是否有要求?
无需任何权限。
英特尔实感 SDK 中是否有像英特尔感知计算 SDK 中一样的 Unity 限制?
没有,SDK 中所有的可用功能都能够被 Unity 开发人员使用。

脸部识别

一次能够检测出多少张脸?
4张
一次有多少张脸可以包含主要特征点?
1张
能够追踪哪些头部导向?
倾斜、滚动、偏航
有多少个主要特征点?
78个
特征追踪支持哪些面部区域?
眼部、眉毛、鼻子、嘴巴和下巴
英特尔实感 SDK 是否支持面部表情,如果支持,支持哪些?
支持,SDK 支持以下面部表情:
  • 微笑
  • 抬眉
  • 低眉
  • 张嘴
  • 闭眼
  • 瞳孔移动
英特尔实感 SDK 是否支持面部情绪,如果支持,支持哪些?
支持,但是仍处于试验阶段,SDK 支持以下面部情绪:
表情R1R2
生气  
厌恶  
恐惧  
开心  
伤心  
惊讶  
蔑视  
积极  
消极  
中性  

手势

beta 版 SDK 支持哪些手势?
以下是 SDK 目前支持的手势:
手势R1R2
张开手指  
V 手势  
点击  
挥手  
双指捏合打开  
拳头  
拇指向上  
拇指向下  
点击  
向上轻扫  
向下轻扫  
向左轻扫  
向右轻扫  
手势识别是否支持握笔等特性?
不提供这种手势支持。
Custom Gesture Tool 的预定上市日期?
预定上市日期为 2015 年。 具体的时间尚未确定。

语音

英特尔实感 SDK 支持哪些类型的语音模式?
命令模式和口述模式

其它

正如我的理解,英特尔实感 SDK 和英特尔感知计算 SDK 之间不支持向后兼容。 这是否意味着需要重新编写应用才能够兼容全新摄像头和 2014 SDK?
基于以前的 SDK 的应用必须进行调试才能在新的 SDK 上使用。 虽然基本的概念相同,但是新版本中有大量的架构变动,使得无法进行兼容。
能否使用多个应用从同一个摄像头设备获取数据? 如果可以,中间件如何处理两个应用使用的不同分辨率设置?
如果两个应用使用完全相同的设置,则能够从相同的摄像头设置获取数据。 如果设置不同,则摄像头将支持第一个进入应用,先到先得。 其他要求使用不同分辨率的应用将会收到错误提示。
如果应用 A 更改设置,应用 B 是否会收到设置变更的通知?
应用 B 能够明确地监控设备属性变化。
能否查询设备的电源状态? (摄像头是否打开? 摄像头是否关闭?)
能。
从属应用能否查询主应用设置的属性?
能。
必须单独下载特定设备驱动程序才能够支持全新集成的摄像头吗?
摄像头驱动程序和固件可从 OEM 获取。 对于独立的开发摄像头,请使用Creative Labs 英特尔实感支持网站上的固件和驱动程序。

借助英特尔® 实感™ 技术加速 Space Astro Blaster*

0
0

游戏开发人员不断地打破技术限制,要求游戏具备更快的处理速度和更高的图形质量。 随着这种趋势的发展,配备英特尔® 实感™ 3D F200 摄像头的笔记本电脑和平板电脑不断革新着用户与游戏和设备之间的交互方式。 借助英特尔实感技术,开发人员将复杂的手势控制方法融入游戏之中,包括手部追踪、面部分析和语音指令。

CompSens 开发的 Space Astro Blaster(星际战舰)*就是这样一款游戏,它首次亮相于 2014 年国际消费电子产品展(内华达州拉斯维加斯)。 这款电脑游戏基于单一战舰和单一场景构建而成,是关于集成英特尔实感 SDK的概念验证,支持玩家在不使用键盘和鼠标情况下进行游戏控制。 成功演示手势控制方法后,CompSens 将其开发成完整的 Space Astro Blaster 游戏,不同的战舰、敌人和等级融合在一起,充分利用英特尔实感 SDK 创造以前的平台所无法提供的浸入式手势控制体验。


图 1:3D 星际射击类游戏 Space Astro Blaster* 的游戏预告片,
采用英特尔实感 SDK 开发而成。

Space Astro Blaster是一款第三人称星际射击类游戏。在游戏中,玩家操控战舰对抗敌人更强势的攻击,从被动的小行星到威力无比的大型敌舰。 玩家通过手部和头部动作在 3D 太空中移动战舰,在行进的过程中躲避障碍物,强化武器,射击敌舰。

所有游戏控制功能都可在不使用键盘或鼠标的情况下完成。 借助集成的手势识别技术,玩家只需在空中小幅度地舞动手,就可在任意方向移动战舰(向前,向后、平行,甚至移入或移出屏幕)。 这项功能为玩家提供了六个控制轴,无需使用控制器。 手指活动也可识别,合上手指表示持续发射主炮,而把食指和中指比划成 “V” 字形手势表示发射大型导弹(图 2)。


图 2:将两个手指比划成 “V” 字形手势发射大型导弹。

借助英特尔实感 SDK 支持的手势识别特性,游戏可检测 V 形手势并触发导弹发射事件。 为识别基本的发射手势,游戏采用算法(基于英特尔实感 SDK 的关节追踪输出数据)评估手指的弯曲,以实时确定手势的开合状态。

借助英特尔实感技术实现优化

借助英特尔实感 SDK 和英特尔实感 3D 摄像头,CompSens 等游戏开发商可将手势控制集成至各种应用和场景。 Space Astro Blaster充分利用了手部追踪,手指追踪和基本面部分析,以将独特的控制方式完美融入游戏。

手部追踪

手部和手指追踪可利用 22 个追踪点,同时识别静态手势和动态手势(比如挥手)。 CompSens 使用集成了英特尔实感 SDK 的算法查找和追踪特定手势(图 3),以支持武器发射。

张开手 = 朝 6 个轴方向自由移动,不射击武器
V 形手势 = 发射导弹
合上手 = 在自由移动过程中发射主炮。

图 3:手势控制

挥手和基本姿势可用于朝 6 个控制轴方位移动战舰 — 向上、向下、向左、向右、向前、向后 — 并支持玩家移动战舰完成飞行任务(图 4)。 结合使用姿势与手部和手指追踪有助于打造非常直观和极具乐趣的游戏风格。

 
图 4:挥手和基本姿势可用于向上、向下、向左、向右、向前以及向后移动战舰。

面部分析

在特定游戏部分,面部分析可用于头部追踪,以测试玩家驾驶战舰躲避来犯障碍物的能力。 只需将身体向左或向右偏移,玩家就可将战舰移动至相应的方向(图 5),从而进一步增强游戏的真实性。

 
图 5:玩家通过向左或向右移动头部躲避障碍物。

英特尔实感 SDK 可集成即开即用型手势和姿势检测,从而帮助 CompSens 简化开发流程。 SDK 支持游戏开发人员追踪自然界面方法,这样开发人员可集中精力将手势融入游戏和用户界面,而非进行图片识别与处理,以有效测量和报告手势输出。

决策和挑战

创建游戏时,开发人员需要了解目标平台的功能以及所需的识别模块。 CompSens 表示,为了在进行手势识别的同时保持高性能和低延迟,特定游戏实例中不使用的模块均处于禁用状态。 例如,在标准游戏玩法中,需采用面部识别模块专注于头部识别,这样会增加软件的复杂性,导致性能较低的平台出现性能问题。 为解决这一问题,CompSens 仅在障碍物躲避阶段启用面部识别部分;并同时禁用手部识别模块,以保持功能与性能之间良好的平衡。

不仅英特尔实感 SDK 可提供多种识别模块和算法,英特尔实感软件还有助于提高开发人员的灵活性。 例如,CompSens 创建并调整了特定的手势识别通道,以提升针对特定手势的性能。 其中一项是识别基本发射手势,“合上手”。 最初使用的是英特尔实感 SDK 中的手势识别模块;但该模块有时无法识别手势,导致基础大炮无法连续发射,尤其是用户快速移动手部的时候。 因此,CompSens 将针对该手势的识别策略改成了他们自己的算法,后者基于英特尔实感 SDK 每帧的手部追踪关节数据评估手指的弯曲,以实时确定手指的开合状态。 得益于英特尔实感 SDK 的模块化性质,这种更新非常易于集成。

对于基于移动设备实施英特尔实感 SDK 的实例来说,禁用和关闭英特尔实感 3D 摄像头有助于缩短计算周期和节约能耗。 在菜单中或不需要分级负载期间禁用摄像头有利于平台节能,从而可延长电池续航时间支持游戏畅玩和其他办公任务的处理。

测试

采用新界面方法 — 以及向玩家介绍游戏交互方式所带来的潜在问题 — 开发人员可能认为需要对正常测试流程做出调整;但 CompSens 表示,他们的应用测试根本无需如此。

按照常规软件开发过程,Space Astro Blaster 团队将游戏摆在玩家面前,观察他们的交互方式,并在游戏测试后听取他们的反馈。 当然,由于用户测试不同于采用传统输入方法时的要求,对应用做出了细微调整,但测试与验证流程与之前的项目基本相同。 不久前,他们发现,全新输入方法会造成手部疲劳问题:用户需持续举手以便在游戏中保持战舰的飞行状态。 为解决手部疲劳问题,他们为游戏过程设计了两种控制模式:一种是手势控制,以对抗外来敌舰,另一种是头部运动,以控制战舰和躲避小行星。 这两种控制模式可交替使用,从而缓解玩家的手部疲劳。

英特尔工具和支持

由于自然手势识别领域尚未十分成熟,英特尔构建了实感 SDK 和软件开发项目,以提升开发商(比如 CompSens)的集成体验。 在 Space Astro Blaster开发过程中,CompSens 获得了英特尔的现场支持,团队与公司携手,共同攻克了英特尔实感 SDK 启动问题,算法集成问题,以及直接针对 Space Astro Blaster构建的自定义识别路径。

面向开发商的软件包还具备一项关键特性:在线记录。 速览英特尔实感 SDK 支持页面,了解参考文档、版本说明和培训指南(以视频、演示和网络研讨会形式呈现)。 英特尔提供了参考设计指南,以帮助开发商正确掌握不同全新用户界面方法的集成。

英特尔实感 SDK 支持培训页面还提供示例代码,列于“教程”部分。 如果示例代码可解决开发商正试图解决的问题,只需提取和放置即可,否则,需要通过随代码集一同提供的行内文档进行调整和扩展。

英特尔还通过在消费电子展(拉斯维加斯)等贸易展和英特尔开发人员论坛(旧金山)上展示游戏的早期开发阶段,为 CompSens 的 Space Astro Blaster开发提供帮助。 这些机会有助于媒体和 OEM 与该游戏互动,更多地了解可变革玩家与计算机的交互方式的英特尔实感技术,并在该领域宣传 space-based shooter。

展望未来

在集成英特尔实感 SDK 和游戏平台方面,CompSens 仍面临很多机会。 他们希望使用英特尔实感 SDK 的 3D 面部建模和集成特性,以帮助玩家创建游戏内 3D 面部模型。 这些模型可用作特定战舰的图标,或集成至战舰的机舱成为玩家的替身,从而增强 Space Astro Blaster的浸入式体验。

随着计算机和软件复杂性的不断增强,用户需要更加自然的人机交互方式。 能够使用手势、语音和运动将不仅成为大受欢迎的变革,而且将成为计算生态系统的必要条件之一。

关于 CompSens

CompSens,总部位于中国北京,致力于开发虚拟现实和增强现实软件解决方案。 专注于为专业人士和消费者领域开发自然交互软件,自然而然,团队开始通过游戏开发了解英特尔实感 SDK 所提供的全新用户交互方法。 目前,CompSens 正计划进一步实现英特尔实感 SDK 与 Space Astro Blaster游戏的集成,还计划将逼真的用户界面集成至其他即将启动的软件项目。

其他资源

英特尔实感开发人员专区

英特尔实感 3D 摄像头

案例研究Space Between* Plumbs Ocean Depths with Intel RealSense Technology


Unity* 和英特尔® 实感™ 3D 摄像头助力游戏开发

0
0

所有互动游戏都有游戏开发人员必须实施的功能:游戏对象应遵循物理定律,并与其他游戏对象发生接触;游戏对象应触发事件,比如播放声音和计分;以及响应用户的输入,比如操纵杆、鼠标和键盘。通常情况下,开发人员必须针对每个目标平台反复实施这种功能,过程非常耗时。为了减轻负担,开发人员可选择使用游戏引擎,后者包含可执行常规任务的不同函数,从而将更多精力集中于增强游戏创意。

Unity 技术的交叉平台游戏引擎Unity* 3D是一款极具吸引力的解决方案。它的目标平台包括计算机、游戏控制台、移动设备和 web 浏览器。Unity 3D 还支持 C++、C#、Unity Script(类似于 JavaScript*),Boo 等不同的编程语言。

本文同时适于初学者和专家阅读。对于之前从未使用过 Unity 的开发人员,我们在本文的第一部分做了简要介绍。然后演示如何结合使用手部追踪和英特尔® 实感™ SDK,以借助 C# 和英特尔实感 3D 摄像头开发一款小游戏。如欲加入游戏开发行列,您需要: 安装于计算机的 Visual Studio和 Unity,以及英特尔实感 SDK 和英特尔实感 3D 摄像头。

下载、安装和配置 Visual Studio*

您可以免费下载 Unity。Unity 基于 Microsoft Windows* OS 和 Apple Mac* OS X* 运行。安装 Unity 后,您应完成免费注册流程。

本文所显示的代码基于 C# 编程语言编写而成。IDE Unity 提供的默认交叉平台为MonoDevelop。如果您是 .NET 开发人员,肯定十分希望 Unity 和Microsoft Visual Studio能够完美地协同工作。第一步为连接 Unity 和 Visual Studio。为此,您需要从下拉菜单中选择 Edit -> Preferences…。将打开 Unity Preferences 对话框。选择左侧的 External Tools(图 1) 对于外部脚本编辑器,点击 ComboBox 中的 MonoDevelop,并使用Browse… 按钮查找 Visual Studio .exe 文件。使用默认设置安装 Visual Studio;程序的位置路径应为:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe.

这些是成功完成连接的全部必要步骤。


图 1. 连接 Visual Studio* 和 Unity*

环境

现在是配置 Unity 环境的部分特性的最佳时机。主屏幕包含多个不同的窗口。可手动选择设置或使用默认设置,查找最理想的安排。我们从右上角的 Layout 下拉菜单中选择常用设置 Tall


图 2. 选择窗口的位置

场景窗口和游戏窗口

第一个较大的场景窗口(图 3)主要用于定位以及布局您的游戏世界。以 3D 为标准实现内容可视化。通过拖放操作可轻松定位游戏对象。您可直接查看主屏幕上方的游戏选项卡。通过该游戏选项卡,可预览渲染后的游戏,显示在所需的平台上。


图 3. 场景窗口

图 4. 游戏窗口

层级窗口 (Hierarchy Window)

层级窗口(图 5)包含相关的内容对象,例如,游戏对象、摄像头视图、光照对象、UI 元素和音频。可在 "GameObject"下的菜单中,或直接在窗口中使用 "Create"创建新的内容对象。


图 5. 层级窗口

检查器窗口 (Inspector Window)

在层级窗口中选中内容对象后,检查器窗口将显示其属性(图 6)。通过添加 'add component'按钮提供的组件,可进行功能扩展。例如,名为 rigid body 的组件,可为游戏对象提供重力。


图 6. 检查器窗口

项目窗口

项目窗口中排列了多个项目文件,比如游戏场景、游戏对象、音频、图片和脚本文件(图 7)。选择文件时,检查器显示相应的属性和预览信息。双击文件名称,可直接打开应用的脚本文件,及其开发环境。


图 7. 项目窗口

开发简单游戏

20 世纪 70 年代早期,Atari 创始人 Nolan Bushnell 成功发布了一款名为 “Pong” 的游戏。游戏规则非常简单,与乒乓球类似:球在屏幕中来回移动。每名玩家控制一把垂直球拍。如果玩家没有成功回球,对手将获得一分。以下步骤将介绍如何在 Unity 中开发 Ping Pong 游戏。

通过 File -> New Project创建新项目 PingPongUnity


图 8. 创建新项目

球拍

首先添加球拍,在层级窗口中点击 Create -> 3D Object -> Cube。如需改变球拍的形状和位置属性,您需要选择生成的立方体,并在检查器窗口中对其进行更改。我们将名称更改为 Paddle1,并在转换部分自定义它的形状。所需的 scale-值包括: X: 0.5,Y:3,Z:1。将 Position设置为: X: -9,Y: 1, Z: 0。现在,第一只球拍就完成了。在层级窗口中右击该球拍,然后在环境菜单中点击 Duplicate。这样可复制一把相同的球拍。现在,您只需将该复制品重命名为 Paddle2。然后将 Position。 的 X。 值改为 9。 即可。

为使球拍做出正确的物理行为,我们需要点击 “Add Components” 按钮,为每只球拍添加 RigidBody 组件。这样我们可在代码范围内移动球拍,使球拍和球发生碰撞。现在,球与球拍发生碰撞后,弹出了球场外。这不是我们想要的行为。为避免出现这种行为,我们需要为新增的 RigidBody 设置限制属性。球拍只允许上下移动,因此我们需要在冻结旋转部分选择 x、y 和 z,并在冻结位置只选择 x。


图 9. 生成的球拍

墙壁

打乒乓球时,我们需要两面墙壁:上壁和下壁,以便球反弹出去并留在球场内。因此,我们再次使用立方体。再次点击层级窗口中的 Create -> 3D Object -> Cube。命名为 WallBelow。墙壁的形状稍长一些,将 scale值设置为: X: 23,Y: 1,Z: 1。位置的值设为: X: 0,Y: -5, Z: 0

生成第二面墙壁时,只需复制刚刚生成的墙壁,并将其命名为 WallAbove。现在将 Y-Position 更改为 7


图 10. 生成的墙壁

游戏最后,也是最重要的一个对象是:球。Unity 提供了一个符合形状的球。只需点击层级窗口中的 Create -> 3D Object -> Sphere。将名称更改为 Ball,并将Position设置为 X: 0,Y: 1, Z: 0。如欲添加相应的物理属性,您需要使用 "Add Components"添加 rigid body 组件,并删除属性选择 "Use gravity”。

图 11. 生成的球

调整摄像头视角,并增加亮度。

游戏的场景显示和游戏窗口仍然不够理想。我们需要更改摄像头设置。在层级窗口中,选择标配摄像头 Main Camera。然后将当前的 3D 视图改为 2D 视图。这一步骤在摄像头 Projection属性中完成。将 Perspective (3D) 更改为 Orthographic (2D)。这样我们可获得正面的视图。并将新的 Size属性更改为 10

如果场景窗口的显示仍然不够理想,您可以点击坐标轴旋转视图。


图 12. 点击坐标轴启用视图旋转功能。

这样,摄像头获得了比较理想的设置。但游戏对象仍然较暗。为增加亮度,需要切换至层级窗口,然后点击 Create -> Light -> Directional Light。现在,您可以看到,游戏窗口发生了变化。


图 13. 游戏窗口中的游戏

移动球

游戏场地已经准备好,但仍需一些动作。如果运行游戏,球落地,就可以了。我们需要编写几行 C# 代码,使球运动起来。为此,我们点击项目窗口中的 Create 按钮,创建名为 “Ball” 的 C# 脚本文件。然后,创建脚本文件和游戏对象之间的绑定。这一步骤的具体做法为:将文件拖放至层级或场景窗口中的游戏对象。选择球体对象后,检查器窗口将显示脚本属性。

双击 C# 文件,自动启动您设置好的开发环境:MonoDevelop 或 Microsoft Visual Studio。生成的 C# 类将以标准结构开始。它包含 MonoBehavior 基本类,是 Unity API 的一个界面。“Start” 方法可用于一次性初始化和准备。游戏框架每秒处理几张图片,就好像您正在观看电视或手翻书。单张图片称为图画。绘制图画之前,每次需调用 “Update” 方法。我们将这种反复称之为游戏循环,这意味着其他游戏对象可在不考虑玩家动作的情况下行动。

在该游戏中,我们希望设置球落地的方向,在游戏开始前设置一次。“Start” 方法似乎非常可行。您可在表 1 中查找所需的代码。

using UnityEngine;

public class Ball : MonoBehaviour
{
    private float _x;
    private float _y;

    // Use this for initialization
    void Start ()
    {
       _x = GetRandomPositionValue();
       _y = GetRandomPositionValue();
        GetComponent<Rigidbody>().velocity = new Vector3(Random.Range(5,10) * _x, Random.Range(5,10) * _y, 0);

        Debug.Log("x: " + _x);
        Debug.Log("y: " + _y);
    }

    private float GetRandomPositionValue()
    {
        if (Random.Range(0, 2) == 0)
        {
            return -1;
        }
        return 1;
    }

    // Update is called once per frame
    void Update ()
    {
    }
}

表 1. 借助 C# 让球在一个方向下落

游戏对象的真正魅力隐藏于组件部分。有一款组件可实现所有游戏的逻辑。表 1 中的 C# 代码可通过 GetComponent 方法访问当前游戏对象的 Rigidbody 组件。Rigidbody 通过重力功能扩大游戏对象。设置速度属性时,会分配一个新的 Vector3 实例。它可定义当前重力的随机方向。

第二次游戏测试表明,球可随机朝不同的方向落下。但球碰到墙壁后,将沿着屏幕上行,我们不希望出现这种行为。它应该更像在墙壁之间反弹的橡皮球。

Physic Material 可帮助达到这种效果。我们点击项目窗口中的 Create 按钮,创建 Physic Material。将它重命名为 Bouncy。如需实现反弹行为,还要对属性做些调整。在检查器窗口中,将属性 Dynamic FrictionStatic Friction的值设为 0Bounciness设为 1Friction Combine要求设为最小值,Bounce Combine设为最大值。


图 14. 添加和设置 Physic Material

为使所有游戏对象使用我们生成的 Physic Material,必须设置通用物理设置。为此,点击菜单 Edit -> Project Settings -> Physics。将 Physic Material Bouncy拖放至 Default material属性。属性 Bounce Threshold应设为 0.1。如果现在启动游戏,球的动作将与橡皮球一样。


图 15. 设置 PhysicsManager 中的 “Bouncy”

用手控制球拍

此款游戏即将完成。游戏对象已各就各位,球也处于运动之中。剩下的一点就是控制球拍的逻辑。为此,最佳的方法是使用创新型输入设备,即 3D 摄像头,该摄像头已普遍用于 Microsoft Xbox* 和 Kinect*。部分最新平板电脑和超极本™ 设备也配备了 3D 摄像头。如果没有 3D 摄像头,也可以使用这些经济型设备。开发游戏时,您需要下载免费的英特尔实感 SDK。安装后,您可以在英特尔实感 SDK 文件夹中查找到一些 Unity 示例。

图 16英特尔实感 SDK 示例

Unity 3D 支持第三方插件,并为英特尔实感 SDK 创建了一个这样的插件。如欲集成英特尔实感 SDK,必须将 SDK DLL 文件添加至项目。在 Unity 中选择 Assets -> Import package -> custom package.... 然后选择 RSUnityToolkit.unitypackage文件,该文件位于 C:\Program files (x 86) \Intel\RSSDK\framework\Unity 路径下。将会弹出类似图 17 所示的对话框窗口。该对话框默认选择了所有文件。点击 None清空选项,只选择插件目录。如果基于 64 位计算机开发游戏,您还需手动替换导入的 DLL 文件。这些文件位于下列目录:C:\Program Files (x86)\Intel\RSSDK\bin\x64


图 17使用 "import package"将英特尔实感 SDK 集成至 Unity*

集成后,现在可开始开发球拍逻辑了。我们需要另外一个 C# 文件,可通过点击项目窗口中的 Create按钮生成。该文件名称为 Paddle。游戏过程中只需生成一个常见实例即可响应两只球拍。这一点非常重要,因为英特尔实感 3D 摄像头只能连接一个实例,无法连接多个。因此,我们在层级窗口中将新文件拖放至 "main camera"游戏对象,以实现连接。

接下来,双击 Paddles.cs 文件。即使文件连接了主摄像头,仍然需要球拍游戏对象。Unity 中多个游戏对象之间的连接通过属性就可实现。在 C#,您需要使用 “get” 和 “set” 宣布其他属性,但在 Unity 中不需要。我们需要做的只是针对每支球拍创建类型 GameObject 的公共变量,如表 2 所示。现在,可将游戏对象拖放至创建好的球拍属性,以实现连接。

public class Paddles : MonoBehaviour
{
    public GameObject Paddle1;
    public GameObject Paddle2;
..
Listing 2 – Self written properties


图 18. 借助 Unity* 宣布面向 Paddles.cs 文件的游戏对象

英特尔实感 SDK 提供类 PXCMSenseManager,可实现与摄像头的永久连接。该启动函数只能从 Unity 引擎中调用一次,因此是一般实例准备的理想选择。这是我们在启动函数中初始化 PXCMSenseManager 类的原因。为此,我们首先为其提供 QueryHand 模块,这样有助于我们读取手势。如欲识别面部表情和语音,需采用其他模块。摄像头的实例在启动函数外以 _pxcmSenseManager 字段的形式宣布。代码如表 3 所示。

public class Paddles : MonoBehaviour
{
    public GameObject Paddle1;
    public GameObject Paddle2;

    private PXCMSenseManager _pxcmSenseManager;
    private PXCMHandModule _pxcmHandModule;

    // Use this for initialization
    private void Start()
    {
        _pxcmSenseManager = PXCMSenseManager.CreateInstance();

        if (_pxcmSenseManager == null)
        {
            Debug.LogError("SenseManager Initialization Failed");
        }
        else
        {
            pxcmStatus pxcmResult = _pxcmSenseManager.EnableHand();
            if (pxcmResult != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                Debug.LogError("EnableHand: " + pxcmResult);
            }
            else
            {
                _pxcmHandModule = _pxcmSenseManager.QueryHand();
                _pxcmSenseManager.Init();

                PXCMHandConfiguration configuration = _pxcmHandModule.CreateActiveConfiguration();
                configuration.EnableAllGestures();
                configuration.ApplyChanges();
                configuration.Dispose();
            }
        }
    }
...

表 3. 与英特尔实感 3D 摄像头的永久连接

采用更新函数(游戏循环)可直接查询最新的摄像头数据,我们可因此确认摄像头是否捕捉到了手部。左手用于控制左球拍,右手控制右球拍。因此,您需要将计算后的数值分别分配给各自的球拍。因为逻辑非常相似,因此我们创建私有函数 MoveBall。

如果玩家退出或重新启动游戏,需要断开摄像头的直接实例。Unity 引擎可自动调用的函数 OnDisable 非常适用于这种情况。

   // Update is called once per frame
    private void Update()
    {
        if (_pxcmSenseManager == null)
        {
            return;
        }

        _pxcmSenseManager.AcquireFrame(false, 0);

        _pxcmHandModule = _pxcmSenseManager.QueryHand();
        PXCMHandData handData = _pxcmHandModule.CreateOutput();
        handData.Update();

        MoveBall(handData, PXCMHandData.AccessOrderType.ACCESS_ORDER_LEFT_HANDS, Paddle1);
        MoveBall(handData, PXCMHandData.AccessOrderType.ACCESS_ORDER_RIGHT_HANDS, Paddle2);

        _pxcmSenseManager.ReleaseFrame();
    }

    private void MoveBall(PXCMHandData handData, PXCMHandData.AccessOrderType accessOrderType, GameObject gameObject)
    {
        PXCMHandData.IHand pxcmHandData;
        if (handData.QueryHandData(accessOrderType, 0, out pxcmHandData) ==
            pxcmStatus.PXCM_STATUS_NO_ERROR)
        {
            PXCMHandData.JointData jointData;
            if (pxcmHandData.QueryTrackedJoint(PXCMHandData.JointType.JOINT_CENTER, out jointData) ==
                pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                gameObject.GetComponent<Rigidbody>().velocity = new Vector3(-9, jointData.positionWorld.y*100f, 0);
            }
        }
    }

    private void OnDisable()
    {
        _pxcmHandModule.Dispose();
        _pxcmSenseManager.Dispose();
    }
}

表 4. 用手移动球拍

重启游戏

生成游戏对象,并编写逻辑代码后,现在可以测试游戏了。如果摄像头可在 1-5 米的范围实现手部识别,球拍将会移动。球碰到球拍后,将会反弹至对面。如果球离开球场,未触碰到球拍,玩家将无计可施。在这种情况下,如果球离开球场,应自动重启游戏。

只需几行代码就可实施 Ball.cs 文件的逻辑。如果球还在视线范围内,应检查 Update 函数。如果看不到球,Application.LoadLevel 函数将重启游戏,如 表 5 所示。

private bool _loaded;

// Update is called once per frame
void Update ()
{
    if (GetComponent<Renderer>().isVisible)
    {
        _loaded = true;
    }

    if (!GetComponent<Renderer>().isVisible && _loaded)
    {
        Application.LoadLevel(Application.loadedLevel);
    }
}

表 5. Ball.cs: 看不到球时重启游戏

发布游戏

第一版游戏已就绪,当然,我们希望同大家一起分享。菜单选项 File | Build Settings (Ctrg + Shift + B) 可打开 Build 对话框。您可以从包含众多选择的 Platform 框中选择用来运行游戏的平台。我们选择 Windows,并将 x86_64 设置为架构。点击Build即可启动编译器并生成面向 Windows 的.exe 文件。如欲玩游戏,您需要配备包含预安装驱动程序的英特尔实感 3D 摄像头。


图 19. 创建 .exe 文件发布游戏

现在轮到您了

我已经向大家演示了如何创建有趣的游戏,但还需做进一步改进。那么,向我展示您的学习成果吧。构建高分、声效和炫酷特效的游戏。请将视频上传至 YouTube*,然后通过电子邮件将创建好的游戏发送给我。非常高兴看到大家的创意。现在,请用英特尔实感 3D 摄像头尽享首款 Unity 游戏的乐趣吧。


图 20. 玩游戏
图 21. 游戏 UI

关于作者

Gregor Biswanger(微软 MVP,英特尔黑带开发人员, 英特尔软件创新者)是CleverSocial.de的创始人,兼自由讲师、顾问、培训师、作家和演讲者。他为大中型企业和机构提供关于软件架构、灵活流程、XAML、Web 应用和混合应用开发、云解决方案、内容营销和社交媒体营销方面的建议。

他在 video2brain 和 Microsoft 发布了一些关于上述主题的培训视频。他还是一名自由作家,为heise Developer撰写在线文章,并为商业类杂志撰写文章。他主笔撰写过 entwickler.press 出版的《交叉平台开发》一书。

他还经常参加国际会议,或在会议上发言。英特尔曾聘请他担任英特尔® 开发人员专区的技术顾问。此外,他还是 INdotNET (Ingolstaedter .NET Developers Group) 的负责人。点击此处,查找关于他的联系方式: https://about.me/gregor.biswanger

Direct3D* 12 — 提高 PC 上的控制台 API 效率和性能

0
0

Direct3D* 12 概述
作者: Michael Coppock

下载 PDF

摘要
Microsoft Direct3D* 12 是 PC 游戏技术令人兴奋的跨越式发展,可帮助开发人员更好地控制游戏,提高 CPU 的效率和可扩展性。


 

目录

简介

    1.0 – 突破过去
    1.1 – 接近完美

2.0 – 管线状态对象

3.0 – 资源绑定

    3.1 – 资源 Hazards
    3.2 – 资源存放管理
    3.3 – 状态镜像

4.0 – 堆和表

    4.1 – 冗余资源绑定
    4.2 – 描述符
    4.3 –
    4.4 –
    4.5 – 无绑定和高效性
    4.6 – 渲染环境概述

5.0 – 捆绑包

    5.1 – 冗余渲染指令
    5.2 – 什么是捆绑包?
    5.3 – 代码效率

6.0 – 命令列表

    6.1 – 命令创建并行性
    6.2 – 列表和队列
    6.3 – 命令队列流

7.0 – 动态堆

8.0 – CPU 并行性

9.0 – 总结

参考资料和相关链接

声明和免责条款

简介

在 GDC 2014 上,Microsoft 发布了一条震惊整个 PC 游戏界的消息 — 2015 年将推出下一代 Direct3D,即 Direct3D 第12 版。 D3D 12 回归低级别编程,可支持游戏人员更好地进行控制,并推出许多令人兴奋的新特性。 D3D 12 开发团队主要着力于降低 CPU 开销,提高各 CPU 内核间的可扩展性。 其目标是提高控制台 API 效率和性能,以便控制台游戏能够更高效地使用 CPU/GPU 并获得更出色的结果。 在 PC 游戏领域,线程 0 通常执行大部分,甚至全部的任务。 其他的线程仅处理操作系统或其他系统任务。 真正的多线程 PC 游戏很少。 Microsoft 希望通过 D3D 12 改变这一现状。D3D 12 是 D3D 11 渲染功能的超集, 这表示现代 GPU 能够运行 D3D 12,因为它能够更高效地利用当下的多核 CPU 和 GPU。 用户无需额外花钱购买新的 GPU 即可采用 D3D 12。 基于英特尔® 处理器系统的 PC 游戏拥有光明的未来!

1.0 突破过去

低级别编程在控制台行业非常常见,因为每个控制台的规格是固定的。 游戏开发人员将有时间对游戏进行调整,并尽可能地利用 Xbox One* 或 PlayStation* 4 的全部功能和性能。 PC 是一个天生的灵活平台,包含无数个选件。 在开发新的 PC 游戏时,可以制定许多种计划。 OpenGL* 和 Direct3D* 等高级别 API 可以帮助简化开发。 它们能够极大地减轻负担,以便开发人员将更多地精力放在开发游戏上。 问题是,API 以及(从更小一点地范围来说)驱动程序已经达到非常复杂的地步,以至于影响了帧的渲染,从而降低了性能。 因此,大家将目光投向低级别编程。

基于 PC 的低级别编程随着 MS-DOS* 时代的结束而淡出,特定厂商 API (如 3DFX* 提供的 3Dglide*)让位于 Direct3D 等 API。 PC 在便捷性和灵活性方面的性能不断落后。 硬件市场日趋复杂,能够提供大量选项。 开发时间增加,因为开发人员希望确保购买他们游戏的玩家都能够很好地玩游戏。 不仅软件端的情况发生了变化,而且 CPU 能效也变得比性能更重要。 相比原始频率,CPU 中的多核和多线程以及现代 GPU 的并行渲染才是影响未来性能的主要方面。 我们需要将 PC 游戏迁移至游戏控制台。 我们需要更好、更有效地利用所有内核和线程。 我们需要将 PC 游戏发展为 21 世纪的现代游戏。

1.1 接近完美

为了使游戏“接近完美”,我们必须降低 API 和驱动程序的尺寸和复杂性。 我们应该减少硬件和游戏本身之间的层。 API 和驱动程序花费了太多时间转换命令和调用。 游戏开发人员将重获部分(甚至大部分)的控制。 D3D 12 降低的开销将可提高性能,游戏和 GPU 硬件之间更少的层意味着提供外观和性能更出色的游戏。 另一方面是,某些开发人员可能不想控制 API 处理的领域,如 GPU 内存管理, 也可能这是游戏引擎开发人员想要进入的领域,只有时间能够告诉我们结果。 鉴于 D3D 12 的发布还需要一段时间,我们还有时间去弄清楚这件事情。 既然可能拥有如此光明的前景,那么如何实现呢? 主要通过四种新特性,管线状态对象 (Pipeline State Object)、命令列表、捆绑包和堆。

2.0 管线状态对象

为了更好地讨论管线状态对象 (PSO),我们先来回顾一下 D3D 11 渲染环境,然后再了解一下 D3D 12 中的变化。 图 1 中包含 D3D 11 渲染环境,该环境是 D3D 开发领袖 Max McMullen 于四月份在 BUILD 2014 上展示的内容。


图 1: D3D 11 渲染环境。 [转载获得 Microsoft 许可。]

大号的粗体箭头表示每条管线的状态。 每个状态可根据游戏的需求进行检索或设置。 底部的其他状态是固定函数状态,如视口或裁剪矩形。 本土中的其他相关特性将在本文的后续章节中进行介绍。 对于 PSO 讨论,我们只需要查看图表的左侧。 D3D 11 的小型状态对象相比 D3D 9 的 CPU 开销更低,但是驱动程序采用这些小型状态对象并在渲染时将其融入 GPU 代码还需要其他的操作。 我们将称其为硬件失配开销。 接下来我们通过图 2 中了解一下 BUILD 2014 的其他图表。


图 2: 采用小型对象的 D3D 11 管线会频繁导致产生硬件失配开销。

左侧展示了 D3D 9 风格的管线,应用使用该管线执行任务。 图 2 右侧的硬件需要进行编程。 状态 1 代表着色器代码。 状态 2 是光栅化单元以及将光栅化单元与着色器链接的控制流的结合。 状态 3 是混合着色器和像素着色器之间的链接。 D3D 顶点着色器会影响硬件状态 1 & 2、光栅化程序状态 2、像素着色器状态 1-3 等。 多数驱动程序不希望与应用同时提交调用。 它们更希望进行记录,直至任务完成,以便了解应用真正想要什么。 这表示,其他 CPU 开销(如旧数据和过期数据)将标记为“脏数据”。 驱动程序的控制流将在绘制时检查每个对象的状态,并编写硬件以匹配游戏设置的状态。 另外执行这些任务后,资源将会耗尽并可能会出现问题。 理想状态下,游戏设置管线状态后,驱动程序将会了解游戏的目的并对硬件执行一次编写。 图 3 展示了 D3D 12 管线,该管线在管线状态对象 (PSO) 中执行该操作。


图 3: D3D 12 管线状态优化简化了流程。

图 3 展示了开销降低的简化流程。 包含每个着色器的状态信息的一个 PSO 可以在一个文本中设置所有硬件状态。 请记住,一些状态在 D3D 11 渲染器环境中标记为“其他”。 D3D 12 团队意识到应该减小 PSO 的尺寸,并允许游戏在不影响已编译 PSO 的前提下更改渲染器目标。 视口和裁剪矩形等特性独立出来,与其他的管线在编程上无关联(图 4)。


图 4: 左侧展示了新的 D3D 12 PSO,其包含更大的状态,能够提供更高的效率。

相比以前单独设置和读取每个状态,我们现在采用一个视角,减少或完全消除了硬件失配开销。 应用在需要时设置 PSO,驱动程序采用 API 命令并将其转换为 GPU 代码,同时不增加流控制开销。 这一“接近完美”的方法代表绘制命令将需要更少的周期,从而可提高性能。

3.0 资源绑定

在讨论资源绑定变更之前,我们需要快速回顾 D3D 11 中的资源绑定模型。 图 5 再次展示了渲染环境图形,其中左侧是 D3D 12 PSO,右侧是 D3D 11 资源绑定模型。


图 5: 左侧为 D3D 12 PSO,右侧为 D3D 11 资源绑定模型的渲染器环境。

在图 5 中,Explicit 绑定点位于每个着色器的右侧。 Explicit 模型表示管线中的每个阶段都有其要指称的具体资源。 它们与 GPU 内存中的点参考资源绑定。 这些资源可能是纹理、渲染目标、缓冲、UAV 等。资源绑定很久之前就已经发布,事实上,它在 D3D 发布之前便已发布。 其目标是处理场景是处理场景背后的多种属性,并有效帮助游戏提交渲染命令。 但是,系统需要在三个关键区域运行许多绑定检查。 下一部分将会介绍这些区域,以及 D3D 团队如何针对 D3D 12 对其进行优化。

3.1 资源 Hazard

通常,Hazard 是转移,如从渲染目标迁移至纹理。 游戏可能需要渲染一帧,将其用作场景的环境贴图。 游戏完成环境贴图的渲染,现在想要将其用作纹理。 在这一过程中,运行时和驱动程序将会追踪某一对象何时绑定为渲染目标或纹理。 如果运行时和驱动程序发现有绑定为二者的对象,将会解除绑定以前的设置,并遵循最新的设置。 通过这种方式,游戏能够按照需求进行切换,软件堆栈能够在后台管理切换。 驱动程序也需要刷新 GPU 管线才能够将渲染目标用作纹理。 否则,在 GPU 中被检索到之前,像素便会被读取,您将无法获得一致的状态。 本质上,Hazard 是需要在 GPU 进行额外处理以确保数据一致的对象。

与 D3D 12 中的其他特性和增强一样,解决办法提供更多的游戏控制。 API 和驱动程序为什么要费力追踪一帧中某一点的时间? 从一个资源切换为另一资源大约需 1/60 秒的时间。 通过重新支持游戏进行控制,将降低开销,而且当游戏转换资源时,仅需支付一次成本(图 6)。


D3D12_RESOURCE_BARRIER_DESC Desc;
Desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
Desc.Transition.pResource   = pRTTexture;
Desc.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
Desc.Transition.StateBefore = D3D12_RESOURCE_USAGE_RENDER_TARGET;
Desc.Transition.StateAfter  = D3D12_RESOURCE_USAGE_PIXEL_SHADER_RESOURCE;
pContext->ResourceBarrier( 1, &Desc );
图 6: D3D 12 中添加的资源屏障 API

图 6 中的资源屏障 API 可声明一个资源及其源和目标用途,然后调用函数以告知运行时和驱动程序该转换。 它成为明确的对象,而非需要使用大量条件逻辑跨帧渲染器进行追踪的对象,从而使其成为每帧的单一时间或游戏需要进行转换的频率。

3.2 资源存放管理

D3D 11(及其更低版本)以调用在排队为前提运行。 游戏相信 API 能够立即执行调用。 然而事实并非如此。 GPU 的命令都无法即时调用和执行。 虽然这能够提高 GPU 和 CPU 之间的并行性和效率,但是需要大量的引用计数和追踪。 这些计数和追踪都需要占用 CPU。

为了修复这一点,我们在游戏中添加了对资源生命周期的显性控制。 D3D 12 不再隐藏 GPU 的排队特性。 游戏中添加了围栏 API,以追踪 GPU 进程。 游戏可以在特定点(每帧一次)进行检查,并确认不再需要哪些资源,然后将其内存释放,以作他用。 将不再需要使用额外逻辑追踪帧渲染器的时长,以释放资源和内存。

3.3 状态镜像

对上述三个区域进行优化后,发现了另一个可能会对效率进行提升的元素(尽管性能的提升较小)。 设置绑定点后,运行时将会追踪该点,以便游戏以后调用 Get 以了解绑定至管线的点。 将绑定点镜像或复制。 游戏中添加了一个特性,旨在帮助中间件更轻松地操作,以便组件化软件发现渲染环境的当前状态。 资源绑定进行优化后,将不再需要镜像状态副本。 除了将流控制从上述三个区域中删除之外,还删除了用于状态镜像的 Gets。

4.0 堆和表

还有一个重要的资源变更需要介绍一下。 第四部分末将会展示整个 D3D 12 渲染环境。 全新 D3D 12 渲染环境是提高 API CPU 效率的第一步。

4.1 冗余资源绑定

对几个游戏进行分析后,D3D 开发团队发现,一般情况下,游戏在不同帧中使用相同的命令序列。 不仅是命令,绑定在不同的帧间也是相同的。 CPU 生成一系列绑定,比如 12 个,在一帧上绘制对象。 通常,CPU 需要为下一帧再次生成这 12 个绑定。 为什么不将这些绑定缓存,并为开发人员提供一个指向缓存的命令,以便再次使用相同的绑定?

第三部分中,我们介绍了队列。 当发起调用时,游戏认为 API 将立即执行调用。 但是事实并非如此。 命令被放入队列,在队列中所有命令都将延迟,并由 GPU 延后执行。 因此,如果您对我们之前说过的 12 个绑定中的一个绑定做出变更,驱动程序将会把 12 个绑定全部复制到新的位置,对副本进行编辑,然后通知 GPU 开始使用复制的绑定。 通常 12 个绑定中多数仅包含静态值,只有少数几个捆绑包含需要更新的动态值。 当游戏想要对这些绑定进行部分变更,它需要复制全部绑定,这样,较小的变更花费了大量的 CPU 成本。

4.2 描述符

什么描述符? 简言之,它是定义资源参数的数据。 本质上,它是 D3D 11 视图对象背后的数据, 没有操作系统生命周期管理。 它只是 GPU 内存中的不透明数据。 它包含类型和格式信息、mip 纹理计数以及一个指向像素数据的指针。 描述符是新资源绑定模型的核心。


图 7: D3D 12 描述符,定义资源参数的小型数据。

4.3 堆

当在 D3D 11 中设置视图时,它将会把描述符复制到 GPU 内存中将读取描述符的位置。 如果您在同一个位置设置新视图,D3D 11 将会把描述符复制到新的内存位置,并告知 GPU 在下一个绘制命令中从新位置读取。 当对描述符执行创建、复制等操作时,D3D 12 将提供对游戏或应用的明确控制。


图 8

堆(图 8)只是大型的描述符阵列。 您可以重新使用以前的绘制或帧中的描述符。 您还可以根据需要传输新的描述符。 布局归游戏所有,因此操作堆无需太多的开销。 堆尺寸取决于 GPU 架构。 较老的低功耗 GPU 的尺寸限制在 65k,而高端 GPU 的尺寸受限于内存。 较低功耗的 GPU 有可能超过堆。 因此,D3D 12 允许使用多个堆,从一个描述符堆切换至下一个。 但是,在某些 GPU 的堆之间切换会导致出现刷新,因此必须谨慎使用该特性。

我们如何将着色器代码与特定描述符或描述符集相关联? 解决方案? 表。

4.4 表

表是堆的起始索引和尺寸。 它们是环境点 (context points),但不是 API 对象。 您可以根据需要在每个着色器阶段部署一个或多个表。 例如,绘制调用的定点着色器可以部署一个表,指向堆中偏移量在 20 至 30 的描述符。 当下一次绘制开始时,偏移量将更改为 32 至 40。


图 9

使用当前硬件,D3D 12 在 PSO 可以在每个着色器阶段处理多个表。 您可以部署一个表,在该表中仅添加在不同调用之间频繁变化的数据;然后再部署一个表,在该表中仅添加在不同调用、帧之间处于静态的数据。 这样做可以避免将所有描述符从一个调用复制到下一个。 但是,较旧的 GPU 仅可在每个着色器阶段部署一个表。 多表仅支持在当前和以后的硬件上使用。

4.5 无绑定和高效性

描述符堆和表是 D3D 团队对无绑定渲染的采用,只是无法在 PC 硬件间扩展。 D3D 12 支持所有系统,从低端的系统芯片到高端的独立显卡。 此统一方式可为游戏开发人员提供许多绑定流可能性。 此外,新模型包括多个频率的更新。 支持包含静态绑定的高速缓存表重新使用,同时支持包含在每次绘制时不断变化的数据的动态表,从而在每次执行新绘制任务时无需复制全部绑定。

4.6 渲染环境概述

图 10 展示了目前讨论的 D3D 12 变化的渲染环境。 它还展示了新 PSO 以及 Gets 的删除,但是仍然包含 D3D 11 显性绑定点。


图 10: 本文中目前介绍的 D3D 12 变化的渲染环境。

接下来,我们将 D3D 11 渲染环境的最后一部分删除,并添加描述符表和堆。 现在,我们在每个着色器阶段部署了一个表或多个表,如像素着色器所示。


图 11: D3D 12 的整个渲染环境。

精细的状态对象消失,取而代之的是管线状态对象。 Hazard 追踪和状态镜像删除。 显性绑定点更换为应用/游戏管理的内存对象。 通过减少开支,删除 API 和驱动程序中的控制流和逻辑,CPU 效率得到提升。

5.0 捆绑包

我们结束在 D3D 12 中添加新的渲染器环境,观察 D3D 12 如何将控制归还游戏,使其“接近完美”。 但是,D3D 12 删除或简化 API churn(混乱)需要执行更多的操作。 API 中仍然有开销降低性能,因此我们需要其他方式充分使用 CPU。 命令序列如何? 重复序列有多少,如何使它们更高效?

5.1 冗余渲染命令

通过逐帧检查渲染命令,Microsoft D3D 团队发现,只有 5-10% 命令序列删除或添加。 其余的命令都是在不同的帧间重复使用。 因此,90-95% 的时间,CPU 都在重复相同的命令序列。

如何使其更高效? D3D 为何目前尚未尝试它? 在 BUILD 2014 上,Max McMullen 表示:“很难构建一种方法,以一致、可靠的方式来记录命令。 在不同驱动程序的不同 GPU 上以相同的方式运行,并保持同步可以确保一致。” 游戏需要所记录的命令序列与单独的命令的运行速度一样快。 什么改变了现状? D3D 改变了现状。 借助全新的 PSO、描述符堆和表,需要记录的状态以及播放命令得到极大简化。

5.2 什么是捆绑包?

捆绑包是一个小型命令列表,它记录了一次,但可在不同的帧和同一帧上重复使用,重复使用没有任何限制。 捆绑包可以在任何线程上创建,并可无数次使用。 捆绑包没有和 PSO 状态绑定,这表示 PSO 可以更新描述符表,然后当捆绑包使用不同的绑定再次运行时,游戏将得到其他的结果。 如同 Excel* 电子数据表中的公式,算法是一样的,只是结果取决于源数据。 我们添加了一些限制,以确保驱动程序能够有效执行捆绑包,其中一个是确保任何命令都无法更改渲染目标。 但是,我们仍然保留了许多能够记录和回放的命令。


图 12: 捆绑包是能够根据需要进行记录和回放的多次重复命令。

图 12 左侧是渲染环境示例,CPU 生成一系列命令,然后传递至 GPU 执行。 右侧是两个捆绑包,其中包含一个记录在不同线程上以便重复使用的命令。 当 GPU 运行命令时,最终会运行一个执行包命令 (execute bundle command)。 然后,它将回放所记录的捆绑包。 完成后,它将返回命令序列,继续查找其他捆绑包执行命令。 然后读取并回放第二个捆绑包,然后再继续。

5.3 代码效率

我们已经介绍了 GPU 中的控制流。 现在我们来看一下捆绑包如何简化代码。

不包含捆绑包的示例代码

我们在下图展示了一个设置管线状态和描述符表的设置阶段。 我们在接下来的图表中展示了两个对象绘制。 它们两个使用了相同的命令序列,只有常量不同。 这是典型的 D3D 11 和更旧的代码。


// Setup
pContext->SetPipelineState(pPSO);
pContext->SetRenderTargetViewTable(0, 1, FALSE, 0);
pContext->SetVertexBufferTable(0, 1);
pContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
图 14: 典型 D3D 11 代码中的设置阶段

 


// Draw 1
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
图 15: 典型 D3D 11 代码中的绘制

 


// Draw 2
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
图 16: 典型 D3D 11 代码中的绘制

 

包含捆绑包的示例


// Create bundle
pDevice->CreateCommandList(D3D12_COMMAND_LIST_TYPE_BUNDLE, pBundleAllocator, pPSO, pDescriptorHeap, &pBundle);
图 17: 捆绑包创建代码示例

 


// Record commands
pBundle->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
pBundle->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pBundle->DrawInstanced(6, 1, 0, 0);
pBundle->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pBundle->DrawInstanced(6, 1, 6, 0);
pBundle->Close();
图 18: 捆绑包记录代码示例

 

接下来,我们了解一下与 D3D 12 中的捆绑包相同的命令序列。 以下第一个调用可以创建一个捆绑包。 该操作可以发生在任何线程上。 在下一个阶段,将记录命令序列。 这些命令与我们在之前的示例中看到的命令相同。

图 17 和 18 中的代码示例与图 14-16 中的非捆绑包代码执行的任务相同。 它们展示了捆绑包如何减少所需的调用数,执行相同的任务。 GPU 仍然执行相同的命令并得出相同的结果,只是效率更高。

6.0 命令列表

通过捆绑包、PSO、描述符堆和表,您可以了解 D3D 12 如何提高 CPU 效率,并为开发人员提供更多控制。 PSO 和描述符模型支持使用捆绑包,它们依次用于常见命令和重复命令。 这种更简单的“接近完美”的方法降低了开销,并允许更高效地利用 CPU 实现“控制台 API 效率和性能”。 之前我们讨论过,PC 游戏使用线程 0 执行大部分,甚至全部任务,而其他线程处理其他操作系统或系统任务。 充分利用 PC 游戏中的多核或线程非常困难。 实现游戏多线程通常需要大量的人力和资源。 D3D 开发团队希望借助 D3D 12 改变这一点。

6.1 命令创建并行性

本文中已多次提及,延迟执行的命令看似立即执行,实际上却需要排队并延迟执行。 该函数在 D3D 12 中予以保留,但是对游戏透明。 没有立即执行的环境,因为所有数据都需要延迟执行。 线程可以并行生成一个命令,以完成馈送至 API 对象的一列命令(即命令队列)。 GPU 在命令通过命令队列提交之前将不会执行。 队列是命令的排序,命令列表是上述命令的记录。 如何区别命令列表和捆绑包? 命令列表专门进行设计并优化,因此多条线程可以同时生成命令。 命令列表使用一次后将会从内存中删除,然后该位置将会记录一个新的列表。 捆绑包专门针对一帧或多帧中常使用的渲染命令的多次使用而设计。

在 D3D 11 中,该团队尝试了命令并行性,又称延迟环境 (deferred context)。 但是,由于所需的开销,它无法达到 D3D 团队的性能目标。 进一步的分析显示,许多位置需要大量串行开销,这导致不同的 CPU 内核之间的扩展性较差。 借助 CPU 高效性设计(见第 2-5 章),D3D 12 中消除了某些串行开销。

6.2 列表和队列

想象一下,两条线程生成一个渲染命令列表。 一个序列需要在另一个序列之前运行。 如果有 hazard,一条线程可以使用一个资源作为纹理,其他的线程使用同一个资源作为渲染目标。 驱动程序需要了解渲染时的资源利用率,并解决 hazard,确保提供一致的数据。 Hazard 追踪是 D3D 11 中序列化开销之一。 在 D3D 12 中,游戏(而非驱动程序)负责 hazard 追踪。

D3D 11 允许使用多个延迟环境,但是它们需要消耗成本。 驱动程序按资源追踪状态。 因此当您开始为延迟环境记录命令时,驱动程序需要分配内存,追踪所使用的每个资源的状态。 当生成延迟环境时,将会保留该内存。 完成后,驱动程序需要将所有追踪对象从内存中删除。 这将导致不必要的开销。 游戏可以声明 API 级别能够并行生成的最大命令列表数量。 然后,驱动程序将在同一部分内存中提前安排和分配所有追踪对象。

D3D 11 中常使用动态缓冲区(环境、顶点等),但是后台有许多丢弃的内存追踪实例缓冲区。 例如,可能会有两个并行生成的命令列表,且调用了 MapDiscard。 提交列表后,驱动程序必须在第二个命令列表打补丁,以纠正丢弃的缓冲区的信息。 与之前的 hazard 一样,这也需要一些开销。 D3D 12 将重命名控制交给游戏;动态缓冲区消失。 与此同时,游戏获得精细控制。 它可以构建自己的分配程序,并可以根据需要再次划分缓冲区。 然后命令可以指向内存中明确的点。

第 3.1 部分的讨论,在 D3D 11 中,运行时和驱动程序追踪资源生命周期。 这需要大量的资源进行计数和追踪,所有内容必须在提交时解决。 在 D3D 12 中,游戏拥有资源生命周期以及对 hazard 的控制,这消除了串行开销,从而提高了 CPU 的效率。 对这四个区域进行优化后,D3D 12 的并行命令生成更加高效,从而改进了 CPU 的并行性。 另外,D3D 开发团队目标正在构建新的驱动程序模型 WDDM 2.0,计划进一步进行优化,降低名称列表提交成本。

6.3 命令队列流


图 19: 命令队列,其中包含并行生成的两个命令列表以及两个重复使用命令捆绑包。

图 19 展示了 第 5.2 部分的捆绑包图表,但是它为多线程。 左侧的命令队列是提交至 GPU 的活动的序列。 中间是两个命令列表,右侧是场景开始前记录的两个捆绑包。 首先介绍一下命令列表,它们是针对不同部分的场景并行生成,命令列表 1 完成记录,提交至命令队列,然后 GPU 开始运行它。 同时,命令队列控制流开始,命令列表 2 记录在线程 2 上。 当 GPU 运行命令列表 1 时,线程 2 完成命令列表 2 的生成,并将其提交至命令队列。 当命令队列完成命令列表 1 的运行时,将按照顺序迁移至命令列表 2. 命令队列按照 GPU 需要执行命令的顺序排序。 虽然命令列表 2 在 GPU 完成命令列表 1 的运行前生成并提交至命令队列,但是在命令列表 1 的运行完成前不会执行命令列表 2。 D3D 12 支持在整个流程中更高效地并行。

7.0 动态堆

正如之前的讨论,游戏控制资源重命名,以便能够并行生成命令。 此外,D3D 12 中的资源重命名进行了简化。 D3D 11 对缓冲区进行了分类,将其分为顶点、常量和索引缓冲区。 游戏开发人员需要借助该功能按照自己希望的方式使用保留的内存。 D3D 团队遵从了这一需求。 D3D 12 缓冲区不再分类。 缓冲区只是游戏根据需要为帧(或多个帧)分配的必要尺寸的一块内存。 我们甚至可以根据需要使用并再次划分堆分配程序,从而创建了更高效的流程。 D3D 12 还有一个标准基准。 只要游戏使用标准基准,GPU 就能够读取数据。 标准化程度越高,就越容易创建能够在 CPU、GPU 和其他硬件等变量间流畅运行的内容。 此外,内存也是持续映射,这样,CPU 便能够一直知道地址。 它支持更出色的 CPU 并行性,因为您可以部署一个线程,将 CPU 指向该内存,然后让 CPU 决定某一帧需要什么数据。


图 20: 缓冲区分配与再次分配

图 20 顶部是包含分类缓冲区的 D3D 11 风格。 其下方是由游戏控制堆的全新 D3D 12 模型。 呈现出来的是一块连续的内存,而非位于其他内存位置的不同类型的缓冲区。 此外,游戏还将根据当前或未来数帧的渲染需求来调整缓冲区的尺寸。

8.0 CPU 并行性

现在,我们将综合介绍 D3D 12 的新特性如何在 PC 上创建真正的多线程游戏。 D3D 12 支持多个任务并行。 命令列表和绑定包可提供并行命令生成和执行。 绑定包可以记录重复使用的命令,并可在一帧或多帧内在多个命令列表中多次运行它们。 命令列表可跨多条线程生成,然后馈送至命令队列以便 GPU 执行。 最后,持续映射的缓冲区将并行生成动态数据。 D3D 12 和 WDDM 2.0 都针对并行性而设计。 D3D 12 删除了过去的 D3D 版本中的限制,支持开发人员以其理想方式实现其游戏或引擎的并行性。


图 21: 典型的 D3D 11 并行性,线程 0 执行大部分的任务,其他线程较少使用。

图 21 中的图表展示了 D3D 11 中典型游戏工作负载。 应用逻辑、D3D 运行时、UMD、DXGKernel、KMD 以及当前用途在一个包含四条线程的 CPU 上工作。 线程 0 执行大部分的任务, 线程 1-3 很少使用,仅在处理应用逻辑以及 D3D 11 运行时生成渲染命令时使用。 由于 D3D 11 的设计,用户模式驱动程序甚至不会在这些线程上生成命令。


图 22: 与图 21 的工作负载相同,但使用的是 D3D 12。 任务在 4 条线程上平均分配,而且借助 D3D 12 的其他效率,完成时间显著缩短。

接下来,我们看一下使用 D3D 12 处理相同的工作负载(图 22)。 同样,应用逻辑、D3D 运行时、UMD、DXGKernel、KMD 以及当前用途在一个包含四条线程的 CPU 上工作。 但是,该工作在所有线程间平均分配,并采用了 D3D 12 的优化特性。 得益于真正的命令生成,D3D 运行时能够并行运行。 借助 WDDM 2.0 中的内核优化,内核开销显著降低。 UMD 在所有线程上运行,而不仅是线程0,从而带来真正的命令生成并行性。 最后,捆绑包取代了 D3D 11 的冗余状态更改逻辑,并降低了应用逻辑时间。


图 23: D3D 11 与 D3D 12 并行性并排比较

图 23 展示了两个版本的并排比较。 借助真正的并行性,我们看到线程 0 和线程 1-3 之间 CPU 的利用率相对平均。 线程 1-3 执行更多的任务,因此“仅 GFX”显示提升。 此外,由于线程 0 上的工作负载降低,以及新的运行时和驱动程序效率,总体 CPU 使用约减少 50%。 再来看一下应用加 GFX,在各线程之间的分配更均匀,CPU 的使用约减少 32%。

9.0 总结

D3D 12 借助降低精细度的 PSO 提供了更高的 CPU 效率。 开发人员现在无需设置和读取每个状态,而是通过一个点操作,从而降低或全面减少了硬件失配开销。 应用设置 PSO,而驱动程序处理 API 命令,并将其转换为 GPU 码。 资源绑定的新模型消除了以前由于必须使用控制流逻辑带来的混乱。

借助堆、表和捆绑包,D3D 12 在 CPU 效率和扩展性方面都得到显著提升。 线性绑定点替换为应用/游戏管理的内存对象。 频繁使用的命令可以通过捆绑包进行记录并在一帧或多帧中多次播放。 命令列表和命令队列支持在多个 CPU 线程间并行创建命令列表。 现在,大部分的任务能够在 CPU 的所有线程间平均分配,从而充分释放了第四代和第五代智能英特尔® 酷睿™ 处理器的强大潜力和性能。

Direct3D 12 是 PC 游戏技术的跨越式发展。 借助更简单的 API 以及层级更少的驱动程序,游戏开发人员能够“接近完美”。 这提高了效率和性能。 D3D 开发团队通过齐心协力的合作,创建了一个支持开发人员控制的全新 API 和驱动程序模型,该模型支持他们创建更符合他们理想并具备出色图形和性能的游戏。

参考资料和相关链接

相关英特尔链接:

企业品牌识别 http://intelbrandcenter.tagworldwide.com/frames.cfm

英特尔® 产品名称 http://www.intel.com/products/processor_number/

声明和免责条款

请参见: http://legal.intel.com/Marketing/notices+and+disclaimers.htm

关于作者

Michael Coppock致力于 PC 游戏性能和显卡领域,自 1994 年以来一直任职于英特尔。 他负责帮助游戏公司充分发掘英特尔 GPU 和 CPU。 他主要关注硬件和软件,曾负责过许多英特尔产品,最早可追溯到 486DX4 Overdrive 处理器。

 

基于英特尔® 实感™ 技术的深度感知和增强的数字摄影

0
0

下载 Depth-Perception-Intel-RealSense.pdf

通过将“真实的”人类深度感知添加至数字成像,英特尔® 实感™ 技术可 支持主流平板电脑、2 合 1 设备,以及其他支持实感技术的设备进行 3D 摄影。 这些功 能的实现基于对三个摄像头捕捉的图片传递的深度信息所进行的推断,进而生成适用于 3D 模式的数据,该模式可嵌入到 JPEG 图片文件之中。

英特尔的软件开发套件和其他开发人员工具将提取深度感知处理,以简化应用创建, 人们无需掌握有关深度处理的专业知识。 支持这种最终用户功能的设备现已面市。

本文将向软件开发人员介绍英特尔® 实感™ 技术在增强型数字摄影中执行深度感知所 采用的主要机制。

将数据解码至深度图

数字摄影中的第三个维度(由英特尔实感技术提供支持)主要捕捉场景内摄像头和不 同要素之间的相关距离。 该信息保存在深度图中,从概念上来说,这与地形图类似,图 片中的每个像素(x-y 轴)保存一个深度值(z 维度)。 支持深度绘图的图像捕捉由三 个摄像头感应器完成,如图 1 所示。 这里,800 万像素 (MP) 的主图使两个 720p 红、 绿、蓝 (RGB) 感应器捕捉的信息更加丰富。


图 1. RGB 摄像头感应器阵列生成包含深度数据的图片。

实际深度图的生成方式为:计算三个摄像头捕捉的图片中各点位置之间的差距(根据 设备上摄像头的物理隔离所导致的视差)。 场景中的各点之间的相关差距均绘制在灰度 图像上。 较小的差距由较暗的像素呈现,并且离设备较远。 较大的差距由较亮的像素呈 现,并且离设备较近。 主图的分辨率较高,可单独使用,或根据应用的需要,将其深度 信息用于模拟场景中的 3D 空间。

深度图的分辨率由分辨率最低的传感器 (720p) 所捕捉的图片大小来决定。  它 可保存为 8 位或 16 位 PNG 文件。 通常情况下,深度图文件的大小约为 JPEG 完成文 件总大小的 2 倍。  深度信息本身能够与单个 JPEG 文件中的主图一同保存。   JPEG 可兼容标准图片浏览器。 不过,深度信息不仅能够在支持英特尔实感 3D 摄像头的系统上浏览,还可检索,以用于不同的实感应用。

深度图的质量取决于多个因素,包括:

  • 摄像头与对象的距离。 1-10 米的距离可提供最佳的深 度体验,而 1-5 米的距离可提供最佳的测量体验。
  • 光照条件。光线较弱的场景需要较高的等效感光度,这 样会产生传感器噪音,并干扰距离计算;炫目、反光的表面也会对深度图造成不利影响。
  • 纹理和反差。相比于色彩不均或密集的几何纹样,各要 素之间清晰的视觉对比有助于提供可靠的深度计算结果。

硬件和用例

目前,Dell Venue 8 7840 Android 平板电脑配备了英特尔实感 R100 前置三摄像头 阵列,可用于进行深度摄影。 这款 Venue 平板电脑的厚度仅为 6 毫米(0.25 英寸), 重量仅为 300 克(0.7 磅),它采用 2.3 GHz 英特尔® 凌动™ 处理器 Z3580,以及分辨 率为 2560 x 1600 的 8.4 英寸 OLED 显示屏。

深度绘图在真实应用中的一个常见用例为捕捉图片后,在拍摄的场景中生成准确的对 象测量结果。  该用例通过深度图中的 3D 数据完成。 为了简单轻松地阐述这一概 念,英特尔创建了 “Fish Demo”,如图 2 所示,两位朋友展示他们钓到的 鱼。


图 2. 英特尔® 实感™ 技术利用实际测量纠正鱼的实相。

两位朋友一起钓鱼,其中一位钓到的鱼稍小一些(11 英寸,而他朋友钓到的鱼大一些 ,为 37 英寸),拍照时他站得离镜头更近,以使鱼在传统镜头面前显得更大。 在本演 示中,测量应用有助于通过轻拍屏幕中各条鱼的头部和尾部,获得实际的测量值,并且这 些实际测量值可重叠于图片之上。

该应用还可用于许多其他类似的案例。 父母可在数字相册中记录孩子的成长,无需在 门框上标记身高。 还可简化家具购买,只需确认展示厅内的家具如何放入自家的客厅。 如需进一步演示,可以观看 Jim Parsons 拍的电视广告,其中包含图 3 中的场景,他在 其中介绍特技自行车手如何运用英特尔实感技术提前进行测量,以精准地跨过障碍。


视频:www.youtube.com/watch?v=SFo3Mf0lsvw
图 3. Jim Parsons 推荐使用英特尔® 实感™ 技术准备自行车特技表演。

关于作者

Kyle Mabin 是 SSG 开发人员关系部门的一名技术市场推广工程师,在英特尔工作已 长达 22 年。 目前他供职于亚利桑那州钱德勒市。

了解关于英特尔® 实感技术的更多信息:
www.intel.com/software/realsens e

使用英特尔® INDE 图形性能分析器 (GPA) 分析和优化 Windows* 游戏应用

0
0

下载  Intel INDE Graphics Performance Analyzer.pdf

英特尔® INDE 图形性能分析器 (GPA) 是非常强大、灵活的工具,可帮助游戏开发人员充分利用游戏平台的潜在性能。GPA 能够可视化您应用的性能数据,帮助您了解系统级和单帧性能问题,以及实施“假设”实验,以估计优化能够带来的潜在性能提升。GPA 工具可作为英特尔® INDE 工具套件的一部分提供,或在此处单独提供。

本文描述了 GPA 工具,介绍了一个面向 Windows* 的游戏应用示例,列出了单帧性能问题,并且说明了可使用面向 DirectX* 的图形帧分析器进行优化。

图形显示器 (Graphics Monitor)

图形显示器可用于查看、用图表表示以及配置游戏内指标。 您还可使用它实施轨迹和帧捕获,以及实时进行图形管线覆盖和实验。

本文使用的游戏应用示例 (CitiRacer.exe) 是安装的一部分,用作整篇文章的示例。

下载和安装 GPA(请查看上述链接)后,单击下面显示的“分析应用” (Analyze Application),打开“分析应用” (Analyze Application) 窗口。


1. 图形显示器


2 “分析应用” (Analyze Application) 窗口可用于启动游戏

单击“运行” (Run) 按钮,开始分析该应用。该应用会自动加载和显示 FPS(每秒帧数),如下所示。按三次 CTRL + F1,查看下面显示的屏幕截图(包含不同的设置和指标)。


3. 游戏运行时,所有指标都会显示

现在,我们将对一个特定的帧进行轨迹捕获,并使用面向 DirectX 的图形帧分析器工具(随英特尔 GPA 工具包安装)对其进行分析。您可以通过按下 CTRL + SHIFT + C 或使用下面描述的系统分析器工具进行轨迹捕获。

系统分析器

系统分析器可针对您的游戏提供系统级指标,包括 CPU、GPU、API 和显卡驱动程序。具体的可用指标取决于您的平台,但是您能找到许多有用指标,它们可帮助量化应用所用系统资源的关键特征。在系统分析器中,您还可实施各种“假设”实验,在游戏性能瓶颈集中出现的高等级状态下进行诊断。

如果系统分析器发现您的游戏占用大量 CPU,可使用平台分析器对您的应用进行进一步微调。

如果系统分析器发现您的游戏占用大量 GPU,可使用面向 DirectX*/OpenGL* 的图形帧分析器深入分析单个图形帧,以找出特定的渲染问题,如纹理带宽、像素着色器性能、细节级别问题或渲染管线中的其他瓶颈。

打开作为英特尔 INDE 一部分安装的系统分析器。


4. 使用系统分析器进行连接

如果您正在分析的应用正运行在安装有英特尔 INDE 的机器上,单击“连接” (Connect);或者,如果应用正运行在远程机器上,请输入该机器的 IP 地址并单击“连接” (Connect)。

您将看到该应用出现在系统分析器中,如下所示。


5. 单击该应用以打开系统分析器

在下一个屏幕打开后,您可以拖放感兴趣的指标。在本示例中,我们监控了 CPU 总负载、GPU 持续时间、GPU 利用率和 GPU 频率指标。按下 CTRL 键,同时拖动多个指标。单击“摄像头” (Camera) 按钮,捕获占用 GPU 较多、FPS 较低的帧。捕获之后,我们将使用面向 DirectX 的图形帧分析器对其进行分析。


6. 使用系统分析器捕获帧

使用面向 DirectX* 的英特尔® INDE 图形帧分析器分析帧。

打开图形分析器后,捕获的帧将被自动加载。选择您捕获的、想要分析的最新帧,单击“打开” (Open)。


7. 使用面向 DirectX* 的图形帧分析器打开捕获的帧

现在,让我们开始分析捕获的这一特定帧。


8. 使用面向 DirectX* 的图形帧分析器打开的捕获帧

在左侧,RT0、RT1、RT2、RT3 是该帧期间生成的渲染目标。不同游戏可具有不同数量用于构建整幅帧的渲染目标,该帧具有四个渲染目标。

下图所示为该帧期间的绘制调用。它们被称为“erg” —— 一种科学计量单位。


9. X 和 Y 轴表示 GPU 持续时间的 erg 图形视图

您可以过滤显示的指标。X 和 Y 轴默认表示 GPU 持续时间。您可以修改 X 和 Y 轴指标(下拉菜单)。图示概述了每个 erg 在 GPU 上花费的时间,并展示了相关读数,可帮助我们了解可能需要优化的 erg。

右击 RT1 并选择“选择渲染目标中的 erg” (Select ergs in this render target) —— 突出显示了用于生成该渲染目标的所有 erg。您可以分析有关生成该渲染目标所需时间的指标。下图所示为渲染目标示例。


10. 选择渲染目标中所有的 erg

让我们进一步了解该渲染目标。单击 GPU 持续时间最长的 erg,查看该 erg 的详情。如果单击“几何形状” (Geometry) 选项卡,您会看到如下图所示的几何形状渲染效果。如果单击“着色器” (Shaders) 选项卡,则会显示该 erg 的顶点和片段着色器。


11. 为所选 erg 渲染的几何形状

让我们探索屏幕底部的选项卡。“已选择” (Selected) 表示您已选择的 erg。选择“突出显示” (Highlighted) 会显示突出显示的 erg,它对应着我们在右侧看到的几何图形。

“其他” (Other) 表示渲染目标中的所有其他 erg。选择“隐藏” (Hidden) 不会显示任何 erg。“仅绘制到最后所选” (Draw only to last selected) 仅会绘制我们已选的该渲染目标 erg。如果取消选择该项,那么该渲染目标的所有 erg 都会显示。


12. 如何突出显示已选的 erg


13. 突出显示的 erg 显示为蓝色

如果单击“纹理” (Texture) 选项卡,您会看到哪些纹理与该 erg 相关。所有纹理可能未用在相同 erg 中,而被上一 erg 使用。但总体而言,“纹理” (Texture) 选项卡显示了哪些纹理被使用以及它们的大小。这种方式可有效查找占用较长 GPU 持续时间的未压缩图像,以便我们可返回压缩特定纹理。


14. 与该 erg 相关的纹理

实验

现在让我们谈谈“实验” (Experiments) 选项卡。它可帮助您覆盖 GPU 实施的操作,查看最终结果。在本示例中,整幅帧的运行时间为 27 毫秒(速度为 37 FPS),如右上角方框所示(即箭头所指)。通过单击该方框,您可以在 FPS 和 GPU 持续时间之间进行切换。


15. 单击右上角的切换按钮,在 GPU 持续时间和 FPS 读数之间切换

现在,如果单击“帧概述” (Frame Overview) 选项卡,您会看到整幅帧的统计数据。“详情” (Details) 选项卡仅提供您已选 erg 的统计数据。在本示例的“帧概述” (Frame Overview) 选项卡中,您可以看到可试验的不同指标,如下图所示。


16. 提供整幅帧统计数据的“帧概述” (Frame Overview) 选项卡

让我们单击“实验” (Experiments) 选项卡,尝试完全禁用该 erg,确保它甚至不能进行渲染。


17. “实验” (Experiments) 选项卡: 禁用 erg 之前


18. “实验” (Experiments) 选项卡: 禁用 erg 之后

在“帧概述” (Frame Overview) 中,您会看到 GPU 持续时间、执行单元等方面的差异。通过观察总体性能,我们可以看到新旧值之间的显著差异。在下面的示例中,GPU 持续时间的 delta 值为 -8 毫秒,GPU 持续时间的新值约为 18 毫秒,且 GPU 持续时间的比例下降约为 35%。


19. 禁用已选 erg 之后的“帧概述” (Frame Overview) 和 GPU 持续时间差异

任何发生严重错误的 erg 标记为红色。大部分 erg 都是绘制调用。如果您选择 erg 时没有突出显示的内容,表明调用比较明确。有时,调用无需明确。如果渲染目标中的所有内容在没有明确调用的情况下进行了渲染,那么您可以尝试删除它,然后观察 GPU 持续时间是否有所改善。

“API 日志” (API Log) 选项卡显示了用于您已选 erg 的绘制调用,或用于 erg 为明确调用情况的绘制调用。

您还可按照图元数进行过滤,观察正在渲染的图元和三角形的数量。您可以将 X 轴设置为 GPU 持续时间,将 Y 轴设置为图元数,如下图所示。然后,您可以访问“几何形状” (Geometry) 选项卡,查看具有较多图元的 erg。


20. 选择 Y 轴上的图元数


21. 已选渲染目标的图元数

您还可按渲染目标进行分类,查看每个渲染目标所花费的时间。有必要查看硬件正在执行什么操作,禁用和改变一些功能,通过查看“帧概述” (Frame Overview) 和性能增量以确定性能是提高还是下降。

关于作者

Praveen Kundurthy 任职于英特尔公司的软件和服务事业部。他拥有计算机工程硕士学位。他主要专注于移动技术、Windows 和游戏开发领域。

声明

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

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

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

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

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

英特尔和 Intel 标识是英特尔在美国和/或其他国家的商标。

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

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

DirectX 12 技术白皮书

0
0

DirectX 12 技术白皮书

随着微软最新一代操作系统Windows 10的发布,其核心图形技术也升级到了最新的DirectX 12。为了帮助之前有DirectX经验的程序员尽快熟悉并上手使用DirectX 12来开发游戏,微软、英特尔和苏州蜗牛公司三方通力合作,结合了苏州蜗牛《九阳神功》PC DirectX 12版本的开发经验编写了此白皮书。希望给每一位热爱微软DirectX技术的开发者朋友带来最前沿的第一手资料。本白皮书由来自微软的资深图形专家、DirectX12项目经理 ―― 陆建业担任技术顾问,每个章节由三家公司的技术专家合作完成:

第一章:梅颖广(微软)

第二章:梅颖广(微软)

第三章:吕文伟(蜗牛)

第四章:郭胜(英特尔)、吕文伟(蜗牛)

第五章:王凯(英特尔)、吕文伟(蜗牛)

2015 年英特尔信息技术峰会的英特尔® 实感™ 实验室

0
0

2015 年英特尔信息技术峰会实验室 SFTL006 “创建一流的英特尔® 实感™ 应用”现在可从本文中的链接下载。

有 6 个实验室,其中包括 Microsoft* Visual Studio* 2013 解决方案,它涵盖用于三维分割、各种手用法、人脸跟踪和原始数据流的英特尔实感 F200 摄像头。 还有 3 个面向英特尔实感 F200 摄像头的实验室,涵盖增强摄影、场景感知/AR 和原始数据流。 另外还提供含分步说明的实验室指南。

注: 示例是使用 V5 (R3) 版本的软件开发套件进行制作的。

实验室:
原始数据流 - 英特尔® 的前置和后置实感™ 摄像头https://software.intel.com/zh-cn/articles/raw-streams
3D 背景分割 - 英特尔® 前置实感™ 摄像头https://software.intel.com/zh-cn/articles/3d-segmentation
脸部跟踪 - 英特尔® 前置实感™ 摄像头https://software.intel.com/zh-cn/articles/face-tracking-lab
手部跟踪 - 英特尔® 前置实感™ 摄像头https://software.intel.com/zh-cn/articles/realsense-hands-lab
增强摄影 - 英特尔® 后置实感™ 摄像头https://software.intel.com/zh-cn/articles/ep-lab
AR - 场景感知 - 英特尔® 后置实感™ 摄像头https://software.intel.com/zh-cn/articles/ar-scene-perception

英特尔® 实感™ 深度摄像头 R200 代码示例 – 面部追踪

0
0

下载 R200 摄像头面部追踪代码示例

简介

该 C#/XAML 代码示例展示了如何使用面向 Windows 的英特尔® 实感™ SDK* 中的面部追踪算法借助 R200 摄像头实时检测和追踪人们的面部。 该代码示例具有以下功能:

  • 以 Image 控制的形式显示 R200 RGB 摄像头的实时色彩数据流
  • 添加可追踪用户面部(基于场景中用户的外貌)的矩形控制
  • 显示 R200 摄像头检测的面部数量
  • 显示追踪到的面部的高度和宽度
  • 用 2D 坐标图(x 轴和 y 轴)显示追踪到的面部
  • 显示面部深度,以及与 R200 摄像头之间的距离
  • 启用和显示告警监控,并订阅告警事件处理程序

Face Tracking Code Sample
图 1.面部追踪代码示例

软件开发环境

该代码示例使用 Microsoft Visual Studio Community 2015 在 Windows® 10 RTM 上创建而成。 用于该示例的项目模板为Visual C#WindowsClassic Desktop

用于该项目的 SDK 和 DCM 版本分别为:

  • 英特尔® 实感™ SDK                                            v6.0.21.6598
  • 英特尔® 实感™ 景深摄像头管理器 R200              v2.0.3.39488

硬件概览

开展这项开发工作时,我们将英特尔® 实感™ 开发人员套件 (R200)用于摄像头,该摄像头借助可选磁性支架连接至标准三脚架(图 2)。

Camera Attached to Optional Magnetic Mount
图 2. 连接可选磁性支架的摄像头**

(**并非所有套件均提供该支架。)

运行 R200 代码示例时需满足以下基本硬件要求:

  • 第四代英特尔® 酷睿™ 处理器或更高版本
  • 150 MB 可用硬盘空间
  • 4GB RAM
  • 英特尔® 实感™ 摄像头 (R200)
  • 面向 R200 摄像头(或专门用于连接集成摄像头)的可用 USB3 端口

重要说明: 要求 USB3 接口支持摄像头所需的带宽。 该接口必须连接至客户端系统的专用 USB3 端口(不使用集线器)。

 

构建注意事项

  1. 该项目使用 System.Drawing.Imaging 命名空间。在新项目中手动引用该命名空间的做法是:在 Solution Explorer 中右击 References,然后选择 Add Reference…打开窗口。 接下来选择Assemblies, Framework并搜索 System.Drawing列表。 突出显示复选框,然后点击 OK按钮。
  2. 该项目使用至 libpxcclr.cs.dll (管理的 DLL)的显式路径,地址为: C:\Program Files (x86)\Intel\RSSDK\bin\x64。 如果您采用的是不同的 SDK 安装路径,引用时需要进行更改。
  3. 由于该项目引用 64 位版本的 DLL,因此您必须确保在 ProjectPropertiesPlatform target设置下注明 “x64”。
  4. 该项目包含后期生成事件指令,以确保非托管 DLL (libpxccpp2c.dll) 能够复制到输出对象目录:
    if "$(Platform)" == "x86" (copy /y "$(RSSDK_DIR)\bin\win32\libpxccpp2c.dll""$(TargetDir)" ) else ( copy /y "$(RSSDK_DIR)\bin\x64\libpxccpp2c.dll""$(TargetDir)" )

关于代码

该代码示例的结构为:

  • 配置会话、SenseManager 界面和面部模块。
  • 启动名为 Update的 worker 线程,AcquireFrame-ReleaseFrame循环在该线程内处理。
  • AcquireFrame-ReleaseFrame循环内进行着以下活动:
    • 获取图像数据。
    • 获取面部模块数据。
    • 调用渲染方法来更新 UI。
    • 释放资源。
    • 释放帧。
  • 渲染方法中所进行的活动包括:
    • 调用 ConvertBitmap 方法将位图帧转换成 BitmapImage 类型,在 WPF Image 控制中显示帧时需要进行此类转换。
    • 通过将工作委托给与 UI 线程相关的派送程序来更新 UI。
  • ShutDown方法在激发 Window_ClosingbtnExit_Click事件时调用。 ShutDown方法中所进行的活动包括:
    • 停止 Update 线程。
    • 处理对象。

立即查看

请点击下载链接,了解与该示例相关的代码和实验。

关于英特尔® 实感™ 技术

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

关于作者

Bryan Brown 是英特尔开发人员关系部门的软件应用工程师。


英特尔® 实感™ 深度摄像头代码示例 – R200 摄像头数据流

0
0

下载 R200 摄像头数据流代码示例

简介

该可下载代码示例展示了如何使用面向 Windows 的英特尔® 实感™ SDK* 捕捉和查看用 C#/XAML 编写的原始 R200 摄像头数据流。 Visual Studio* 解决方法实际上包含四个简单项目(均不到 200 行代码):

  • ColorStream– 显示 RGB 摄像头的色彩数据流
  • DepthStream– 显示深度数据流
  • IRStreams– 显示左右 IR 摄像头数据流
  • AllStreams– 在单个窗口中显示上述所有数据流(图 1)

All Streams Code Sample
1. 所有数据流代码示例

 

软件开发环境

该代码示例使用 Microsoft Visual Studio Community 2015 在 Windows® 10 RTM 上创建而成。 用于该示例的项目模板为 Visual C#WindowsClassic Desktop

用于该项目的 SDK 和 DCM 版本分别为:

  • 英特尔® 实感™                                                   SDK v6.0.21.6598
  • 英特尔® 实感™ 景深摄像头管理器 R200             v2.0.3.39488

硬件概览

为完成这项开发工作,我们使用了英特尔® 实感™ 开发人员套件 (R200),该套件包含摄像头、USB3 线缆,以及用于连接摄像头和笔记本电脑的磁吸附式支架。

Intel® RealSense™ Developer Kit (R200)
图 2. 英特尔® 实感™ 开发人员套件 (R200)

运行 R200 代码示例时需满足以下硬件要求:

  • 第四代英特尔® 酷睿™ 处理器或更高版本
  • 150 MB 可用硬盘空间
  • 4GB RAM
  • 英特尔® 实感™ 摄像头 (R200)
  • 面向 R200 摄像头(或专门用于连接集成摄像头)的可用 USB3 端口

重要说明: 要求 USB3 接口支持摄像头所需的带宽。 该接口必须连接至客户端系统的专用 USB3 端口(不使用集线器)。

 

关于代码

Visual Studio 解决方案包含四个用 C# 语言开发的 WPF 项目。 这些项目使用至 libpxcclr.cs.dll (托管 DLL)的显式路径:

C:\Program Files (x86)\Intel\RSSDK\bin\x64

请注意,如果您采用的是不同的 SDK 安装路径,引用时需要进行更改。

由于我们引用 64 位版本的 DLL,因此您也必须确保在ProjectPropertiesPlatform target设置下注明 “x64”。

如需构建并运行特定项目,请在 Solution Explorer 中右击项目名称(比如 AllStreams),然后在目录选项中选择 Set as StartUp Project

CameraStreams解决方案包含的所有项目均采用类似的结构:

  • 配置会话和 SenseManager 界面。
  • 启动名为 Update的 worker 线程,AcquireFrame-ReleaseFrame循环在该线程内处理。
  • AcquireFrame-ReleaseFrame循环内进行着以下活动:
    • 获取图像数据。
    • 调用渲染方法来更新 UI。
    • 释放资源。
    • 释放帧。
  • 渲染方法中所进行的活动包括:
    • 调用 ConvertBitmap 方法将位图帧转换成 BitmapImage 类型,在 WPF Image 控制中显示帧时需要进行此类转换。
    • 通过将工作委托给与 UI 线程相关的派送程序来更新 UI。
  • ShutDown方法在激发 Window_ClosingbtnExit_Click事件时调用。 ShutDown方法中所进行的活动包括:
    • 停止 Update 线程。
    • 处理对象。

立即查看

请点击下载链接,了解与该示例相关的代码和实验。

关于英特尔® 实感™ 技术

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

关于作者

Bryan Brown 是英特尔开发人员关系部门的软件应用工程师。

Intel® System Studio 示例与教程

0
0

Intel® System Studio 是一款全面的集成工具套件,为开发人员提供了高级系统工具和技术,旨在推动加速交付下一代可靠的节能型高性能嵌入式设备和移动设备。

我们创建了一个展示 Intel System Studio 不同功能的示例列表,另外教程也将为您介绍应用中的功能如何使用。

下载或复制全部或任意部分的示例源代码表示您同意英特尔® 示例源代码许可协议的条款

示例

示例代码名称

描述

Hello World

这是一个简单的 "Hello World"示例,说明如何在命令行和 IDE 等不同的使用模式下,通过 Intel Compiler (ICC) for Windows*、Linux* Host 和 Yocto* Linux* Target 设置环境,构建嵌入式应用。

矩阵乘法

这是一个“矩阵乘法”示例,说明 Intel® System Studio 的不同功能,如 Intel® C/C++ Compiler、Intel® MKL、Intel® VTune Amplifier 和 Intel® Cilk Plus。

系统跟踪 – 示例跟踪

示例跟踪文件 (sampleTrace.tracecpt) 包含在这个系统系统调试器 NDA 包中。 这个示例跟踪文件来自真正的 Intel® Skylake 机器,包括 BIOS、CSME、TSCU 和全球错误包示例等多个跟踪包类型。 开始使用系统跟踪工具(eclipse 插件)调试系统问题之前,这一示例跟踪文件能够帮助您更加熟悉所有用户界面操作、系统跟踪工具提供的功能,如搜索关键词、打开新字段和导出部分记录等。

处理器跟踪示例

英特尔® 处理器跟踪是基于硬件的指令级低开销代码执行记录,提供有关过去指令流和交互式调试的深入洞察。

图像模糊和旋转

本教程演示如何:

  • 借助英特尔 IPP 过滤功能实施图像框模糊
  • 借助英特尔 IPP 仿射变形功能旋转图像
  • 设置环境,构建英特尔 IPP 应用
  • 编译和链接您的图像处理应用

 

平均滤波器(图像处理)

平均滤波器是图像处理领域的常用滤波器,主要用于除去特定图像中的任意噪声。 这一示例展示了如何使用 Intel® Cilk™ Plus 提高平均滤波器的性能。 从性能调整方面探索了线程和 SIMD 解决方案,并评估了它们在加速中的相应作用。

离散余弦变换(DCT)

离散余弦变换 (DCT) 和量化是 JPEG 压缩标准中的前两个步骤。 这一示例演示了如何实施 DCT 和量化阶段,借助 Intel® Cilk™ Plus 加快运行速度。

图像处理: 褐色滤光镜

褐色色调图像是一个鲜明的棕灰颜色的单色图像,当黑白底片可用时为照片提供一个独特的色调。 这一程序将位图文件中的每个像素转换为褐色色调。 这一示例展示了如何使用 Intel® Cilk™ Plus 提高褐色滤光镜的性能。 为了证明性能提升,您将使用一个把来自彩色图像的位图文件转换为褐色色调图像的程序。

VTune Amplifier for Systems 2016 - 嵌入式 Linux 目标的性能分析

这篇文章的目的概述如何使用 Intel(R) System Studio 2016 中的 VTune Amplifier for Systems 2016 进行针对嵌入式操作系统的远程性能分析。 主机将运行 Ubuntu* Linux 14.04 LTS,目标系统是通过 Intel(R) Common Core BSP (Intel-corei7-64) 构建、在 MinnowBoard Max(有一个双核 E3825 英特尔(R) 凌动(TM) 处理器)上运行的 Yocto* Project 1.8。

教程

教程演示的标题/链接

描述

使用面向嵌入式 Linux 系统的英特尔® C++ 编译器

英特尔® C++ 编译器也称为 icc,也一种高性能编译器,支持您面向基于 Linux* 的操作系统构建和优化您的 C/C++ 应用。 嵌入式系统开发在大多数情况下都是跨平台开发。 应用开发通常需要交叉编译,而交叉编译需要一个主机编译系统和一个目标嵌入式系统。 英特尔® C++ 编译器也完全支持跨平台编译。

Intel® VTune™ Amplifier for Systems 使用模式

Intel® VTune™ Amplifier for Systems 是一种软件性能分析工具,供用户在嵌入式系统和移动系统上开发串行和多线程应用。 根据您的开发环境和目标环境,VTune Amplifier 支持面向不同目标系统的多种使用模式。 在本文中,我们将介绍 Vtune Amplifier 使用模式和不同目标系统的推荐模式。

Intel® System Studio 的信号处理使用 – 英特尔® MKL 与 英特尔® IPP

采用性能库可以很好地简化和统一数据密集型任务的计算执行流程,从而最大限度降低数据流时序问题和 heisenbug 的风险。 在文本中,我们将介绍可在 Intel® System Studio 中用于信号处理的两个库。

使用 OpenPCD* 调试 基于 Intel® Quark SoC 的目标平台

本教程将帮助您了解如何为基于 Intel Quark 的目标系统设置基于 OpenOCD* 的连接器,以及如何使用 Intel System Studio 调试系统软件。

 

Microsoft DirectX* 12 中资源绑定的性能考虑因素

0
0

作者:Confetti 首席执行官 Wolfgang Engel

随着 Windows* 10 在 7 月 29 日的发布以及第 6 代英特尔® 酷睿™ 处理器产品家族(代号 Skylake)的发布,我们现在可以更详细地探讨一下专门针对英特尔® 平台的资源绑定。

之前的文章 “Microsoft DirectX* 12 中的资源绑定简介” 介绍了 DirectX 12 中的新资源绑定方法并得出了如下结论:凭借所有这些选择,面临的挑战在于如何为目标 GPU、资源类型及其更新频率选择最理想的绑定机制。

文本介绍了如何选择不同的资源绑定机制,从而在特定的英特尔 GPU 上高效运行应用。

商业工具

若要使用 DirectX 12 开发游戏,您需要以下工具:

  • Windows 10
  • Visual Studio* 2013 或更高版本
  • Visual Studio 附带的 DirectX 12 SDK
  • 支持 DirectX 12 的 GPU 和驱动程序

概述

描述符是一个通过 GPU 特定的不透明格式描述 GPU 对象的数据块。 DirectX 12 提供了以下描述符,之前在 DirectX 11 中名为“资源视图”:

  • 常量缓冲视图 (CBV)
  • 着色器资源视图 (SRV)
  • 无序访问视图 (UAV)
  • 取样器视图 (SV)
  • 渲染目标视图 (RTV)
  • 深度模板视图 (DSV)
  • 和其他

这些描述符或资源视图可被视为 PGU 前端使用的结构(也称为块)。 描述符的大小约为 32 到 64 字节,并保存纹理尺寸、格式和布局等信息。

描述符存储在描述符堆中,后者代表内存中的结构序列。

描述符表将偏移保存到这一描述符堆中。 它将一个连续的描述符范围映射到着色器插槽,通过一个根签名使其可用。 这个根签名还可以保存根常量、根描述符和静态采样。

Descriptors, descriptor heap, descriptor tables, root signature

图 1. 描述符、描述符堆、描述符表、根签名

图 1 显示了描述符、描述符堆、描述符表和根签名之间的关系。

图 1 描述的代码如下:

// the init function sets the shader registers
// parameters: type of descriptor, num of descriptors, base shader register
// the first descriptor table entry in the root signature in
// image 1 sets shader registers t1, b1, t4, t5
// performance: order from most frequent to least frequent used
D3D12_DESCRIPTOR_RANGE Param0Ranges[3];
Param0Ranges[0].Init(D3D12_DESCRIPTOR_RANGE_SRV, 1, 1); // t1 Param0Ranges[1].Init(D3D12_DESCRIPTOR_RANGE_CBV, 1, 1); // b1 Param0Ranges[2].Init(D3D12_DESCRIPTOR_RANGE_SRV, 2, 4); // t4-t5

// the second descriptor table entry in the root signature
// in image 1 sets shader registers u0 and b2
D3D12_DESCRIPTOR_RANGE Param1Ranges[2]; Param1Ranges[0].Init(D3D12_DESCRIPTOR_RANGE_UAV, 1, 0); // u0 Param1Ranges[1].Init(D3D12_DESCRIPTOR_RANGE_CBV, 1, 2); // b2

// set the descriptor tables in the root signature
// parameters: number of descriptor ranges, descriptor ranges, visibility
// visibility to all stages allows sharing binding tables
// with all types of shaders
D3D12_ROOT_PARAMETER Param[4];
Param[0].InitAsDescriptorTable(3, Param0Ranges, D3D12_SHADER_VISIBILITY_ALL);
Param[1].InitAsDescriptorTable(2, Param1Ranges, D3D12_SHADER_VISIBILITY_ALL); // root descriptor
Param[2].InitAsShaderResourceView(1, 0); // t0
// root constants
Param[3].InitAsConstants(4, 0); // b0 (4x32-bit constants)

// writing into the command list
cmdList->SetGraphicsRootDescriptorTable(0, [srvGPUHandle]);
cmdList->SetGraphicsRootDescriptorTable(1, [uavGPUHandle]);
cmdList->SetGraphicsRootConstantBufferView(2, [srvCPUHandle]);
cmdList->SetGraphicsRoot32BitConstants(3, {1,3,3,7}, 0, 4);

上面的源代码设置了一个有两个描述符表、一个根描述符和一个根常量的根签名。 代码还表明,根常量没有间接级别,通过 SetGraphicsRoot32bitConstants 调用直接提供。 它们被直接发送到着色器寄存器中;没有实际的常量缓冲、常量缓冲描述或绑定。 根描述符只有一个间接级别,因为它们存储指向内存的指针(描述符->内存),描述符表有两个间接级别(描述符表 -> 描述符-> 内存)。

根据其类型(如 SV 和 CBV/SRV/UAV),描述符驻留在不同的描述符堆中。 这是因为,不同硬件平台上的描述符类型尺寸非常不一致。 对于每种类型的描述符堆,也应该只有一个分配的描述符堆,因为更改描述符堆成本很高。

一般而言,DirectX 12 会预先提供 100 多万个描述符的分配,这对于整个游戏级别足够了。 先前版本的 DirectX 根据自己的情况在驱动程序中处理分配,而在 DirectX 12 中,用户可以避免在运行时进行任何分配。 这意味着,一个描述符的任何初始分配都可以从性能“方程”中取出。

注:凭借第三代英特尔® 酷睿™ 处理器(代号为 Ivy Bridge)/第四代英特尔® 酷睿™ 处理器产品家族(代码为 Haswell)以及 DirectX 11 和 Windows 显示驱动程序模型 (WDDM) 1.x 版本,资源可通过一个页表映射操作,根据命令缓冲区中引用的资源动态映射到内存之中。 这样可避免复制数据。 这种动态映射很重要,因为这些架构只为 PGU 提供 2GB 内存(英特尔® 至强® 处理器 E3-1200 v4 产品家族(代号为 Broadwell)提供更大内存)。
借助 DirectX 12 和 WDDM 2.x 版本,在必要时将资源重新映射到 GPU 虚拟地址空间已经不再可能了,因为资源在创建时必须分配一个静态虚拟地址,因此资源的虚拟地址在创建后不能更改。 即使从 GPU 内存中删除资源,它也会保留其虚拟地址,以便以后再次驻留。
因此,Ivy Bridge/Haswell 中 2 GB 的总可用内存可能会成为一个限制因素。

正如以前的文章中指出的,对于一款应用来说,完全合理的结果可能是所有绑定类型的组合:根常量、根描述符、在发布绘制调用时动态收集的描述符的描述符表,以及大型描述符表的动态索引。

不同的硬件架构会在使用根常量集和根描述符集与使用描述符表之间做出不同的性能取舍。 因此,可能需要根据硬件目标平台调整根参数和描述符表之间的比率。

预期变化模式

要了解哪些类型的变化会产生额外费用,我们必须先分析游戏引擎通常如何更改数据、描述符、描述符表和根签名。

我们从常量数据开始。 大部分游戏引擎通常在“系统内存”中存储所有常量数据。 游戏引擎将更改 CPU 访问内存中的数据,而后在帧中,整块的常量数据将复制/映射到 GPU 内存中,然后通过常量缓冲视图或根描述符由 GPU 读取。

如果常量数据通过 SetGraphicsRoot32BitConstants() 作为根常量提供,根描述符中的条目不会更改,但数据可能更改。 如果常量数据先通过 CBV == 描述符,后通过描述符表提供,则描述符不会更改,但数据可能更改。

如果我们需要多个常量缓冲视图,比如对于双重或三重缓冲渲染,CBV 或描述符可能会针对根签名中的每个帧更改。

对于纹理数据,预计纹理在启动过程中在 GPU 内存中分配。 然后将创建 SV == 描述符,存储在描述符表或静态取样器中,并在根描述符中引用。 数据和描述符或静态样品不会在这之后更改。

对于更改纹理或缓冲数据等动态数据(例如含渲染本地化文本的纹理,动画顶点缓冲或程序生成的网格),我们会分配一个渲染目标或缓冲区,提供一个 RTV 或 UAV(描述符),这些描述符此后可能不会更改。 渲染目标或缓冲区中的数据可能会更改。

如果我们需要多个渲染目标或缓冲区,比如对于双重或三重缓冲渲染,描述符可能会针对根签名中的每个帧更改。

对于下面的讨论,如果进行了以下操作,那么更改对于绑定资源至关重要:

  • 更改/替换描述符表中的描述符,例如 CBV、RTV 或 上面描述的 UAV
  • 更改根签名的任何条目

Haswell/Broadwell 描述符表中的描述符

在基于 Haswell/Broadwell 的平台上,更改根签名中的一个描述符表的成本相当于更改所有描述符表。 更改一个参数意味着硬件必须复制所有当前参数。 根签名中根参数的数量是任何子集变化时硬件必须进行版本控制的数据量。

注:DirectX 12 中所有其他类型的内存,如描述符堆、缓冲资源等,不由硬件进行版本控制。

换句话说,更改所有参数的成本与更改一个参数的成本大致相同(参见 [Lauritzen] 和 [MSDN])。 不更改仍然是最省钱的方法,但没有多大作用。

注:其他硬件,比如在快/慢(溢出)根参数存储有分隔的硬件,只需对参数更改的内存区域(无论是快速区还是溢出区)进行版本控制。

在 Haswell/Broadwell 上,更改描述符表的额外成本可能来自于硬件中绑定表格的尺寸限制。

这些硬件平台上的描述符表使用“绑定表”硬件。 每个绑定表项是一个 DWORD,它可被视为描述符堆内的偏移。 64 KB 环可存储 16,384 个绑定表项。

换句话说,每个绘制调用所用的内存量取决于描述符表中索引并通过根签名引用的描述符的总数。

如果绑定表条目的 64 KB 内存用完,驱动程序将再分配 64KB 的绑定表。 这些表格之间的切换会导致管线停滞,如图 2 所示。

Pipeline stall (courtesy of Andrew Lauritzen)

图 2. 管线停滞(由 Andrew Lauritzen 提供)

例如,根签名在描述符表中引用 64 个描述符。 每 256(16,384 / 64)次绘制调用发生一次停滞。

由于更改根签名被视为一种经济的方法,因此拥有描述符表中描述符数量较少的多个根签名,比拥有描述符表中描述符数量较多的根签名要好。

因此,在 Haswell/Broadwell 上,描述符表中引用的描述符数量越少越好。

这对渲染器设计意味着什么? 如果使用描述符较少的更多描述符表,更多的根签名应增加管线状态对象 (PSO) 的数量,因为随着根签名的数量增加,PSO 的数量也需要增加,这两者之间是一对一的关系。

拥有更多的管线状态对象可能导致更多数量的着色器(在这种情况下)更加专业化,而不是提供更多功能的较长着色器(经常作为推荐)。
 

Haswell/Broadwell 上的根常量/描述符

之前我们提到,更改一个描述符表的成本和更改所有描述符表相同,此处也是如此:更改一个根常量或根描述符的成本相当于更改所有根常量或根描述符(参见 [Lauritzen])。

根常量通过“推送常量“实施,后者是一个硬件用来预填充执行单元 (EU) 寄存器的缓冲区。 由于 EU 线程启动时数值立即可用,将常量数据存储为根常量可实现性能优势,而不要通过描述符表存储它们。

根描述符也作为”推送常量“实施。 它们只是作为常量传送到着色器的指针,通过一般的内容路径读取数据。

Haswell/Broadwell 上的描述符表与根常量/描述符

我们已经介绍了描述符表、根常量和描述符的实施方式,我们便可以回答本文的主要问题:是否一个比另一个要好呢? 由于硬件中绑定表格的尺寸有限以及跨越这一限制所造成的潜在停滞,预计在 Haswell/Broadwell 硬件上更改根常量和根描述符更经济一些,因为它们不使用绑定表硬件。 对于根描述符和根常量,特别推荐使用 Haswell/Broadwell 硬件,以免数据更改每个绘制调用。

Haswell/Broadwell 上的静态取样器

正如先前文章中介绍的,可以通过 HLSL 根签名语言,在根签名或直接在着色器中定义取样器。 这些被称为静态取样器。

在 Haswell/Broadwell 硬件上,驱动程序将会将静态取样器放置在常规的取样器堆中。 这相当于手动将它们放在描述符中。 其他硬件在着色器寄存器中实施了取样器,因此静态取样器可直接编译到着色器中。

一般而言,静态取样器在很多平台上都应该具有优势,所以使用它们没有缺点。 在 Haswell/Broadwell 硬件上,通过增加描述符表中的描述符数量,我们更容易出现管线停滞,因为描述符表硬件只有 16,384 个插槽。

这是 HLSL 中的静态取样器的语法:

StaticSampler( sReg,
               [ filter = FILTER_ANISOTROPIC,
               addressU = TEXTURE_ADDRESS_WRAP,
               addressV = TEXTURE_ADDRESS_WRAP,
               addressW = TEXTURE_ADDRESS_WRAP,
               mipLODBias = 0.f,     maxAnisotropy = 16,
               comparisonFunc = COMPARISON_LESS_EQUAL,
               borderColor = STATIC_BORDER_COLOR_OPAQUE_WHITE,
               minLOD = 0.f, maxLOD = 3.402823466e+38f,
               space = 0, visibility = SHADER_VISIBILITY_ALL ])

大部分参数都是一目了然的,因为它们类似于 C++ 级别用途。 主要区别在于边框颜色:在 C++ 级别上,它提供一个完整的色彩范围,而 HLSL 级别仅限于不透明的白色/黑色和透明的黑色。 静态着色器的示例为:

StaticSampler(s4, filter=FILTER_MIN_MAG_MIP_LINEAR)

Skylake

Skylake 支持在一个描述符表中对整个描述符堆(约 100 万资源)进行动态索引。 这意味着,一个描述符表就足以索引所有可用的描述符堆内存。

相比以往的架构,没有必要在根签名中经常更改描述符表条目。 这也意味着,根签名的数量可以减少。 显然,不同材料将需要不同的着色器和不同的 PSO。 但这些 PSO 可以引用相同的根签名。

由于现代渲染引擎利用的着色器数量比 DirectX 9 和 11 少以便消除更改着色器和附加状态的成本,因此减少根签名和 PSO 的数量是有好处的,应该能够在任何硬件平台上实现性能优势。

结论

专注于 Haswell/Broadwell 和 Skylake,开发高性能 DirectX 12 应用的建议都依赖于底层平台。 对于 Haswell/Broadwell,描述符表中的描述符数量应保持低水平,而对于 Skylake,建议保持较高数量并减少描述符表的数量。

为了实现最佳性能,应用编程人员可以在启动期间检查硬件类型,然后选择最有效的资源绑定模式。 (有一个 GPU 检测示例,展示如何检测不同的英特尔硬件架构:https://software.intel.com/zh-cn/articles/gpu-detect-sample/) 资源绑定模式的选择将影响到系统的着色器如何编写。

关于作者

Wolfgang 是 Confetti 的首席执行官。 Confetti 是电子游戏和电影行业的先进实时图形研究与服务提供商的智囊团。 在与他人合作创立 Confetti 之前,Wolfgang 曾在 Rockstar 的核心技术组 RAGE 任职首席图形程序员超过 4 年。 他是 ShaderXGPU Pro系列书籍的创始人和编辑、微软最有价值专家、实时渲染相关书籍和文章的作者,以及多家网站的定期撰稿人和全球会议的定期参与者。 他参与编辑的一本书籍《ShaderX4》于 2006 年赢得了游戏开发前线名人堂奖项。 Wolfgang 还是整个行业中许多咨询委员会的成员;其中一个是微软面向 DirectX 12 的图形顾问委员会。 他还积极参与制定推动游戏行业的多项未来标准。 您还可以在 Twitter 上了解他的更多信息,帐户名为 wolfgangengel。 Confetti 的网站为 www.conffx.com

致谢

在此感谢本文的审核人员:

  • Andrew Lauritzen
  • Robin Green
  • Michal Valient
  • Dean Calver
  • Juul Joosten
  • Michal Drobot

参考资料和相关链接

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

采用英特尔® 实感™ 3D 摄像头和英特尔® Edison 的 3D 人体全身扫描系统: 我们如何做到的

0
0

撰稿人:Cappasity 公司的 Konstantin Popov

Cappasity两年来一直在开发三维扫描技术。 今年我们将要发布一款面向采用了英特尔® 实感™ 摄像头的超极本™ 设备和平板电脑的扫描软件产品: Cappasity Easy 3D Scan*。 明年我们计划创建硬件和软件解决方案,来扫描人体和物体。
 
作为英特尔® 软件创新者,在英特尔® 团队的帮助下,我们受邀展示人体扫描系统的原型,而这比我们的计划大大提前。 我们的准备时间有限,但我们仍然决定接受挑战。 在本文中,我将解释我们如何针对 8 月 18-20 日在旧金山召开的 2015 年英特尔® 信息技术峰会,创建我们的演示。

Cappasity instant 3D body scan

我们的演示基于以前开发的技术,在单一扫描系统中组合了多项深度摄像头和 RGB 摄像头(已申请美国专利)。 一般概念如下:我们校准摄像头的位置、角度和光学属性。 这种校准使我们能够合并数据,用于随后的三维模型重建。 为了拍摄三维场景,我们可以将摄像头置于场景周围,围绕场景旋转摄像头,或在摄像头前旋转场景本身。
 
我们选择了英特尔® 实感™ 摄像头,因为我们相信它是针对我们 B2B 项目的最佳性价比解决方案。 目前,我们正在开发两款使用多种英特尔® 实感™ 摄像头的原型系统:一个采用多种三维摄像头的扫描装置,用于即时扫描;一个系统,用于全身人体扫描。
 
我们在 2015 年英特尔信息技术峰会上展示了两个原型。 人体扫描原型在为期三天的大会上的运行非常成功,对莅临我们展台的许多参观者进行了扫描。

A system for full-body people scanning

现在让我们看看它是如何工作的。 我们将三款英特尔® 实感™ 摄像头连接到了一个垂直杆,以便底部摄像头对准脚部和小腿,中间的摄像头捕捉腿部和身体,最上面的摄像头拍摄头部和肩部。

Three Intel RealSense cameras attached to a vertical bar

每款摄像头均连接到一个不同的英特尔® NUC 计算机,所有计算机都与局域网相连。
 
由于这些摄像头安装在了固定杆上,我们使用旋转台来旋转被拍摄的人。 此旋转台很基本:一个 PLEXIGLAS* 垫、滚轮轴承和一个步进电机。 此旋转台通过英特尔® Edison开发板连接 PC;它通过 USB 端口接收命令。

The table is connected to the PC via an Intel® Edison board

a simple lighting system to steadily illuminate the front

我们还使用了一个简单的照明系统,以稳定照亮被拍摄人的前方。 未来,所有这些组件都将内建于单一设备中,但目前我们只是展示了该扫描系统的早期原型,因此我们需要使用商用组件装配一切。

Cappasity fullbody scan

我们的软件基于客户端-服务器架构运行,但服务器部件可在几乎任何现代 PC 上运行。 也就是说,任何执行我们计算的计算机均是我们系统中的一台“服务器”。 我们通常使用拥有英特尔® 高清显卡的普通超极本® 作为服务器。 这种服务器可发送记录命令到英特尔® NUC 计算机,再从计算机获取数据,然后分析并重建三维模型。
 
现在,让我们看看我们尝试解决的任务的一些特殊方面。 我们在 Cappasity 产品中使用的三维重建技术基于我们对 Kinect* Fusion算法的实施。 但是在这种情况下,我们的挑战要复杂得多:我们只有一个月的时间来创建算法,以重建多个来源的数据。 我们称之为“Multi-Fusion”。 在其当前状态下,此算法可将无限数量来源的数据合并到单一像素体中。 对于扫描人体,三个数据来源足矣。
 
校准是第一阶段。 Cappasity 软件允许成对校准设备。 从我们进行研发那年开始,我们便展开研究,着手为 2015 年英特尔信息技术峰会进行准备。 在短短几个星期,我们重写了校准程序,并在 Fusion 中实施了像素体支持。 以前,校准流程更多地涉及处理点云。 该系统只需在安装了摄像头后校准一次。 校准不超过 5 分钟。
 
然后我们必须拿出一种数据处理方法,经过一些研究后,我们选择进行后处理。 也就是说,首先我们记录下来自所有摄像头的数据,然后我们通过网络将数据上传到服务器,之后再开始重建流程。 所有摄像头可记录颜色和深度流。 因此,我们有完整的数据投入供进一步处理。 考虑到后处理算法在不断改善,这很方便,而且我们正在使用的那些算法是在召开 IDF 前的短短几天写完的。
 
相比英特尔® 实感™ 摄像头 (F200),英特尔® 实感™ 摄像头(长距离 R200)采用黑色和复杂材料发挥更出色。 我们在追踪方面存在一些小问题。 然而最重要的一点是,此摄像头使我们能够在规定的范围内捕捉到图像。 我们优化了 Fusion 重建算法,以便 OpenCL* 即便在英特尔® 高清显卡 5500 及更高版上也能实现出色性能。 为了消除噪音,我们在组成单一网格后,使用了 Fusion 及额外的数据分割。

Fusion plus additional data segmentation after a single mesh was composed

High resolution texture mapping algorithm

此外,我们已经完善了高分辨率纹理映射算法。 我们采用以下方法:我们以彩色摄像头的全分辨率捕捉图像,然后我们将此图像投影到网格。 我们不使用像素色彩,因为它会导致纹理质量降低。 投影方法非常复杂,难以实施,但它使我们能够同时使用内建和外部摄像头作为颜色源。 例如,我们正在开发的扫描设备使用 DSLR 摄像头运行,来获取高分辨率纹理,这对我们的电子商务客户非常重要。
 
然而,即便是采用 RGB 的内建英特尔® 实感™ 摄像头也可提供完美的色彩。 以下是映射纹理后的示例:

Sample after mapping the textures

我们正在开发一种新算法,以消除纹理转换。 我们计划发布 Easy 3D Scan 软件产品,以加以完善。
 
我们看似简单的演示是基于复杂的代码,这使我们能够与价格超过 10 万美元的昂贵扫描系统相匹敌。 英特尔® 实感™ 摄像头经济实惠,将有助于他们彻底改变 B2B 市场。
 
以下是我们人体扫描系统的优势:

  • 这是一款经济实惠的解决方案,它易于设置和操作。 只需按一下按钮即可。
  • 小尺寸:该扫描系统可以放置在零售区、娱乐中心、医疗机构、娱乐场等地方。
  • 三维模型的质量适合三维印刷和开发用于 AR/VR 应用的内容。
  • 所得三维网格的精确度适合进行测量。

 
据我们了解,英特尔® 实感™ 摄像头的潜力尚未得到全面开发。 我们相信,在 CES 2016 展会上,我们将能够展示显著改进的产品。

采用 JavaScript* 混合使用英特尔® 实感™ 摄像头与英特尔® Edison 开发板

0
0

简介

智能设备现在能够连接到我们以前一直认为不可能的事物。 而物联网 (IoT) 正使这一切变得可能,它使这些设备能够收集和交换数据。

英特尔创建了英特尔® 实感™ 技术,其中包括英特尔® 实感™ 摄像头英特尔® 实感™ SDK。 利用这一技术,您可以创建应用程序,检测手势和头部动作,分析面部数据,执行背景分割,读取深度级别,识别和合成语音等等。 想像您正在开发一款能够检测许多事物的超级传感器。 结合英特尔® Edison 套件的多种用法及输出,您可以构建实用性与娱乐性兼备的创意项目。

英特尔® 实感™ SDK 可支持流行的编程语言和框架,例如 C++、C#、Java*、JavaScript*、Processing 和 Unity*。 这意味着开发人员可使用他们熟悉的编程环境,快速上手。

Peter Ma 的文章结合使用英特尔® 实感™ 3D 摄像头与英特尔® Edison 开发平台提供了两个采用 C# 的应用程序示例。 第一个示例使用英特尔® 实感™ 摄像头作为输入,使用英特尔® Edison 开发板作为输出。 结果是,如果您将手指挡在英特尔® 实感™ 摄像头前,它会向英特尔® Edison 开发板发出开灯信号。

在第二个示例中,Ma 调换了流程顺序,使用英特尔® Edison 开发板作为输入,将英特尔® 实感™ 摄像头作为输出。 英特尔® Edison 开发板会提供来自传感器的数据进行处理,并在语音合成后通过英特尔® 实感™ 摄像头显示给我们,以提供更加人性化的数据。

Ma 的项目启发了我建立类似的项目,但是使用 JavaScript* 而不是 C#。 我使用英特尔® 实感™ SDK 来读取和发送手势数据到 node.js 服务器,然后该服务器会发送此数据至英特尔英特尔® Edison 开发板,以触发与之相连的蜂鸣器和 LED。

关于此项目

此项目使用 JavaScript* 编写而成。 如果您对仅实施基本手势感兴趣,此算法模块已包含在英特尔® 实感™ SDK 中。 它可满足您的一切所需。

硬件

要求:

采用 Arduino breakout 开发板的英特尔® Edison 开发板

英特尔® Edison 开发板是一种低成本通用计算机平台。 它使用 22 纳米双核英特尔® 凌动™系统芯片,运行速度为 500 MHz。 它支持 40 个 GPIO,并在小巧身材内集成了 1 GB LPDDR3 RAM、4 GB EMMC 存储,以及双频 Wi-Fi 和蓝牙。

该开发板运行 Linux* 内核,兼容 Arduino,因此它可以将 Arduino 实施作为 Linux* 程序运行。

 


图 1. 英特尔® Edison breakout 开发板套件。

Grove Starter Kit Plus - 英特尔® XDK 物联网版

Grove Starter Kit Plus - 英特尔® XDK 物联网版设计用于英特尔® Galileo 开发板第二代,但它通过 breakout 开发板套件,可全面兼容英特尔® Edison 开发板。

该套件包含传感器、制动器和屏蔽件,例如触摸传感器、光传感器和声音传感器,同时还包含液晶显示器,如图 2 所示。 该套件是一款价格经济的物联网项目开发解决方案。

您可在此处购买 Grove Starter Kit Plus:


图 2. Grove* Starter Kit Plus - 英特尔® XDK 物联网版

英特尔® 实感™ 摄像头

英特尔® 实感™ 摄像头构建用于支持游戏交互、娱乐、摄影和内容创作,提供有系统集成或外设两种版本。 该摄像头的最低要求包括:USB 3.0 端口、第四代智能英特尔酷睿处理器,以及 8 GB 硬盘空间。

该摄像头(如图 3 所示)是一枚全 1080p 彩色摄像头,并配有一个深度传感器,可为 PC 呈现 3D 视图效果和沉浸式体验。


图 3. 英特尔® 实感™ 摄像头

您可在此处购买完整开发人员套件,其中包括此摄像头。

GNU/Linux* 服务器

A GNU/Linux* 服务器易于开发。 您可使用旧计算机或笔记本电脑,或者您可以将此服务器放到云上。 我使用了采用 Ubuntu* 服务器的云服务器。 如果您有支持此服务器的不同 Linux* 版本,只需调整为您最喜欢的命令即可。

软件

在我们开始开发此项目之前,确保您已在系统上安装了以下软件。 您可使用此链接来下载该软件。

设置英特尔® 实感™ 摄像头

要设置英特尔® 实感™ 摄像头,连接英特尔® 实感™ 摄像头 (F200) 到 USB 3.0 端口,然后在此摄像头连接到您的电脑后,安装此驱动程序。 导航到英特尔® 实感™ SDK 位置,并在您的浏览器上打开 JavaScript* 示例:

Install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\FF_HandsViewer.html

文件打开后,进行脚本检查,查看您拥有什么平台。 在脚本检查您的平台时,单击 Web 浏览器上的链接,安装英特尔® 实感™ SDK WebApp Runtime

当安装完成后,重启 Web 浏览器,然后重新打开文件。 您可以用手挡在摄像头前,检查安装是否成功。 Web 浏览器上会显示可视化的手势数据。

手势设置

支持手势的第一个关键代码行如下所示:

{"timeStamp":130840014702794340 ,"handId": 4,"state": 0,"frameNumber":1986 ,"name":"spreadfinger"
}

这会发送 "name":"spreadfingers"至服务器,进行处理。

接下来,我们将编写一些 JavaScript* 代码,以通过节点.js 服务器,将手势数据从英特尔® 实感™ 摄像头传送到英特尔® Edison 开发板。

采用 JavaScript*

最后,我们需要进行编程。 建议您首先移动整个文件夹,因为缺省安装不允许重写原文件夹。

复制此位置的 FF_HandsViewer文件夹,并粘贴到其他地方。 该文件夹的位置是:

\install_Location\RSSDK\framework\JavaScript\FF_HandsViewer\

最后,您将能够创建自己的项目文件夹,以管理项目。

接下来,从以下位置复制 realsense.js文件,并粘贴到 FF_HandsViewer文件夹中:

Install_Location\RSSDK\framework\common\JavaScript

要简化操作,可创建一个名为 edisonconnect.js的文件。 该文件将从英特尔® 实感™ 摄像头接收手势数据,并发送至 node.js服务器。 请谨记,您需要更改套接字变量上的 IP 地址,将其导向您的 node.js服务器 IP 地址:

// var socket = io ('change this to IP node.js server');

var socket = io('http://192.168.1.9:1337');

function edisonconnect(data){
  console.log(date.name);
  socket.emit('realsense_signal',data);
}

现在最重要的一步是:命令文件 sample.js创建手势数据,并运行一个线程来拦截该手势数据,然后将它传送给 edisonconnect.js。 您不需要监视 CPU 活动,因为它在编译时不会占用太多帧速率或 RAM。

// retrieve the fired gestures
for (g = 0; g < data.firedGestureData.length; g++){
  $('#gestures_status').text('Gesture: ' + JSON.stringify(data.firedGestureData[g]));

  // add script start - passing gesture data to edisonconnect.js
	edisonconnect(data.firedGestureData[g]);
  // add script end
}

在上述功能运行并要求创建一些手势数据后,以下代码会完成 JavaScript* 程序的主要任务。 之后,您必须更换 realsense.js文件路径。

以下操作很关键:链接 socket.ioedisonconnect.js文件

<!DOCTYPE html><html><head><title> Intel&reg; RealSense&trade; SDK JavaScript* Sample</title><script src=”https://aubahn.s3.amazonaws.com/autobahnjs/latest/autobahn.min.jgz” </script><script src=”https://promisejs.org/polyfills/promise-6.1.0.js” </script><script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js” </script><script src=”https://common/JavaScript/realsense.js” </script><script src=”sample.js” </script><script src=”three.js” </script><!-- add script start --><script src=”https://cdn.socket.io/socket.io-1.3.5.js” </script><script src=”edisonconnect.js” </script><!-- add script end → <link rel=”stylesheet” type=”text/css” href=”style.css”></head><body>

该代码摘自 SDK 示例。 为了使此代码简单易用,已将其减少。 该代码用于向服务器发送手势数据。 结果是,英特尔® 实感™ SDK 成功地理解了手势,并准备好将其发送到服务器。

设置服务器

我们将使用基于 GNU/Linux* 的服务器。 我会使用 Ubuntu* server 作为操作系统,但您可以使用您熟悉的任何 GNU/Linux* 发行版。 我们将跳过安装服务器部分,因为在互联网上很容易找到相关的教程。

通过 SSH 作为根用户登录,来配置服务器。

由于服务器刚刚安装,我们需要更新资料库列表和升级服务器。 为此,我将使用在 Ubuntu 发行版中的常见命令,您可以根据正在使用的 GNU/Linux* 发行版,使用类似的命令。

# apt-get update && apt-get upgrade

一旦资料库更新完成,下一步就是安装 node.js

# apt-get install nodejs

我们还需要安装 npm Package Manager。

# apt-get install npm

最后,从 npm Package Manager 安装 socket.io express

# npm install socket.io express

请不要忘记创建文件 server.jsindex.html

# touch server.js index.html

使用您最喜欢的文本编辑器(如 vim 或 nano #)来编辑 server.js文件。

vim server.js

写下此代码:

var express   = require("express");
var app   	= express();
var port  	= 1337;

app.use(express.static(__dirname + '/'));
var io = require('socket.io').listen(app.listen(port));
console.log("Listening on port " + port);

io.on('connection', function(socket){'use strict';
  console.log('a user connected from ' + socket.request.connection.remoteAddress);

	// Check realsense signal
	socket.on('realsense_signal', function(data){
  	socket.broadcast.emit('realsense_signal',data);
  	console.log('Hand Signal: ' + data.name);
	});
  socket.on('disconnect',function(){
	console.log('user disconnected');
  });
});

var port = 1337; 意味着可用的端口已分配给端口 1337。 console.log("Listening on port " + port); 表示无论是否已收到来自 JavaScript* 的数据。 主代码为 socket.broadcast.emit('realsense_signal',data);,这意味着,数据已收到,并准备好向所有监听端口和客户端进行广播。

我们最后需要做的是运行采用此节点的 server.js文件。 如果 listening at port 1337如以下屏幕快照所示,则您已成功。
# node server.js

root@edison:~# node server.js
Listening on port 1337
events.js:85

设置英特尔® Edison 开发板

英特尔® Edison SDK 易于部署。 请参考以下文档:

现在是时候将代码放到英特尔® Edison 开发板了。 此代码可连接服务器,并监听来自此服务器的任何广播。 它类似用于其他服务器和监听步骤的代码。 如果收到任何手势数据,英特尔® Edison 开发板会触发数字引脚进行开/关。

打开英特尔® XDK 物联网版,并使用 DigitalWrite 模板,从模板创建一个新项目,如以下屏幕快照所示。

package.json中的第 9 行,添加依从关系 socket.io-client。 如果为空,则搜索找到正确的安装。 通过添加依从关系,如果英特尔® Edison 开发板中没有客户端,它将向客户端安装套接字。

"dependencies": {"socket.io-client":"latest" // add this script
}

找到名称为 main.js的文件。 您需要连接到服务器,以确保该服务器已准备好进行监听。 接下来,检查手势数据名称“spreadfingers”是否存在于该文件中,它将触发数字引脚 2 和数字引脚 8 状态至 1 / On,反之亦然。
更改所提及服务器 IP 的地址。 如果您想更改引脚,确保您同时在 mraa.Gpio(selectedpins)上更改。

var mraa  = require("mraa");

var pins2 = new mraa.Gpio(2);
	pins2.dir(mraa.DIR_OUT);

var pins8 = new mraa.Gpio(8);
	pins8.dir(mraa.DIR_OUT);

var socket = require('socket.io-client')('http://192.168.1.9:1337');

socket.on('connect', function(){
  console.log('i am connected');
});

socket.on('realsense_signal', function(data){
  console.log('Hand Signal: ' + data.name);
  if(data.name=='spreadfingers'){
	pins2.write(1);
	pins8.write(1);
  } else {
	pins2.write(0);
	pins8.write(0);
  }
});

socket.on('disconnect', function(){
  console.log('i am not connected');
});

选择安装/构建,在确保英特尔® Edison 开发板连接到您的电脑后,选择运行

现在,确保该服务器正常运行,且英特尔® 实感摄像头和英特尔® Edison 开发板已连接互联网。

总结

利用英特尔® 实感™ 技术,该项目修改了 JavaScript* 框架示例脚本,以发送捕获的手势数据至节点.js 服务器。 但是,该项目只是一个开始,未来还会有更多惊喜。

这很容易进行编码。 该服务器可向进行监听的任意套接字客户端广播手势数据。 随 socket.io-client 安装的英特尔® Edison 开发板正在监听来自服务器的广播。 鉴于此,手势数据名称 spreadfingers将触发数字引脚将状态从 1 更改到 0,反之亦然。

现在有无限的可能。 英特尔实感摄像头重量很轻,易于携带和使用。 英特尔® Edison 是一款功能强大的嵌入式 PC。 如果我们采用 JavaScript* 混合并连接英特尔® Edison 和的英特尔® 实感™ 摄像头,则很容易打包、编码和构建物联网设备。 您可以创建一些出色而实用的设备。

关于作者

Aulia Faqih - 英特尔® 软件创新者

这名英特尔® 实感™ 技术创新者位于印度尼西亚日惹,目前在日惹 UIN Sunan Kalijaga 讲学。 他喜欢玩 Galileo / Edison、Web 和所有稀奇古怪的东西。

Viewing all 154 articles
Browse latest View live




Latest Images