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

超极本™ 开发的四个方面

$
0
0

超极本™ 的功能可将个人计算提升到全新的水平。 它们的英特尔® 酷睿™ i3-i7 处理器可提供今日移动计算平台都不具备的出色功耗和性能。 超极本具有连接性、游戏、娱乐和环境感知等所有特性。 借助内置触摸屏、传感器和处理器显卡,超极本可为您提供以前不可奢想的多样使用模式。

运行 Windows 8* 的超极本为应用开发人员开启了一个充满无限可能的世界。 无论您是希望编写应用的开发新人,还是希望将应用用于超极本,本文都可为您提供利用 5 种平台特性(让其它特性都黯然失色)所需的资源。

超极本优势

卓越的触摸屏、传感器、显卡、功耗和性能是超极本脱颖而出的主要优势。 每款超极本都有其优势和特性,应用开发人员只有了解它们,才能实现最佳的使用效果。 超极本社区是面向开发人员的一站式社区,他们可在这里找到对开发用于这些设备、性能和体验得到优化的应用极为重要的资源。 从应用设计到软件开发的多个阶段,您可能需要以下部分提供的分类资源,以发挥超极本的优势。

触摸屏和传感器

与传统的输入不同,提供触摸屏应用需要重新构想应用设计,以实现最佳的用户体验。 Windows 8 提供标准的多点触控手势,后者可将新生活融入您的应用中,同时添加自然流畅的交互式元素。

超极本还配置有各种传感器,如 GPS、加速器、方向传感器、倾角计和环境光传感器 (ALS)。 游戏和娱乐应用可使用这些硬件特性,通过富于想象力的用途吸引受众的注意力。 例如,您可根据设备的方向设计一动态用户界面,或通过 ALS 提供环境感知功能以根据周围的光线调暗或调亮显示屏,或使用加速器控制游戏中的导航。 您将需要这部分的资源支持应用中的触摸屏和传感器功能。

触摸屏和传感器资源:
http://software.intel.com/en-us/articles/ultrabook-touch-and-sensors-resources/

功耗

超极本可节省功耗并将电池续航时间延长 6 小时以上。 但是,认为功耗管理只与硬件有关则是一种误导。 在确保超极本高效使用电能方面,软件的作用至关重要。 不能合理使用硬件节电特性的应用,有许多不易被察觉的耗电途径。 这部分介绍了"绿色代码"开发和软件能效标准等概念,提供了可帮助您设计和编写节电应用的工具和资源。

功效和绿色代码开发资源:
http://software.intel.com/en-us/articles/developing-power-efficient-apps-for-ultrabook/

性能

超极本具有出色的性能和移动性。这些设备非常适用于移动式玩游戏、看电影、阅读和浏览社交网络。功耗和性能息息相关,且软件在协调这两者方面可发挥关键的作用。 性能最佳的应用可确保您的设备节电,且拥有更长的电池续航时间。

超极本配置有支持英特尔® 超线程技术的第三代英特尔® 酷睿™ 处理器(代号 Ivy Bridge)。 这种多核架构支持开发人员通过并行编程利用强大的处理能力。 处理器显卡可支持负载平衡和提升性能,同时节省电能。 虽然这种想法看似简单,但设计性能最优的应用需要反复琢磨。 该部分介绍了并行优化等概念及开发多线程应用的指南,并提供了帮助应用开发人员发现和减少性能瓶颈、提高功效的资源和工具。

增强超极本™ 中应用性能的资源:
http://software.intel.com/en-us/articles/performance-enhancement-on-ivy-bridge-ultrabook/

显卡

第二代超极本采用英特尔酷睿处理器。这种微架构包括英特尔® 核心显卡,这意味着 CPU 和 GPU 都位于同一晶片上。 现在,图形和游戏应用可使用该微架构提供的功耗和性能。 与超极本触摸屏和传感器功能结合使用时,游戏和图形应用具有多样的使用模式,而这在以前是不可奢想的。 您可了解到使用 DirectX* 等各种图形管线进行游戏和显卡开发方面的最佳实践,及用于这方面的英特尔酷睿处理器架构和移植技术。 您还可使用所有的英特尔® 工具,它们可帮助您设计和开发充分利用超极本硬件的图形应用。

用于为 Ivy Bridge 超极本™ 开发图形应用的资源:
http://software.intel.com/en-us/articles/developing-graphics-applications-for-ivy-bridge-ultrabook/

借助所有这些资源,您现在可以为超极本开发令其它应用黯然失色的卓越应用!

Intel、英特尔、Ultrabook、超极本、Core、酷睿和 Intel 标识是英特尔在美国和/或其他国家的商标。
英特尔公司 2012 年版权所有。 所有权保留。
*其他的名称和品牌可能是其他所有者的资产。

  • 开发人员
  • 英特尔 AppUp® 开发人员
  • Microsoft Windows* 8
  • 超极本™
  • 入门级
  • URL

  • Windows* 8商店与桌面应用开发

    $
    0
    0

    在面向 Windows 8 和英特尔设备开发应用时,您可获得选择想要开发的 Windows 8 应用类型的独特机会。以下文章可帮助您选定一些有利 于决定需开发应用类型的资源。

    为超极本 Windows 8 桌面应用开发应用

    运行 Windows 8(面向收敛设备的强大组合)的超极本TM 支持用户运行桌面和 Windows 商店(之前称为 Metro 风格)应用。微软的新 WinRT API 为开发人员提供了创建 Windows 商店应用的工具。另外,一些 WinRT API 可用于在 Windows 8 上开发桌面应用,这意味着开发人 员可轻松将他们的传统 Windows 应用移植至 Windows 8 桌面应用。

    桌面应用可运行于 Windows 8 的 Windows 桌面模式下,这种模式看似传统的 Window 环境,然而它并不能提供全面的传统体验。一般的误 解是不能为桌面模式开发基于 Windows 8 触摸屏和传感器的新应用,或不能在 Windows 8 商店中上市出售桌面应用,这两种看法都是错误的 。您可以开发触摸屏和传感器桌面应用,您也可以将这些应用在 Windows 商店中上市销售。另外,一些硬件驱动程序和设备特性——如英特尔® 无线显示技术(英特尔® WiDi)和 OpenGL*——目前仅支持在桌面模式下运行的应用。开发人员应该知道一些设备特性和技术可能还未面向 Windows 8 UI 环境推出或开发。

    开发桌面应用的优势:

    • 传统的 Win Forms 或 MFC 应用现在被称为“桌面应用”,因为它们运行于 Desktop Windows Manager 环境中。桌面应用可以使用本地 Win32/COM API 或 .NET 样式 API。
    • Windows 8 桌面应用提供了类似于传统 Windows 笔记本电脑的 UI 和触摸功能,保持有传统 Windows 桌面应用的灵活性。除缺少开始按 钮外,Windows 8 超极本桌面的 UI 外观与传统的笔记本电脑环境极为相似。
    • 访问所有熟悉的 x86 应用和工具。超极本桌面模式支持使用硬件计数器和性能监控工具。这些特性可帮助为最新的超极本硬件优化桌面应 用。桌面应用仍可访问低级别驱动程序,并可与这些驱动程序通信以实现低延迟性能。
    • 用于 C++ 和 C# 的基本移动 API
    • 传统驱动程序和设备支持Windows 8 可为 USB 3.0 添加本地支持,从而加快数据传输并借助兼容的设备改进电源管理。桌面模式还可支持 触摸屏和传感器的设备驱动程序。
    • 本链接列出了桌面传感器和 WinRT 传感器的区别。超极本和平板电脑 Windows*8 传感器开发人员指南
    • 支持跨平台显卡 (OpenGL)。
    • 可通过英特尔 AppUp 商店分发应用
    • 应用可在 Windows 商店上市出售
    • 至 Windows 商店应用的可移植性:微软的新 WinRT API 为开发人员提供了在 Windows 8 上创建 Windows 商店应用 的工具。另外,一些 WinRT API 还可用于在 Windows 8 上开发桌面应用,这意味着开发人员可轻松将他们的传统 Windows 应用移植至 Windows 8 桌面应用。
    • 低摩擦移植/为传统 Windows 应用而优化。所有在 Win 7 上运行的应用应可以在 Win 8 上运行,无需进行任何改动。
    • 英特尔 WiDi 扩展 SDK 是一种开发包,支持应用开发人员使用英特尔 WiDi 将体验扩展至高清电视。使用该 SDK,开发人员可构建从内部 自动扫描并连接至英特尔 WiDi 电视适配器的应用。 现在,只支持 Windows 8 桌面应用(不是 Windows 商店应用。)

    桌面模式支持的语言包括:C++、C#、HTML5/JavaScript*、Unity*、Python*、QT、Flash/AIR、Java*,构建和编译的任何可在 Windows 7/8 上运行的语言。

    支持的特性:

    • NFC
      • 配置 Windows 8 的超极本支持两台超极本间进行近场通信。
    • 英特尔® 防盗技术(英特尔® AT)
      • 这款智能安全硬件可通过禁用丢失或被盗的超极本来保护您的资料,无论处于何地。当您的超极本失而复得,您可以轻松将其激活,不会 损害任何数据或数字内容。(作为选件随配有英特尔® 酷睿™ 处理器的指定超极本提供。)
    • 英特尔® 身份保护技术(英特尔® IPT)
      • 通过添加一条可信链接至您的系统、账户和喜爱的网站,帮助在线保护我们的身份和资产。(随指定系统提供。)
    • 英特尔® 快速启动技术
      • 数秒内将超极本恢复至全面运行状态。超迅捷的响应能力可使设备瞬间恢复,而且具备超低的待机功耗。
    • 英特尔®智能响应技术
      • 快速识别和存储使用最频繁的文件和应用,使它们可被迅速访问。
    • 多点触摸
      • Windows 8 桌面应用也可支持触控功能。手势(如单指或双指轻击、拖动、轻扫、旋转和夹捏/展开)可增强现有桌面应用的可用性。
    • 方向传感器
      • 对于使用 Windows Native 的桌面应用,传感器界面与 Windows 7 一样,通过一套 COM 界面提供传感器功能。使用这些界面,应用可与 传感器管理器和传感器自身进行通信。该跟踪可用传感器的传感器管理器可在传感器连接时通知您的应用,因此可供使用。它还可让您的应用 访问可用传感器。传感器本身可向您的应用通知有关新数据、传感器状态变化、传感器断开及传感器制造商规定的自定义事件等方面的信息。 与传感器管理器和传感器的通信通过 COM 界面进行。如欲与该管理器或传感器对话,您可使用传感器 API。如欲接收事件通知,您的程序必须 实施要求的 COM 回调接口。
    • 英特尔智能连接技术
      • 使电子邮件、喜爱的应用和社交网络不断进行自动更新,即使当系统处于睡眠状态(用于指定系统)。

    Windows 商店应用

    Windows 商店应用通常被称为 WinRT 应用,以前被称为 Metro 应用。这些应用利用新的 WinRT API,仅可在 Windows 8 商店中分发。微 软已提供了许多特性,并将部分触摸屏和传感器 API 整合成一套 WinRT 下的强大设备 API。基于 WinRT 的应用通过使用 Visual Studio* 2012 开发,可以 C++、C# 或 HTML5、JavaScript* 和 CSS3 等网络技术进行编写,然后打包并通过 Visual Studio IDE 分发至 Windows 商 店。下面详细了解每个方面。

    优势

    • 强大的现代 UI 和导航
      在 Windows 商店应用中,内容更为重要,因此您应该关注应用的内容。您可将这些应用设想为网站,这样 您可知道重视什么数据、如何进行数据导航。每个应用将在单个窗口中打开,且该窗口覆盖整个屏幕。然而,根据应用需求,您的应用内可具 有多个视图和布局。在各种设备和外形间,这些布局、视图及其导航都是一致的。除传统的鼠标和键盘输入外,您还可使用流畅的触摸屏手势 和钢笔/铁笔输入在应用间和应用内进行导航。
    • 活动瓷砖 (tile)
      Windows 8 中的应用为瓷砖式显示而非图标。“那又怎样?”您可能这样问。这些瓷砖并不仅仅像 Windows 7 和下 面的“大型图标”。它们类似于 Windows 7 的小工具,甚至在应用未运行于前台时也可提供实时数据。它们可自行进行更新,通过按动(使用 Windows Push 通知服务 – WNS)或拉动(使用网络服务)通知机制显示最新的内容。例如,如果您想从任意社交媒体网站在您的社交媒体应用 中进行更新,您可以这样做。如果您有股票市场应用,您可对用户可能感兴趣的股票进行更新。
      More Info: 创建瓷砖和徽标– by Microsoft
    • 在应用间搜索和共享内容
      过去,在两个应用间共享数据比较困难,因为数据格式和/或处理机制具有异构性质。然而,Windows 商店 应用相互间可使用“应用合同”的概念轻松进行对话。这些合同可避免了解每个应用的 API 和数据格式的繁琐过程。除宣布的目标合同的支持外 ,您无需了解目标应用的任何信息。应用合同支持您在不同应用间搜索和共享内容。
      More Info: 应用合同与扩展(Windows 商店应用) – by Microsoft
    • 多点触摸
      在 Windows 8 中,您应将触摸功能视为主要的用户输入机制。Windows 8 支持多点触摸用户界面事件。Windows Runtime Platform API 为响应用户输入而提供的三种主要触摸事件包括:指针 (pointer)、手势和操作事件。

      指针事件侧重于来自输入设 备的表面(屏幕)“接触”。这些设备可以是鼠标、钢笔/铁笔、单指或多指。
      手势事件重在捕捉单指事件,如轻击和按住。
      执行 夹捏/拉伸、移动/滚动、缩放和旋转等操作时,操作事件启动。
      根据这些事件的组合,Windows 8 支持以下手势。
      手势说明
      轻击它就像键盘上的按键事件。单指触摸屏幕,然后抬起。
      按住用一个手指按住屏幕。
      滑动移动手指,屏幕在相同方向移动。
      轻扫类似于滑动,但滑动的距离更短。
      转动两个或更多手指触摸屏幕,并以顺时针或逆时针圆弧旋转。
      夹捏就像用一个或更多手指挤压一样。
      拉伸两个或更多手机触摸屏幕,进行分开。
      更多信息: 响应用户交互
    • 传感器
      Windows 8 为各种传感器提供一套强大的 API。它们中有些可直接授权访问物理传感器数据(使用硬件驱动程序),有些则 通过 Sensor Fusion 概念使用虚拟传感器授权访问。例如,加速器可使用角位置调用测斜仪;加速器 + 陀螺测试仪可调用指南针。

      Windows.Devices.Sensors 命名空间主要提供与动作、方向和光相关的 API。该命名空间中的 API 支持以下传感器。
      传感器说明
      加速器捕捉 X、Y 和 Z 轴上的加速度。 加速器示例–by Microsoft
      测斜仪捕捉倾角变化。 测斜仪示例–by Microsoft
      陀螺测试仪捕捉角速度变化.陀螺测试仪示例–by Microsoft
      指南针捕捉方向变化。指南针示例–by Microsoft
      感应环境光变化。光传感器示例–by Microsoft
      方向加速器、指南针和陀螺测试仪可提供更多细粒度的运动数据。方向传感器示例–by Microsoft
      简单方向使用加速器获取设备方向,以旋转至四个象限之一它可提供面朝上、面朝下及 90、180 或 270 度旋转等运动。简单方向传感器示例–by Microsoft
      更多信息: Windows 8 支持的传感器–by Microsoft
    • GPS
      通过 Wi-Fi* 三角测定和 IP 地址数据提供 Windows 8 中的定位数据以确定位置。该传感器被称为 Windows Location Provider。这不是真正的硬件传感器。然而,如果您的设备配有物理 GPS 传感器,该位置提供程序将使用它并基于 GPS 传感器提供更多准确 的位置信息。
      More Info: 位 置感知应用指南– by Microsoft
    • NFC (近场通信)
      NFC 用于移动领域已有很长时间。 借助 Windows 8,它现在也用于笔记本电脑和超极本中。 这些 Windows 8 API 可用于桌面或 Windows 商店应用。 用于 NFC的必要APIs在 Windows.Networking.Proximity 命名空间中提供.
      更多信息:
      面向 NFC 设计系统和开发驱动程序– by Microsoft
      支持邻近度和轻击 g– by Microsoft
      邻近度示例– by Microsoft
    • 您可使用所选语言开发 Windows 商店应用。目前,可使用 Visual Basic、C#、C++ 和 JavaScript 及 HTML5 和 CSS3 开发 Windows 商 店应用。 关于每种 Windows 商店 API 上的每种语言,有许多 文档示例。 您可使用 Visual Studio 2012 IDE 开发、打包和部署这些应用至 Windows 商店。您可获取免费的 Express 版 IDE 进行开发。在开始开发任何应用前,您需要 在每台机器上以开发人员身份进行注册。
    • 从Windows 商店的分发、销售和安装
      如果拥有开发人员许可,您便可以开发应用,但至于分发,您就需要采取以下任一条途径。
      1. 1.履行所有微软商店验证流程,将它发布到 Windows 商店。您发布的应用可在 Windows 商店中销售。用户可下载并安装您的应用。安装 流程和升级由 Windows 商店处理。
      2. 2.不通过微软商店发布。一般来说,您可使用这种模式在企业内或您知道的范围内分发应用。这种概念称为侧载 (sideloading)。
    • x86 和 ARM 处理器架构支持

    注: Windows 商店应用不会向后兼容。您不能在 Windows 7 或 Windows 2012 服务器上部署商店应用。

    支持 Windows 商店应用的超极本特性:

    超极本特性矩阵

    点击该链接,您可了解到超极本特性矩阵分析了桌面模式面向各种开发语言使用的特性。
    http://software.intel.com/en-us/articles/ultrabook-feature- compatibility-matrix-for-windows-8-development

    Notices

    INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH INTEL PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN INTEL'S TERMS AND CONDITIONS OF SALE FOR SUCH PRODUCTS, INTEL ASSUMES NO LIABILITY WHATSOEVER AND INTEL DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF INTEL PRODUCTS INCLUDING LIABILITY OR WARRANTIES RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT.

    UNLESS OTHERWISE AGREED IN WRITING BY INTEL, THE INTEL PRODUCTS ARE NOT DESIGNED NOR INTENDED FOR ANY APPLICATION IN WHICH THE FAILURE OF THE INTEL PRODUCT COULD CREATE A SITUATION WHERE PERSONAL INJURY OR DEATH MAY OCCUR.

    Intel may make changes to specifications and product descriptions at any time, without notice. Designers must not rely on the absence or characteristics of any features or instructions marked "reserved" or "undefined." Intel reserves these for future definition and shall have no responsibility whatsoever for conflicts or incompatibilities arising from future changes to them. The information here is subject to change without notice. Do not finalize a design with this information.

    The products described in this document may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request.

    Contact your local Intel sales office or your distributor to obtain the latest specifications and before placing your product order.

    Copies of documents which have an order number and are referenced in this document, or other Intel literature, may be obtained by calling 1-800-548-4725, or go to: http://www.intel.com/design/literature.htm

    Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors. Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations, and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products.

    Any software source code reprinted in this document is furnished under a software license and may only be used or copied in accordance with the terms of that license.

    Intel, Ultrabook, and the Intel logo are trademarks of Intel Corporation in the US and/or other countries.

    OpenGL is a registered trademark of Silicon Graphics, Inc. in the United States and/or other countries worldwide.

    Copyright © 2012 Intel Corporation. All rights reserved.

    *Other names and brands may be claimed as the property of others.

  • Windows 8* Store
  • Desktop App Development
  • 开发人员
  • Microsoft Windows* 8
  • 超极本™
  • 入门级
  • Microsoft Windows* 8 Desktop
  • Microsoft Windows* 8 风格用户界面
  • URL
  • HTML5测试框架Jessie(Jasmine)使用方法

    $
    0
    0

    介绍

    开发Web应用过程中,测试是非常重要的环节。Jasmine(http://pivotal.github.com/jasmine/)是JavaScript行为驱动开发behavior-driven development 的框架,Jessie是Jasmine在Node中的运行器runner。本文将介绍Jessie的安装和使用,在阅读本文前,你需要对JavaScript和NodeJS(http://nodejs.org/)有所了解。

    1. 1.    下载和安装

    稳定版本的Jessie可以通过nodeJS中的npm直接安装,输入命令:

    npm install Jessie

    即可,那么在test\node_modules文件夹下会存在两个文件夹: .bin, jessie。

     

    如果需要安装开发版本,可以直接在下载源代码进行安装:

    git clone git://github.com/futuresimple/jessie.git

    npm install ./jessie

     

    1. 2.    使用方法

    进入到我们测试的根目录test目录下,输入node_modules\.bin\jessie (当然,你也可以把jessie文件放入系统的环境变量中,推荐这么做),会出现使用说明:

     

    jessie [OPTIONS] [spec dirs/files]

    spec是指安装后在test目录下的spec文件夹,如果只输入jessie spec会测试spec下的所有test case。当然,也可以知道跑指定的case,如:

    jessie spec\test.js

     

    1. 3.    测试用例写法

    下面我们来用一个例子说明具体如何将jessie投入实际开发中,在spec文件夹下新建一个testDemo_spec.js(注意:一定要加入_spec 否则jessie会不识别该文件),输入代码:

    describe("A spec", function() {

      it("is just a function, so it can contain any code", function() {

        var foo = 0;

        foo += 1;

        expect(foo).toEqual(1);

      });

     

      it("can have more than one expectation", function() {

        var foo = 0;

        foo += 1;

        expect(foo).toEqual(1);

        expect(true).toEqual(true);

      });

    });

    运行之后会看到通过2个test case:

     

    下面我们将    expect(foo).toEqual(1); 改为    expect(foo).toEqual(2); 再次运行,则会报出一个错误:

     

    这个注释说得非常清晰,在testDemo_spec.js 的13行 17列出的错误。

    更多详细的例子,大家可以到jasmine的网站去测试:http://pivotal.github.com/jasmine/

    至此,相信你已经会使用jessie和nodeJS来写自动测试脚本了。Jessie还有扩展了jasmine的功能,包括:Pending Spec, sugar, CoffeScript等,留给读者自行尝试了。

    最后,Jessie同样是TDD的理想选择。

  • 开发人员
  • 英特尔 AppUp® 开发人员
  • 合作伙伴
  • 学生
  • Android*
  • Microsoft Windows* 8
  • Tizen*
  • Tizen*
  • 超极本™
  • HTML5
  • JavaScript*
  • URL
  • 2012 Intel Cup National Collegiate Software Innovation Contest Winners

    $
    0
    0

    回到英特尔学术社区首页>> 
    访问第五届英特尔杯全国大学生软件创新大赛技术支持网站>>



    第五届"英特尔杯"全国大学生软件创新大赛获奖作品

    第五届"英特尔杯"全国大学生软件创新大赛总决赛合影 (下载高清版本


    第五届英特尔杯全国大学生软件创新大赛- 特等奖(1名)

    参赛学校:哈尔滨工业大学
    团队名称:DreamCatcher
    项目名称:剪纸吧
    项目文档 |观看视频

     

    第五届英特尔杯全国大学生软件创新大赛- 一等奖(3名)

    参赛学校:上海交通大学 
    团队名称:ADM
    项目名称:Mind Boom
    参赛学校:山东大学
    团队名称:Mouse
    项目名称:蝴蝶
    参赛学校:厦门大学
    团队名称:seasonic
    项目名称:基于 HTML5 及 Open
    Web Platform 的 2D-RPG 游戏引擎
    项目文档 |观看视频项目文档 |观看视频项目文档| 观看视频

     

    第五届英特尔杯全国大学生软件创新大赛- 二等奖(6名)

    参赛学校:上海交通大学
    团队名称:TMP
    项目名称:"涂鸦画板"应用
    参赛学校:中南大学
    团队名称:飞特尔
    项目名称:3D 模拟真人购衣助手
    参赛学校:北京航空航天大学
    团队名称:ShortyTall
    项目名称:像素の逆袭
    项目文档 |观看视频项目文档 |观看视频项目文档 |观看视频
    参赛学校:武汉大学
    团队名称:Dream_Knight
    项目名称:ArtFinger
    参赛学校:成都大学
    团队名称:四叶草
    项目名称:Plax
    参赛学校:上海交通大学
    团队名称:烫烫烫烫
    项目名称:轻影-静态互动微电影
    分享参与平台
    项目文档 |观看视频项目文档 |观看视频项目文档 |观看视频

     

  • 开发人员
  • 英特尔 AppUp® 开发人员
  • 教授
  • 学生
  • Linux*
  • Microsoft Windows* (XP, Vista, 7)
  • 超极本™
  • HTML5
  • 入门级
  • 中级
  • 云计算
  • 游戏开发
  • 地理位置
  • 触摸界面
  • 用户体验与设计
  • URL
  • 利用jsPerf优化Web应用的性能

    $
    0
    0

    在前端开发的过程中,掌握好浏览器的特性进行有针对性的性能调优是一项基本工作,jsperf.com是一个用来发布基于HTML的针对性能比较的测试用例的网站,你可以在jsPerf上在线填写和运行测试用例,得到浏览器运行测试用例的性能,学会利用jsPerf会让你的优化工作事半功倍。

    书写测试用例

    我想写一个简单的例子,验证一个算法是否更高效,这里我想到了字符串的拼接。在JS里拼接大量字符串有两种常见的方法,一是直接用加号(+)连接所有的字符串,二是用数组的join函数拼接起来。在很多书中都提到采用第二种方法的效率更高,那么我们就用jsPerf来验证一下。

    第一步,打开jsPerf(http://jsperf.com),在Test case details区域填入测试的基本信息,测试的名称(Title)、短名称(Slug),Slug用于生成将来的测试页面的地址,所以不能与现有的重复。然后你可以选择是否马上发布(Published),在Description区域填入测试的目的和方法之类的描述。

    第二步就是写测试用例了。我准备为这两个算法各写一个测试用例(test case),而这两个例子都需要一个很大的字符串数组作为输入,这时你需要在Preparation code区域准备好这个数组,在"Define setup for all tests"区域填入如下代码,会为我生成这样一个大字符串数组。下面是生成数组的代码:

    var bigArray = [];
    for (var i = 0; i < 1000; i++) {
        bigArray.push('This is a test!test!test!');
    }

    你也可以在Define teardown for all tests区域执行一些JS代码,清除运行测试用例产生的DOM结点、JS变量等等,以免影响到再次运行测试用例。

    除了准备JS代码之外,还可以在Preparation code HTML区域准备你的HTML代码、CSS样式表,以及引入第三方JS库(如jQuery等)。

    准备好数组之后,就在下面的“Code snippets to compare”中分别填入算法的简单描述(Title)和代码(Code),Async选项框是用来测试一些异步调用的性能的,我们的代码没有使用异步方法,所以不必勾选。

    直接用加号连接:

    var result = '';
    for (var i = 0, length = bigArray.length; i < length; i++) {
        result += bigArray[i];
    }

    用数组的join函数:

    var result = bigArray.join('');

    jsPerf默认只有两个测试用例,如果你要添加额外的,可以点击最下面的“Add code snippet”添加,另一个按钮“Beautify code”可以帮助你格式化代码,自动调整缩进,让代码显示更美观。

    最后,点击“Save test case”保存测试用例。浏览器会自动跳转到测试页面。点击这里(http://jsperf.com/compare-string-concat)可以直接查看完整的测试用例。

    有时在提交了测试用例之后发现有问题,可以通过在测试地址后面加/edit打开测试用例的编辑页面,添加和修改你的测试用例。

    运行测试

    好,点击“Run tests”按钮开始测试两种算法的性能。建议在运行性能测试之前,关闭无关的浏览器页面,关闭其他程序,退出不必要的后台进程,以保证结果不受其他环境的影响。你也可以通过点击个别测试用例的名字单独运行这个例子。

    读懂测试结果

    测试结果以每秒钟执行测试代码的次数(Ops/sec)显示,这个数值越大越好。除了这个结果外,同时会显示测试过程中的统计误差,以及相对最好的慢了多少(%),统计误差也是非常重要的指标,如果你写的测试用例不好,或者说后台正在运行一些其他程序,会造成统计误差过大,这时测试结果就不够可靠。

    在我们这个例子中,在我的Chrome 24浏览器上,第二种方法比第一种方法慢了62%,在Firefox 18上,第二种方法慢了70%,我们惊奇地发现第二种方法反而比第一种更慢!只有在IE8上,第一种方法慢了78%。

    jsPerf还会统计所有运行过这个测试用例的浏览器的比较结果,显示在下方的Browserscope区域,可以通过它直观地看出各个版本浏览器的性能横向和纵向比较情况。

    异步测试

    jsPerf也能支持像setTimeout这种异步的调用测试,异步测试用例需要在书写用例时选中“Async”,并且在异步调用结束后及时调用deffered.resolve()。这儿(http://jsperf.com/smallest-timeout)有一个异步测试用例的示例。

    查看别人的测试用例

    jsPerf上提供所有测试的查询,打开http://jsperf.com/browse就可以看到最近提交的测试,也可以输入关键词来进行查找。查看别人写的测试用例,可以帮助你发现更多性能调优的方法,以便用于自己的开发工作中。

  • 开发人员
  • 合作伙伴
  • 学生
  • Microsoft Windows* 8
  • Tizen*
  • 超极本™
  • HTML5
  • JavaScript*
  • 入门级
  • Microsoft Windows* 8 风格用户界面
  • 触摸界面
  • URL
  • 提升性能
  • Imagine Cup 微软“创新杯”全球学生大赛英特尔专区

    $
    0
    0

     

    Imagine Cup微软“创新杯”全球学生大赛英特尔专项奖设置与评奖规则

     

    Imagine Cup 微软“创新杯”全球学生大赛是目前全球规模最大、影响最广的学生科技大赛。2003年创办以来,至今已有来自190多个国家和地区,超过160万名学生参与了“创新杯”比赛和相关活动。Imagine Cup 2013比赛目前已经启动,中国区比赛项目针对世界公民(World Citizenship)、游戏(Games)和最佳创新(Innovation)三个比赛项目(Competitions)设立。英特尔作为2013 Imagine Cup中国区主要赞助方之一,特别为2013 Imagine Cup设立了一项英特尔特别奖及若干项英特尔鼓励奖,具体奖品与评奖规则如下。

    英特尔鼓励奖

    奖品:英特尔SSD 120G 固态硬盘一个 + 获邀在英特尔开发人员专区分享开发经验及作品介绍;

    评奖资格:在Imagine Cup 2013 中国区决赛中,采用下列任一英特尔平台及与其相对应的一种或多种英特尔技术的参赛作品将获得英特尔鼓励奖:

    1)     英特尔超极本平台:开发触屏应用,HTML5应用,运用英特尔指令集进行应用开发,使用英特尔软件开发工具(编译器、性能分析工具、函数库、Intel Media SDK等)进行应用性能优化,电源管理优化,运用英特尔无线显示技术等英特尔其它技术;

    2)     基于英特尔处理器的平板电脑平台:开发触屏应用、HTML5应用,运用感应器的应用、及运用英特尔AVX指令集的应用,运用英特尔无线显示技术等英特尔其它技术;

    3)     基于英特尔处理器的笔记本及台式机平台:运用英特尔指令集进行应用开发,使用英特尔软件开发工具(编译器、性能分析工具、函数库、Intel Media SDK等)进行应用性能优化,开发HTML5应用,运用英特尔无线显示技术等英特尔其它技术。

    英特尔特别奖(一支团队)

    奖品:三星XE500T1C-A01CN 11.6英寸平板电脑一台;

    评奖资格:在有资格获得英特尔鼓励奖的团队中,评选一支将英特尔与微软的平台和技术进行最佳融合且充分发挥英特尔平台技术优势的团队。

    英特尔技术资料

    Win8应用开发  

                                

    更多内容……

    超极本应用开发

    敬请期待更多内容……

    HTML5应用开发

    更多内容……

     

    资源链接

     

  • 开发人员
  • 学生
  • Microsoft Windows* (XP, Vista, 7)
  • Microsoft Windows* 8
  • 超极本™
  • .NET*
  • C#
  • C/C++
  • HTML5
  • Java*
  • JavaScript*
  • 入门级
  • 中级
  • 游戏开发
  • 地理位置
  • 图形
  • 英特尔® 凌动™ 处理器
  • 英特尔® 酷睿™ 处理器
  • Microsoft Windows* 8 Desktop
  • Microsoft Windows* 8 风格用户界面
  • URL
  • Imagine Cup-HTML5

    $
    0
    0

    返回“Imagine Cup 微软“创新杯”全球学生大赛英特尔专区”首页>>

    HTML5测试框架Jessie(Jasmine)使用方法

    http://software.intel.com/node/342598

    HTML5应用开发:JavaScriptiScroll教程

    http://software.intel.com/zh-cn/articles/iScroll/ 

    HTML5应用开发:JavaScript语义模板库handlebars教程

    http://software.intel.com/zh-cn/articles/HTML5Handlebars 

    HTML5应用开发神奇的动态布局库isotope教程

    http://software.intel.com/zh-cn/articles/isotope/ 

    充分使用HTML5特性进行搜索引擎优化(SEO)  

    http://software.intel.com/zh-cn/blogs/2012/08/25/html5seo/

    移动Web应用程序开发 HTML5篇系列

    http://software.intel.com/zh-cn/blogs/2012/02/20/web-html5-html5

    http://software.intel.com/zh-cn/blogs/2012/02/22/web-html5

    http://software.intel.com/zh-cn/blogs/2012/03/05/webhtml5-web-sockets-api

    HTML5应用开发:神奇的动态布局库isotope教程

    http://software.intel.com/zh-cn/articles/isotope/

    国内HTML5前端开发框架汇总

    http://software.intel.com/zh-cn/blogs/2012/12/03/html5

    HTML5测试框架Jessie(Jasmine)使用方法

    http://software.intel.com/zh-cn/articles/html5-jessiejasmine

    充分使用HTML5特性进行搜索引擎优化(SEO)

    http://software.intel.com/zh-cn/blogs/2012/08/25/html5seo

    HTML5应用开发:JavaScriptiScroll教程

    http://software.intel.com/zh-cn/articles/iScroll

    HTML5应用开发:JavaScript语义模板库handlebars教程

    http://software.intel.com/zh-cn/articles/html5handlebars

    移动Web应用程序开发 HTML5 () 多媒体API

    http://software.intel.com/zh-cn/blogs/2012/02/27/web-html5-api

  • 开发人员
  • 教授
  • 学生
  • Microsoft Windows* (XP, Vista, 7)
  • Microsoft Windows* 8
  • HTML5
  • 超极本™
  • URL
  • 优化联网待机状态下WINDOWS 8 应用程序


    超极本和平板电脑 Windows* 8 传感器开发指南

    $
    0
    0

    内容简介

    本指南为开发人员提供了面向 Desktop和Windows* 8商店应用的 Microsoft Windows* 8 传感器应用编程接口 (API) 的概述并重点介绍了 Windows 8 Desktop 模式中可用的传感器功能。 我们对可以创建交互应用的 API 进行了总结,包括采用Windows 8 的加速器、磁力计和陀螺仪等常见传感器。

    内容

    Windows 8 的编程选择

    开发人员在 Win8 上对传感器进行编程时具有多种 API 选择。 图 1 的左侧显示了新的支持触摸的应用环境,称之为“ Windows* 8商店应用”。Windows* 8商店应用唯一可以使用的 API 库是名为 WinRT 的全新 API 库。 WinRT 传感器 API 是整个 WinRT 库的一部分。 如欲了解更多详细信息,请参阅: http://msdn.microsoft.com/en-us/library/windows/apps/windows.devices.sensors.aspx

    右侧显示的是传统的 Win Forms 或 MFC 风格应用,因为它们在 Desktop Windows Manager 环境中运行,所以称之为“Desktop 应用”。 Desktop 应用可以使用本机 Win32/COM API 或 .NET 样式 API。

    在这两种情形中,这些 API 都通过一个名为 Windows Sensor Framework 的 Windows 中间件组件。 Windows Sensor Framework 定义了传感器对象模型。 不同的 API 以略有不同的方式“绑定”至相应的对象模型。


    图 1: Windows 8 中 商店应用 和 Desktop 传感器架构

    关于 Desktop 和 Windows* 8商店应用开发的不同之处将会在本文的稍后部分介绍。 为了简单起见,我们将只考虑 Desktop 应用开发。 如欲获取 Windows* 8商店应用开发的相关信息,请访问:http://msdn.microsoft.com/library/windows/apps/br211369

    传感器

    传感器的类型很多,但是我们感兴趣的是 Windows 8 需要的传感器,即加速器、陀螺仪、环境光传感器、指南针和 GPS。 Windows 8 通过对象导向的抽象来表现物理传感器。 为了操控传感器,程序员使用 API 与对象进行交互。

    您可能已经注意到下图(图 2)中显示的对象要比实际硬件多。 Windows 通过利用多个物理传感器的信息,定义了某些“逻辑传感器”对象。 这称之为“Sensor Fusion”。


    图 2: Windows 8 上支持的各种传感器

    Sensor Fusion

    物理传感器芯片具有一些固有的自然限制。 例如:

    • 加速器测量线性加速,它是对联合的相对运动和地球重力进行测量。 如果您想要了解电脑的倾角,则您必须进行一些数学运算。
    • 磁力计用于测量磁场的强度,会显示地球磁北极的位置。

    这些测量都受固有偏移问题制约,可以使用陀螺仪中的原始数据进行校正。 这两项测量(扩展)取决于电脑与地球水平面的倾斜度。

    如果您确实希望电脑的磁向与地球真正的北极一致(磁北极处于不同的位置,会随着时间的改变而移动),则需要对其进行校正。

    Sensor Fusion(图 3)正在获取多个物理传感器(尤其是加速器、陀螺仪和磁力计)的原始数据、执行数学运算校正自然传感器限制、计算更适合人类使用的数据以及将这些数据以逻辑传感器抽象形式显示出来。 应用开发人员必须实施必要的转换,以将物理传感器数据转换为抽象传感器数据。 如果您的系统设计具有一个SensorHub,融合操作将发生在微控制器固件内。 如果您的系统设计中没有 SensorHub,则融合操作必须在 IHV 和/或 OEM 提供的一个或多个设备驱动程序中完成。


    图 3: 通过组合来自多个传感器的输出进行传感器融合

    识别传感器

    如要操控传感器,您需要一个系统进行识别并指向它。 Windows Sensor Framework 定义了划分传感器的若干类别。 它还定义了若干特定的传感器类型。 表 1 列出了一些适用于您 Desktop 应用的传感器。

    表 1: 传感器类型与类别

    “All”
    BiometricElectricalEnvironmentalLightLocationMechanicalMotionOrientationScanner
    Human PresenceCapacitanceAtmospheric PressureAmbient LightBroadcastBoolean SwitchAccelerometer 1DCompass 1DBarcode
    Human Proximity*CurrentHumidityGps*Boolean Switch ArrayAccelerometer 2DCompass 2DRfid
    TouchElectrical PowerTemperatureStaticForceAccelerometer 3DCompass 3D
    InductanceWind DirectionMultivalue SwitchGyrometer 1DDevice Orientation*
    Potentio-meterWind SpeedPressureGyrometer 2DDistance 1D
    ResistanceStrainGyrometer 3DDistance 2D
    VoltageWeightMotion DetectorDistance 3D
    SpeedometerInclinometer 1D
    Inclinometer 2D
    Inclinometer 3D*

    Windows 必需的传感器类型以粗体*显示:

    • 加速器、陀螺仪、指南针和环境光是必需的“真正/物理”传感器
    • 设备定向和倾角计是必需的“虚拟/融合”传感器(注意:指南针还包括融合增强/倾斜补偿数据)
    • 如果您有一个 WWAN 广播,则 GPS 是必须的;否则 GPS 为可选
    • Human Proximity 是必需列表中的常见选项,但是现在并不是必需的。

    表 1 中所显示的类别和类型的名称都以人类可读的形式显示。 但是,在编程时,您将需要了解每种类型传感器的编程常量。 所有这些常量实际上仅仅是名为 GUID(全球唯一 ID)的编号。 以下的表 2 中是一些传感器类别和类型的样本、面向 Win32/COM 和 .NET 的常量名称以及他们基本的 GUID 值。

    表 2: 一些常见传感器的常量和唯一的全球唯一 ID (GUID)。

    标识符常量 (Win32/COM)常量 (.NET)GUID
    Category “All”SENSOR_CATEGORY_ALLSensorCategories.SensorCategoryAll{C317C286-C468-4288-9975-D4C4587C442C}
    Category BiometricSENSOR_CATEGORY_BIOMETRICSensorCategories.SensorCategoryBiometric{CA19690F-A2C7-477D-A99E-99EC6E2B5648}
    Category ElectricalSENSOR_CATEGORY_ELECTRICALSensorCategories.SensorCategoryElectrical{FB73FCD8-FC4A-483C-AC58-27B691C6BEFF}
    Category EnvironmentalSENSOR_CATEGORY_ENVIRONMENTALSensorCategories.SensorCategoryEnvironmental{323439AA-7F66-492B-BA0C-73E9AA0A65D5}
    Category LightSENSOR_CATEGORY_LIGHTSensorCategories.SensorCategoryLight{17A665C0-9063-4216-B202-5C7A255E18CE}
    Category LocationSENSOR_CATEGORY_LOCATIONSensorCategories.SensorCategoryLocation{BFA794E4-F964-4FDB-90F6-51056BFE4B44}
    Category MechanicalSENSOR_CATEGORY_MECHANICALSensorCategories.SensorCategoryMechanical{8D131D68-8EF7-4656-80B5-CCCBD93791C5}
    Category MotionSENSOR_CATEGORY_MOTIONSensorCategories.SensorCategoryMotion{CD09DAF1-3B2E-4C3D-B598-B5E5FF93FD46}
    Category OrientationSENSOR_CATEGORY_ORIENTATIONSensorCategories.SensorCategoryOrientation{9E6C04B6-96FE-4954-B726-68682A473F69}
    Category ScannerSENSOR_CATEGORY_SCANNERSensorCategories.SensorCategoryScanner{B000E77E-F5B5-420F-815D-0270ª726F270}
    Type HumanProximitySENSOR_TYPE_HUMAN_PROXIMITYSensorTypes.SensorTypeHumanProximity{5220DAE9-3179-4430-9F90-06266D2A34DE}
    Type AmbientLightSENSOR_TYPE_AMBIENT_LIGHTSensorTypes.SensorTypeAmbientLight{97F115C8-599A-4153-8894-D2D12899918A}
    Type GpsSENSOR_TYPE_LOCATION_GPSSensorTypes.SensorTypeLocationGps{{ED4CA589-327A-4FF9-A560-91DA4B48275E}
    Type Accelerometer3DSENSOR_TYPE_ACCELEROMETER_3DSensorTypes.SensorTypeAccelerometer3D{C2FB0F5F-E2D2-4C78-BCD0-352A9582819D}
    Type Gyrometer3DSENSOR_TYPE_GYROMETER_3DSensorTypes.SensorTypeGyrometer3D{09485F5A-759E-42C2-BD4B-A349B75C8643}
    Type Compass3DSENSOR_TYPE_COMPASS_3DSensorTypes.SensorTypeCompass3D{76B5CE0D-17DD-414D-93A1-E127F40BDF6E}
    Type Compass3DSENSOR_TYPE_COMPASS_3DSensorTypes.SensorTypeCompass3D{76B5CE0D-17DD-414D-93A1-E127F40BDF6E}
    Type DeviceOrientationSENSOR_TYPE_DEVICE_ORIENTATIONSensorTypes.SensorTypeDeviceOrientation{CDB5D8F7-3CFD-41C8-8542-CCE622CF5D6E}
    Type Inclinometer3DSENSOR_TYPE_INCLINOMETER_3DSensorTypes.SensorTypeInclinometer3D{B84919FB-EA85-4976-8444-6F6F5C6D31DB}

    这些都是最常用的 GUID--您还可以开发更多。 最初,您可能认为 GUID 无聊而且单调乏味,但是使用它们的一个最大原因就是: 可扩展性。 因为 API 不关注实际的传感器名称(它们仅传输 GUID),所以厂商可以为“增值”传感器创建新 GUID。

    生成新的 GUID

    微软在 Visual Studio* 中提供了一个可供任何人生成新 GUID 的工具。 图 4 显示了 Visual Studio 关于此操作的截图。 所有厂商必须要做的就是发布它们,这样无需更改 Microsoft API 或任意操作系统代码即可看到新功能了。


    图 4: 为增值传感器定义新 GUID

    使用传感器管理器对象

    通过类型询问

    您的应用寻找特定类型的传感器,如 Gyrometer3D。 传感器管理器询问电脑上显示的传感器硬件列表,然后返回绑定至该硬件的匹配对象的集合。 虽然传感器集合可能有 0 个、1 个或多个对象,但通常只有 1 个。 以下的 C++ 代码样本显示了使用传感器管理器对象的 GetSensorsByType方法搜索 3 轴陀螺仪,并在传感器集合中返回搜索结果。 注意:您必须首先 ::CoCreateInstance() the Sensor Manager Object。

    [xhtml]// Additional includes for sensors
    #include <InitGuid.h>
    #include <SensorsApi.h>
    #include <Sensors.h>
    // Create a COM interface to the SensorManager object.
    ISensorManager* pSensorManager = NULL;
    HRESULT hr = ::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pSensorManager));
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to CoCreateInstance() the SensorManager."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // Get a collection of all motion sensors on the computer.
    ISensorCollection* pSensorCollection = NULL;
    hr = pSensorManager->GetSensorsByType(SENSOR_TYPE_GYROMETER_3D, &pSensorCollection);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to find any Gyros on the computer."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    通过类别询问

    您的应用可以通过类别寻找传感器,比如运动传感器。 传感器管理器询问电脑上显示的传感器硬件列表,然后返回绑定至该硬件的运动对象的集合。 SensorCollection 中可能有 0 个、1 个或多个对象。 在大多数电脑上,集合都具有 2 个运动对象。 Accelerometer3D 和 Gyrometer3D。

    以下的 C++ 代码样本显示了使用传感器管理器对象的 GetSensorsByCategory方法搜索运动传感器,并在传感器集合中返回搜索结果。

    [xhtml]// Additional includes for sensors
    #include 
    #include 
    #include 
    // Create a COM interface to the SensorManager object.
    ISensorManager* pSensorManager = NULL;
    HRESULT hr = ::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pSensorManager));
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to CoCreateInstance() the SensorManager."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // Get a collection of all sensors on the computer.
    ISensorCollection* pSensorCollection = NULL;
    hr = pSensorManager->GetSensorsByCategory(SENSOR_CATEGORY_MOTION, &pSensorCollection);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to find any sensors on the computer."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    通过 Category ll?询问

    在实践中,适用于您应用的最有效方法就是在电脑上寻找所有传感器。 传感器管理器询问电脑上显示的传感器硬件列表,然后返回绑定至该硬件的所有对象的集合。 传感器集合中可能有 0 个、1 个或多个对象。 在大多数电脑上,集合都具有 7 个或以上对象。

    C++ 没有调用 GetAllSensors,所以您必须使用 GetSensorsByCategory(SENSOR_CATEGORY_ALL, …)替代以下样本代码中所示的内容。

    [xhtml]// Additional includes for sensors
    #include 
    #include 
    #include 
    // Create a COM interface to the SensorManager object.
    ISensorManager* pSensorManager = NULL;
    HRESULT hr = ::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&pSensorManager));
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to CoCreateInstance() the SensorManager."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // Get a collection of all 3-axis Gyros on the computer.
    ISensorCollection* pSensorCollection = NULL;
    hr = pSensorManager->GetSensorsByCategory(SENSOR_CATEGORY_ALL, &pSensorCollection);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to find any Motion sensors on the computer."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    传感器生命周期 – 进入 (Enter) 和离开 (Leave) 事件

    在 Windows 上,与大多数硬件设备一样,传感器被视为即插即用设备。 首先您可能会问,“传感器是硬连接至电脑主板的,如果它们从未插入或拔下,我们为什么要担心即插即用呢?” 这可能发生在以下情形中:

    1. 可能系统外部有基于 USB 的传感器,并将其插入 USB 端口。

    2. 在连接和断开时,可能通过不可靠的无线接口(如蓝牙)或有线接口(如以太网)连接了传感器。

    3. 如果 Windows Update 升级传感器的设备驱动程序,它们将显示为断开连接,然后再重新连接。

    4. Windows 关闭(S4 或 S5)时,传感器显示为断开连接。

    在传感器操作中,即插即用称之为 “进入”(Enter)事件,断开称之为“离开”(Leave)事件。 需要有灵活的应用来处理这两种事件。

    “进入”事件回调

    可能在传感器插入时您的应用已经处于运行状态。此时,传感器管理器会报告传感器“进入”事件。 注: 如果在您的应用开始运行时传感器已经插入,您将无法获取这些传感器的“进入”事件。 在 C++/COM 中,您必须使用 SetEventSink方法 hook 回调。 回调不仅仅是一个函数,它必须是从 ISensorManagerEvents继承并执行 IUnknown的整类函数。 ISensorManagerEvents接口必须执行回调函数:

    STDMETHODIMP OnSensorEnter(ISensor *pSensor, SensorState state);

    [xhtml]// Hook the SensorManager for any SensorEnter events.
    pSensorManagerEventClass = new SensorManagerEventSink();  // create C++ class instance
    // get the ISensorManagerEvents COM interface pointer
    HRESULT hr = pSensorManagerEventClass->QueryInterface(IID_PPV_ARGS(&pSensorManagerEvents)); 
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot query ISensorManagerEvents interface for our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // hook COM interface of our class to SensorManager eventer
    hr = pSensorManager->SetEventSink(pSensorManagerEvents); 
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot SetEventSink on SensorManager to our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    Code: Hook “进入”事件的回调

    以下是等同于“进入”回调的 C++/COM。 在该函数中,您可以从您的主循环中正常执行所有初始化步骤。 事实上,重构您的代码更为有效,这样您的主循环只调用 OnSensorEnter,模拟“进入”事件。

    [xhtml]STDMETHODIMP SensorManagerEventSink::OnSensorEnter(ISensor *pSensor, SensorState state)
    {
        // Examine the SupportsDataField for SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX.
        VARIANT_BOOL bSupported = VARIANT_FALSE;
        HRESULT hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, &bSupported);
        if (FAILED(hr))
        {
            ::MessageBox(NULL, _T("Cannot check SupportsDataField for SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX."), 
                _T("Sensor C++ Sample"), MB_OK | MB_ICONINFORMATION);
            return hr;
        }
        if (bSupported == VARIANT_FALSE)
        {
            // This is not the sensor we want.
            return -1;
        }
        ISensor *pAls = pSensor;  // It looks like an ALS, memorize it. 
        ::MessageBox(NULL, _T("Ambient Light Sensor has entered."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONINFORMATION);
        .
        .
        .
        return hr;
    }
    [/xhtml]

    代码: 回调“进入”事件

    Leave Event

    单个传感器报告何时发生“离开”事件(并非传感器管理器)。 代码与之前 hook “进入”事件的回调相同。

    [xhtml]// Hook the Sensor for any DataUpdated, Leave, or StateChanged events.
    SensorEventSink* pSensorEventClass = new SensorEventSink();  // create C++ class instance
    ISensorEvents* pSensorEvents = NULL;
    // get the ISensorEvents COM interface pointer
    HRESULT hr = pSensorEventClass->QueryInterface(IID_PPV_ARGS(&pSensorEvents)); 
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot query ISensorEvents interface for our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    hr = pSensor->SetEventSink(pSensorEvents); // hook COM interface of our class to Sensor eventer
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot SetEventSink on the Sensor to our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    代码: Hook“离开”事件的回调

    OnLeave事件处理程序以参数形式接收离开传感器的 ID。

    [xhtml]STDMETHODIMP SensorEventSink::OnLeave(REFSENSOR_ID sensorID)
    {
        HRESULT hr = S_OK;
        ::MessageBox(NULL, _T("Ambient Light Sensor has left."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONINFORMATION);
        // Perform any housekeeping tasks for the sensor that is leaving.
        // For example, if you have maintained a reference to the sensor,
        // release it now and set the pointer to NULL.
        return hr;
    }
    [/xhtml]

    代码: 回调“离开”事件

    为您的应用挑选传感器

    我们关心传感器是因为它们告知我们的内容。 不同类型的传感器向我们传达不同的信息。 微软将这些信息称之为“数据域”(Data Fields),它们集合在一个 SensorDataReport 中。 您的电脑可能(潜在)具有多种类型的传感器,会向您的应用传达您关心的信息。 您的应用可能并不关心是从哪个传感器中获得的信息,只要能够获得信息即可。

    表 3 显示了 Win32/COM 和 .NET 最常用“数据域”的常量名称。与传感器标识符一样,这些常量只是代表大量数字的人类可读的名称。 除了微软之前预定义的“well known”数据域,还提供了数据域的扩展性。 还有很多其它“well known” ID 等待您的开发。

    表 3: 数据域标识符常量

    常量 (Win32/COM)常量 (.NET)PROPERTYKEY(GUID、PID)
    SENSOR_DATA_TYPE_TIMESTAMPSensorDataTypeTimestamp{DB5E0CF2-CF1F-4C18-B46C-D86011D62150},2
    SENSOR_DATA_TYPE_LIGHT_LEVEL_LUXSensorDataTypeLightLevelLux{E4C77CE2-DCB7-46E9-8439-4FEC548833A6},2
    SENSOR_DATA_TYPE_ACCELERATION_X_GSensorDataTypeAccelerationXG{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},2
    SENSOR_DATA_TYPE_ACCELERATION_Y_GSensorDataTypeAccelerationYG{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},3
    SENSOR_DATA_TYPE_ACCELERATION_Z_GSensorDataTypeAccelerationZG{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},4
    SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DEG
    REES_PER_SECOND
    SensorDataTypeAngularVelocityXDegreesPerSecond{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},10
    SENSOR_DATA_TYPE_ANGULAR_VELOCITY_X_DE
    GREES_PER_SECOND
    SensorDataTypeAngularVelocityXDegreesPerSecond{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},10
    SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DE
    GREES_PER_SECOND
    SensorDataTypeAngularVelocityYDegreesPerSecond{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},11
    SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Y_DE
    GREES_PER_SECOND
    SensorDataTypeAngularVelocityYDegreesPerSecond{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},11
    SENSOR_DATA_TYPE_ANGULAR_VELOCITY_Z_DE
    GREES_PER_SECOND
    SensorDataTypeAngularVelocityZDegreesPerSecond{3F8A69A2-07C5-4E48-A965-CD797AAB56D5},12
    SENSOR_DATA_TYPE_TILT_X_DEGREESSensorDataTypeTiltXDegrees{1637D8A2-4248-4275-865D-558DE84AEDFD},2
    SENSOR_DATA_TYPE_TILT_Y_DEGREESSensorDataTypeTiltYDegrees{1637D8A2-4248-4275-865D-558DE84AEDFD},3
    SENSOR_DATA_TYPE_TILT_Z_DEGREESSensorDataTypeTiltZDegrees{1637D8A2-4248-4275-865D-558DE84AEDFD},4
    SENSOR_DATA_TYPE_MAGNETIC_HEADING_COM
    PENSATED_MAGNETIC_NORTH_DEGREES
    SensorDataTypeMagneticHeadingCompensated
    TrueNorthDegrees
    {1637D8A2-4248-4275-865D-558DE84AEDFD},11
    SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH
    _X_MILLIGAUSS
    SensorDataTypeMagneticFieldStrengthXMilligauss{1637D8A2-4248-4275-865D-558DE84AEDFD},19
    SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH
    _Y_MILLIGAUSS
    SensorDataTypeMagneticFieldStrengthYMilligauss{1637D8A2-4248-4275-865D-558DE84AEDFD},20
    SENSOR_DATA_TYPE_MAGNETIC_FIELD_STRENGTH
    _Z_MILLIGAUSS
    SensorDataTypeMagneticFieldStrengthZMilligauss{1637D8A2-4248-4275-865D-558DE84AEDFD},21
    SENSOR_DATA_TYPE_QUATERNIONSensorDataTypeQuaternion{1637D8A2-4248-4275-865D-558DE84AEDFD},17
    SENSOR_DATA_TYPE_QUATERNIONSensorDataTypeQuaternion{1637D8A2-4248-4275-865D-558DE84AEDFD},17
    SENSOR_DATA_TYPE_ROTATION_MATRIXSensorDataTypeRotationMatrix{1637D8A2-4248-4275-865D-558DE84AEDFD},16
    SENSOR_DATA_TYPE_LATITUDE_DEGREESSensorDataTypeLatitudeDegrees{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},2
    SENSOR_DATA_TYPE_LONGITUDE_DEGREESSensorDataTypeLongitudeDegrees{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},3
    SENSOR_DATA_TYPE_ALTITUDE_ELLIPSOID_METERSSensorDataTypeAltitudeEllipsoidMeters{055C74D8-CA6F-47D6-95C6-1ED3637A0FF4},5

    使得数据域标识符与传感器 ID 不同的原因是使用了名为 PROPERTYKEY 的数据类型。 一个 PROPERTYKEY 包括一个 GUID(类似于传感器的 GUID)以及一个名为“PID”的额外编号(属性 ID)。 您可能会注意到 PROPERTYKEY 的 GUID 部分对于同一类别的传感器是通用的。 数据域的所有值都具有本机数据类型,例如Boolean、unsigned char、int、float、double 等。

    在 Win32/COM 中,数据域的值存储在名为 PROPVARIANT 的多态数据类型中。 在 .NET 中,有一个名为“对象”(object) 的 CLR(通用语言运行时)数据类型执行相同的操作。 您必须询问和/或将多态数据类型转换为“expected”/“documented”数据类型。

    使用传感器的 SupportsDataField()方法检查传感器,获取感兴趣的数据域。 这是我们选择传感器时经常使用的编程术语。 根据您应用的使用模式,您可能仅需一个数据域子集,而并非全部。 选择您想要的传感器,基于它们是否支持您所需的数据域。 注意:您还需要使用类型转换从基本类传感器分配子类成员变量。

    [xhtml]ISensor* m_pAls;
    ISensor* m_pAccel;
    ISensor* m_pTilt;
    // Cycle through the collection looking for sensors we care about.
    ULONG ulCount = 0;
    HRESULT hr = pSensorCollection->GetCount(&ulCount);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to get count of sensors on the computer."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    for (int i = 0; i < (int)ulCount; i++)
    {
        hr = pSensorCollection->GetAt(i, &pSensor);
        if (SUCCEEDED(hr))
        {
            VARIANT_BOOL bSupported = VARIANT_FALSE;
            hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, &bSupported);
            if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAls = pSensor;
            hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_ACCELERATION_Z_G, &bSupported);
            if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pAccel = pSensor;
            hr = pSensor->SupportsDataField(SENSOR_DATA_TYPE_TILT_Z_DEGREES, &bSupported);
            if (SUCCEEDED(hr) && (bSupported == VARIANT_TRUE)) m_pTilt = pSensor;
            .
            .
            .
        }
    }
    [/xhtml]

    代码: 使用传感器中的 SupportsDataField() 方法查看支持的数据域。

    传感器属性

    除了数据域,传感器还具有可用于辨识和配置的属性。 表 4 显示了最常用的属性。 与数据域类似,属性也有 Win32/COM 和 .NET 使用的常量名称,而且这些常量确实是下面的 PROPERTYKEY 数字。 属性可通过厂商扩展,还具有 PROPVARIANT 多态数据类型。 不同于数据域的只读特性,属性具有读/写能力。 它取决于单个传感器是否拒绝写入尝试。 作为一名应用开发人员,您需要执行写-读-验证,因为尝试写入失败时不会发生异常情况。

    表 4: 常用的传感器属性和 PID

    标识 (Win32/COM)标识 (.NET)PROPERTYKEY(GUID、PID)
    SENSOR_PROPERTY_PERSISTENT_UNIQUE_IDSensorID{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},5
    WPD_FUNCTIONAL_OBJECT_CATEGORYCategoryID{8F052D93-ABCA-4FC5-A5AC-B01DF4DBE598},2
    SENSOR_PROPERTY_TYPETypeID{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},2
    SENSOR_PROPERTY_STATEState{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},3
    SENSOR_PROPERTY_MANUFACTURERSensorManufacturer7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},6
    SENSOR_PROPERTY_MODELSensorModel{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},7
    SENSOR_PROPERTY_SERIAL_NUMBERSensorSerialNumber(7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},8
    SENSOR_PROPERTY_FRIENDLY_NAMEFriendlyName{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},9
    SENSOR_PROPERTY_DESCRIPTIONSensorDescription{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},10
    SENSOR_PROPERTY_MIN_REPORT_INTERVALMinReportInterval{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},12
    SENSOR_PROPERTY_CONNECTION_TYPESensorConnectionType{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},11
    SENSOR_PROPERTY_DEVICE_IDSensorDevicePath{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},15
    SENSOR_PROPERTY_RANGE_MAXIMUMSensorRangeMaximum{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},21
    SENSOR_PROPERTY_RANGE_MINIMUMSensorRangeMinimum{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},20
    SENSOR_PROPERTY_ACCURACYSensorAccuracy{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},17
    SENSOR_PROPERTY_RESOLUTIONSensorResolution{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},18


    Configuration(Win32/COM)Configuration(.NET)PROPERTYKEY (GUID,PID)
    SENSOR_PROPERTY_CURRENT_REPORT_INTERVALReportInterval{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},13
    SENSOR_PROPERTY_CHANGE_SENSITIVITYChangeSensitivity{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},14
    SENSOR_PROPERTY_REPORTING_STATEReportingState{7F8383EC-D3EC-495C-A8CF-B8BBE85C2920},27

    设置传感器敏感度

    敏感度设置可能是最有用的传感器属性。 可用于分配控制或过滤发送至主机计算机的 SensorDataReports 数量的阈值。 流量可通过这种方式得以降低: 仅发出那些真正会干扰主机 CPU 的 DataUpdated 事件。 微软定义这一敏感度属性数据类型的方式有稍许不同。 它是一个容器类型,在 Win32/COM中称之为“IPortableDeviceValues”,在 .NET 中称之为“ensorPortableDeviceValues”。 容器中包含一个元组集合,其中每个都是一个数据域 PROPERTYKEY,随后是该数据域的敏感度值。 敏感度通常使用与匹配数据相同的测量单位和数据类型。

    // Configure sensitivity
    // create an IPortableDeviceValues container for holding the <Data Field, Sensitivity> tuples.
    IPortableDeviceValues* pInSensitivityValues;
    hr = ::CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pInSensitivityValues));
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to CoCreateInstance() a PortableDeviceValues collection."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // fill in IPortableDeviceValues container contents here: 0.1 G sensitivity in each of X, Y, and Z axes.
    PROPVARIANT pv;
    PropVariantInit(&pv);
    pv.vt = VT_R8; // COM type for (double)
    pv.dblVal = (double)0.1;
    pInSensitivityValues->SetValue(SENSOR_DATA_TYPE_ACCELERATION_X_G, &pv);
    pInSensitivityValues->SetValue(SENSOR_DATA_TYPE_ACCELERATION_Y_G, &pv);
    pInSensitivityValues->SetValue(SENSOR_DATA_TYPE_ACCELERATION_Z_G, &pv);
    // create an IPortableDeviceValues container for holding the <SENSOR_PROPERTY_CHANGE_SENSITIVITY, pInSensitivityValues> tuple.
    IPortableDeviceValues* pInValues;
    hr = ::CoCreateInstance(CLSID_PortableDeviceValues, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pInValues));
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to CoCreateInstance() a PortableDeviceValues collection."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // fill it in
    pInValues->SetIPortableDeviceValuesValue(SENSOR_PROPERTY_CHANGE_SENSITIVITY, pInSensitivityValues);
    // now actually set the sensitivity
    IPortableDeviceValues* pOutValues;
    hr = pAls->SetProperties(pInValues, &pOutValues);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to SetProperties() for Sensitivity."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // check to see if any of the setting requests failed
    DWORD dwCount = 0;
    hr = pOutValues->GetCount(&dwCount);
    if (FAILED(hr) || (dwCount > 0))
    {
        ::MessageBox(NULL, _T("Failed to set one-or-more Sensitivity values."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    PropVariantClear(&pv);
    

    申请传感器权限

    最终用户可能会考虑传感器提供的信息是敏感的,即个人可识别身份信息 (PII)。 计算机的位置等数据域(如纬度和经度)可以用于追踪用户。 因此在使用前,Windows 强制应用获取最终用户权限,以访问传感器。 如果需要,使用传感器的“State”属性以及 SensorManager 的 RequestPermissions()方法。

    RequestPermissions()方法将一组传感器作为一个参数,所以如果需要,可以一次为多个传感器申请权限。 C++/COM 代码显示如下。 注意:您必须向 RequestPermissions()提供一个 (ISensorCollection *) 参数。

    [xhtml]// Get the sensor's state
    SensorState state = SENSOR_STATE_ERROR;
    HRESULT hr = pSensor->GetState(&state);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Unable to get sensor state."), _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    // Check for access permissions, request permission if necessary.
    if (state == SENSOR_STATE_ACCESS_DENIED)
    {
        // Make a SensorCollection with only the sensors we want to get permission to access.
        ISensorCollection *pSensorCollection = NULL;
        hr = ::CoCreateInstance(CLSID_SensorCollection, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pSensorCollection));
        if (FAILED(hr))
        {
            ::MessageBox(NULL, _T("Unable to CoCreateInstance() a SensorCollection."), 
                _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
            return -1;
        }
        pSensorCollection->Clear();
        pSensorCollection->Add(pAls); // add 1 or more sensors to request permission for...
        // Have the SensorManager prompt the end-user for permission.
        hr = m_pSensorManager->RequestPermissions(NULL, pSensorCollection, TRUE);
        if (FAILED(hr))
        {
            ::MessageBox(NULL, _T("No permission to access sensors that we care about."), 
                _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
            return -1;
        }
    }
    [/xhtml]

    传感器数据更新

    传感器通过发出名为 DataUpdated 的事件来报告数据。 实际的数据域在 SensorDataReport 内打包,被传输至所有附带的 DataUpdated 事件处理程序中。 您的应用通过将 hook 一个回调处理程序至传感器的 DataUpdated 事件获取 SensorDataReport。 事件发生在 Windows Sensor Framework 线程,该线程与用于更新您应用 GUI 的消息泵线程不同。 因此,您将需要将 SensorDataReport 从事件处理程序 (Als_DataUpdate) 传至可以在 GUI 线程环境中执行的单独的处理程序 (Als_UpdateGUI)。 在 .NET 中,此类处理程序称之为委托函数。

    以下示例显示了委托函数的实现。 在 C++/COM 中,您必须使用 SetEventSink 方法 hook 回调。 回调不仅仅是一个函数,它必须是从 ISensorEvents 继承并执行 IUnknown 的整类函数。 ISensorEvents 接口必须执行回调函数:

    [xhtml]STDMETHODIMP OnEvent(ISensor *pSensor, REFGUID eventID, IPortableDeviceValues *pEventData);
    	STDMETHODIMP OnDataUpdated(ISensor *pSensor, ISensorDataReport *pNewData);
    	STDMETHODIMP OnLeave(REFSENSOR_ID sensorID);
    	STDMETHODIMP OnStateChanged(ISensor* pSensor, SensorState state);
    // Hook the Sensor for any DataUpdated, Leave, or StateChanged events.
    SensorEventSink* pSensorEventClass = new SensorEventSink();  // create C++ class instance
    ISensorEvents* pSensorEvents = NULL;
    // get the ISensorEvents COM interface pointer
    HRESULT hr = pSensorEventClass->QueryInterface(IID_PPV_ARGS(&pSensorEvents)); 
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot query ISensorEvents interface for our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    hr = pSensor->SetEventSink(pSensorEvents); // hook COM interface of our class to Sensor eventer
    if (FAILED(hr))
    {
        ::MessageBox(NULL, _T("Cannot SetEventSink on the Sensor to our callback class."), 
            _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
        return -1;
    }
    [/xhtml]

    代码: 为传感器设置一个 COM 事件接收器

    DataUpdated 事件处理程序以参数形式接收 SensorDataReport(以及初始化事件的传感器)。 它调用表格中的 Invoke() 方法将这些条目转至委托函数。 GUI 线程运行转至其 Invoke 队列的委托函数并将参数传输至该函数。 委托函数将 SensorDataReport 的数据类型转换为所需的子类,获得数据域访问。 数据域是使用 SensorDataReport 对象中的 GetDataField()方法提取的。 每个数据域都必须将类型转换至它们的“expected”/“documented”数据类型(从使用 GetDataField()方法返回的普通/多态数据类型)。 然后应用会在 GUI 中排列并显示数据。

    OnDataUpdated 事件处理程序以参数形式接收 SensorDataReport(以及初始化事件的传感器)。 数据域是使用 SensorDataReport 对象中的 GetSensorValue()方法提取的。 每个数据域需具有自己的 PROPVARIANT,以检查它们的“expected”/“documented”数据类型。 然后应用会在 GUI 中排列并显示数据。 不需要使用同等的 C# 委托。 这是因为所有 C++ GUI 函数(如此处显示的 SetWindowText())使用 Windows 消息传递将 GUI 更新转至 GUI 线程/消息循环(您主窗口或对话框的 WndProc)。

    [xhtml]STDMETHODIMP SensorEventSink::OnDataUpdated(ISensor *pSensor, ISensorDataReport *pNewData)
    {
        HRESULT hr = S_OK;
        if ((NULL == pNewData) || (NULL == pSensor)) return E_INVALIDARG;
        float fLux = 0.0f;
        PROPVARIANT pv = {};
        hr = pNewData->GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, &pv);
        if (SUCCEEDED(hr))
        {
            if (pv.vt == VT_R4) // make sure the PROPVARIANT holds a float as we expect
            {
                // Get the lux value.
                fLux = pv.fltVal;
                // Update the GUI
                wchar_t *pwszLabelText = (wchar_t *)malloc(64 * sizeof(wchar_t));
                swprintf_s(pwszLabelText, 64, L"Illuminance Lux: %.1f", fLux);
                BOOL bSuccess = ::SetWindowText(m_hwndLabel, (LPCWSTR)pwszLabelText);
                if (bSuccess == FALSE)
                {
                    ::MessageBox(NULL, _T("Cannot SetWindowText on label control."), 
                        _T("Sensor C++ Sample"), MB_OK | MB_ICONERROR);
                }
                free(pwszLabelText);
            }
        }
        PropVariantClear(&pv);
        return hr;
    }
    [/xhtml]

    您可以仅参考 SensorDataReport 对象中的属性从 SensorDataReport 中提取数据域。 这仅适用于 .NET API(在 Win32/COM API 中,您必须使用 GetDataField 方法),及特定 SensorDataReport 子类的“well known”或“expected”数据域。 可以(使用“动态数据域”)为以下驱动程序固件“搭载” SensorDataReports 内的任意“extended/unexpected”数据域。 为了提取它们,您必须使用 GetDataField 方法。

    在 Metro 风格应用中使用传感器

    不同于 Desktop 模式,Metro/WinRT 传感器 API 对每个传感器遵循一个通用模板。

    • 这通常是一个名为 ReadingChanged的单个事件,使用包含 Reading 对象(具有实际数据)的 xxxReadingChangedEventArgs 调用回调。 (加速器是一个例外,它还具有 Shaken 事件)。
    • 传感器类的硬件绑定实例使用 GetDefault()方式检索。
    • 可以通过 GetCurrentReading()方法执行轮询。

    Metro 风格应用一般使用JavaScript* 或 C# 编写。 API 有不同的语言绑定,这导致 API 名称中的大写稍有不同以及事件处理方式也稍有不同。 简化的 API 更易于使用,表 5 中列出了利弊。

    表 5: Metro 风格应用的传感器 API 以及利弊

    特性
    SensorManager没有 SensorManager 需要处理。 应用使用 GetDefault() 方式获取传感器类实例。
    • 可能无法搜索任意传感器实例。 如果计算机上存在多个特定类型的传感器,您将只能看到“第一个”。
    • 可能无法使用 GUID 搜索任意传感器类型或类别。 厂商增值扩展不可用。
    事件应用仅关注 DataUpdated 事件。
    • 应用无法访问 Enter、Leave、 StatusChanged 或任意事件类型。 厂商增值扩展不可用。
    传感器属性应用仅关注 ReportInterval 属性。
    • 应用无法访问其他属性,包括最有用的: 敏感度。
    • 除了操控 ReportInterval 属性,Metro 风格应用无法调整或控制数据报告的流量。
    • 应用无法通过 PROPERTYKEY. 访问任意属性。 厂商增值扩展不可用。
    数据报告属性应用仅关注仅存在于每个传感器中的少数预定义数据域。
    • 应用无法访问其他数据域。 如果传感器在 Metro 风格应用预计之外的数据报告中“搭载”其他已知数据域,该数据域将不可用。
    • 应用无法通过 PROPERTYKEY. 访问任意数据域。 厂商增值扩展不可用。
    • 应用无法在运行时查询传感器支持哪些数据域。 它仅可以假定 API 预定义的数据域。

    总结

    Windows 8 API 支持开发人员在传统的 Desktop 模式和全新的 Windows* 8商店应用接口下在不同的平台上使用传感器。 在本文中,我们概述了开发人员在 Windows 8 内创建应用可用的传感器 API,重点是 Desktop 模式应用的 API 和代码样本。

    附录

    不同外形的坐标系统

    Windows API 通过与 HTML5 标准(和Android*)兼容的方式报告 X、Y 和 Z 轴。 它还称之为“ENU”系统,因为 X 面向虚拟的“”(E)、Y 面向虚拟的“(N)、而 Z 面向“(U)。

    如要弄清楚旋转的方向,请使用“右手定则”。

    *右手拇指指向其中一个轴的方向。

    * 沿该轴正角旋转将顺着您手指的曲线。

    这些是面向平板电脑或者手机(左)和蛤壳式电脑的 X、Y 和 Z 轴。 对于更复杂的外形(如可转换为平板的蛤壳式),“标准”方向是其处于“TABLET”(平板)状态时。

    如果您想要开发一个导航应用(如 3D 空间游戏),您需要在您的程序中从“ENU”转换。 可通过矩阵乘法轻松完成该操作。 Direct3D* 和 OpenGL* 等图形库都有可处理这一操作的 API。

    资源

    Win 7 传感器 API: http://msdn.microsoft.com/library/windows/desktop/dd318953(VS.85).aspx

    传感器 API 编程指南: http://msdn.microsoft.com/en-us/library/dd318964(v=vs.85).aspx

    集成运动与方向传感器: http://msdn.microsoft.com/en-us/library/windows/hardware/br259127.aspx

    作者简介

    Deepak Vembar

    Deepak Vembar 是英特尔实验室交互与体验研究 (IXR) 事业部的一位研究员。 他的研究主要关注计算机图形交互和人机交互,包括实时图形、虚拟现实、触觉、眼睛追踪和用户交互等领域。 在进入英特尔实验室之前,Deepak 是英特尔软件与服务事业部 (SSG) 的一位软件工程师,与电脑游戏开发人员一起针对英特尔平台优化游戏、传授异构平台优化课程和指南以及使用游戏演示编写大学课程(作为教学媒体在学校课程中使用)。

    Deepak 拥有克莱姆森大学计算学院的博士学位,当时他主要研究如何使用计算机培训模拟器改善飞机检查。 他的论文“Visuohaptic simulation of a borescope for aircraft engine inspection”讨论了将现成的触觉设备与计算机模拟器相结合,培训新手巡查员正确检查飞机引擎。 他还拥有克莱姆森大学的学士学位,他的论文“Towards Improved Behavioral Realism in Avatars”主要研究了使用 2 个电磁追踪仪对手势进行识别和分类。 他还与他人合作撰写了 13 篇论文并在在多场学术会议中讨论和发表,包括 IEEE 3DUI、Graphics Interface 和游戏开发者大会 (GDC)。

    声明

    本文件中包含关于英特尔产品的信息。 本文不代表英特尔公司或其它机构向任何人明确或隐含地授予任何知识产权。 除相关产品的英特尔销售条款与条件中列明之担保条件以外,英特尔公司不对销售和/或使用英特尔产品做出其它任何明确或隐含的担保,包括对适用于特定用途、适销性,或不侵犯任何专利、版权或其它知识产权的担保。

    除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。

    英特尔有权随时更改产品的规格和描述而毋需发出通知。 设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有保留权利“或未定义”说明或特性描述。 英特尔保留今后对其定义的权利,对于因今后对其进行修改所产生的冲突或不兼容性概不负责。 此处提供的信息可随时改变而毋需通知。 请勿根据本文件提供的信息完成一项产品设计。

    本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。 这些缺陷或失误已收录于勘误表中,可索取获得。

    在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。

    如欲获得本文或其它英特尔文献中提及的带订单编号的文档副本,可致电 1-800-548-4725,或访问: http://www.intel.com/design/literature.htm

    性能测试中的软件和工作负载可能仅在英特尔微处理器上针对性能进行了优化。 SYSmark 和 MobileMark 等性能测试使用特定的计算机系统、组件、软件、操作和功能进行测量。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。

    本文档转载的软件源代码根据软件许可证提供,并且只能在许可证条款下使用或复制。

    英特尔和 Intel 标识是英特尔公司在美国和/或其他国家(地区)的商标。

    英特尔公司 2012 年版权所有。 所有权利保留。

    *文中涉及的其它名称及商标属于各自持有者。

    性能声明

    有关性能声明和性能指标评测结果的完整信息,请访问: www.intel.com/benchmarks

    优化声明

    优化声明

    英特尔编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。 这些优化包括 SSE2、SSE3 和 SSSE3 指令集以及其它优化。 对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。

    该产品中依赖于处理器的优化仅适用于英特尔微处理器。 部分非针对英特尔微体系架构的优化也为英特尔微处理器保留了下来。 如欲了解更多有关本声明所涉及的特定指令集的信息,请参阅适用产品的《用户和参考指南》。



    声明版本 #20110804



    要了解有关编译器优化的更多信息,请参阅优化声明



  • Curated Home
  • Microsoft Windows* 8
  • 超极本™
  • 图形
  • Microsoft Windows* 8 Desktop
  • 传感器
  • URL
  • 超极本™ 开发的四个方面

    $
    0
    0

    超极本™ 的功能可将个人计算提升到全新的水平。 它们的英特尔® 酷睿™ i3-i7 处理器可提供今日移动计算平台都不具备的出色功耗和性能。 超极本具有连接性、游戏、娱乐和环境感知等所有特性。 借助内置触摸屏、传感器和处理器显卡,超极本可为您提供以前不可奢想的多样使用模式。

    运行 Windows 8* 的超极本为应用开发人员开启了一个充满无限可能的世界。 无论您是希望编写应用的开发新人,还是希望将应用用于超极本,本文都可为您提供利用 5 种平台特性(让其它特性都黯然失色)所需的资源。

    超极本优势

    卓越的触摸屏、传感器、显卡、功耗和性能是超极本脱颖而出的主要优势。 每款超极本都有其优势和特性,应用开发人员只有了解它们,才能实现最佳的使用效果。 超极本社区是面向开发人员的一站式社区,他们可在这里找到对开发用于这些设备、性能和体验得到优化的应用极为重要的资源。 从应用设计到软件开发的多个阶段,您可能需要以下部分提供的分类资源,以发挥超极本的优势。

    触摸屏和传感器

    与传统的输入不同,提供触摸屏应用需要重新构想应用设计,以实现最佳的用户体验。 Windows 8 提供标准的多点触控手势,后者可将新生活融入您的应用中,同时添加自然流畅的交互式元素。

    超极本还配置有各种传感器,如 GPS、加速器、方向传感器、倾角计和环境光传感器 (ALS)。 游戏和娱乐应用可使用这些硬件特性,通过富于想象力的用途吸引受众的注意力。 例如,您可根据设备的方向设计一动态用户界面,或通过 ALS 提供环境感知功能以根据周围的光线调暗或调亮显示屏,或使用加速器控制游戏中的导航。 您将需要这部分的资源支持应用中的触摸屏和传感器功能。

    触摸屏和传感器资源:
    http://software.intel.com/en-us/articles/ultrabook-touch-and-sensors-resources/

    功耗

    超极本可节省功耗并将电池续航时间延长 6 小时以上。 但是,认为功耗管理只与硬件有关则是一种误导。 在确保超极本高效使用电能方面,软件的作用至关重要。 不能合理使用硬件节电特性的应用,有许多不易被察觉的耗电途径。 这部分介绍了"绿色代码"开发和软件能效标准等概念,提供了可帮助您设计和编写节电应用的工具和资源。

    功效和绿色代码开发资源:
    http://software.intel.com/en-us/articles/developing-power-efficient-apps-for-ultrabook/

    性能

    超极本具有出色的性能和移动性。这些设备非常适用于移动式玩游戏、看电影、阅读和浏览社交网络。功耗和性能息息相关,且软件在协调这两者方面可发挥关键的作用。 性能最佳的应用可确保您的设备节电,且拥有更长的电池续航时间。

    超极本配置有支持英特尔® 超线程技术的第三代英特尔® 酷睿™ 处理器(代号 Ivy Bridge)。 这种多核架构支持开发人员通过并行编程利用强大的处理能力。 处理器显卡可支持负载平衡和提升性能,同时节省电能。 虽然这种想法看似简单,但设计性能最优的应用需要反复琢磨。 该部分介绍了并行优化等概念及开发多线程应用的指南,并提供了帮助应用开发人员发现和减少性能瓶颈、提高功效的资源和工具。

    增强超极本™ 中应用性能的资源:
    http://software.intel.com/en-us/articles/performance-enhancement-on-ivy-bridge-ultrabook/

    显卡

    第二代超极本采用英特尔酷睿处理器。这种微架构包括英特尔® 核心显卡,这意味着 CPU 和 GPU 都位于同一晶片上。 现在,图形和游戏应用可使用该微架构提供的功耗和性能。 与超极本触摸屏和传感器功能结合使用时,游戏和图形应用具有多样的使用模式,而这在以前是不可奢想的。 您可了解到使用 DirectX* 等各种图形管线进行游戏和显卡开发方面的最佳实践,及用于这方面的英特尔酷睿处理器架构和移植技术。 您还可使用所有的英特尔® 工具,它们可帮助您设计和开发充分利用超极本硬件的图形应用。

    用于为 Ivy Bridge 超极本™ 开发图形应用的资源:
    http://software.intel.com/en-us/articles/developing-graphics-applications-for-ivy-bridge-ultrabook/

    借助所有这些资源,您现在可以为超极本开发令其它应用黯然失色的卓越应用!

    Intel、英特尔、Ultrabook、超极本、Core、酷睿和 Intel 标识是英特尔在美国和/或其他国家的商标。
    英特尔公司 2012 年版权所有。 所有权保留。
    *其他的名称和品牌可能是其他所有者的资产。

  • Curated Home
  • 开发人员
  • 英特尔 AppUp® 开发人员
  • Microsoft Windows* 8
  • 超极本™
  • 入门级
  • URL
  • cximage + png 图处理

    $
    0
    0

    看到论谈上有这么多关于 png 图片的处理,但是有一点想不通,他们怎么都用 gdi+png 来处理呢?

    不是最高效最好的方法还是cximage+png图片处理吗?

    使用cximage这个类,还需要你去下载一个cximage的demo。里面要用到这几个文件呀!

    找到这几个文件之后把他复制到你的工程中,进行配置,这样你就可以用cximage这个类了。

    第一步,打开的工程,点projects——settings

    在这里配置成功以后,看一下你的里边是不是有这些东西。

    cximage.lib libdcr.lib Jpeg.lib jasper.lib mng.lib png.lib tiff.lib zlib.lib 

    这几个东西是不是都有。你们好好捡查一下吧。

    下来就是导入头文件。

    你按下F5进行调试

    看看是不是有问题。这样还不行,还要进行一下代码测试,是不是有问题,

    在你的cxxxxxxdlg中添加头文件看他认不认。

    #include  "ximage.h"

    public:

     CxImage *m_bgcximage;

    看一下能不能成功,如果成功了就可以做东西了。呵呵。

    下来我们用一个jpg的图片来实验一下效果吧。给对话框添加个背景。好吧。首先,先用你的ps,或者其他工具,选将你的图片保存成jpg格式的。

    在这里还得添加一个函数,第一步按下ctrl+w如下图。点击class info 点击message filter选择windows点ok

    在按下ctrl+w在添加OnEraseBkgnd这个函数。

    好了具体的是代码了。我给大家贴出来。看看吧,能不能成功。

    BOOL CCximageDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    //return CDialog::OnEraseBkgnd(pDC);
    RECT rect;
    GetClientRect(&rect);
    m_bgcximage->Tile(pDC->GetSafeHdc(),&rect);
    return true;
    }

    在OnInitDialog()里写,这样就把jpg格式的图片就贴上来了。

    m_bgcximage = new CxImage();
    HRSRC temp=FindResource(NULL,"IDR_JPG1","JPG");
    if (!m_bgcximage->LoadResource(temp,CXIMAGE_FORMAT_JPG)){
    delete m_bgcximage;
    m_bgcximage =NULL;
    }

    运行后的效果是这样的。

  • 学生
  • Microsoft Windows* (XP, Vista, 7)
  • 超极本™
  • C/C++
  • URL
  • 代码样本
  • IDF2013英特尔信息技术峰会 HTML5交流体验专区 技术主题讲座视频

    $
    0
    0

    IDF2013英特尔信息技术峰会 HTML5交流体验专区 讲座视频

    本届IDF大会共吸引了近万人前来参观,仅HTML5交流体验专区的参会人数就达3千余人,使HTML5专区成为了整个IDF大会人气最旺、最吸引人的区域。

    在为期两天的活动中,共进行了20场技术讲座/讨论和16个精彩演示,为参观者呈现了一场难忘的饕餮大餐!

    这里我们汇集了讲座的视频,方便大家复习学习。

    兑现HTML5的跨平台开发承诺:“一次编写,随处运行”英特尔最佳HTML5开发工具         课程视频    课件下载


    Suhail Syed(英特尔),

    Rao Yeleswarapu (英特尔)

     4月10日 
    搭建从Web应用程序到移动设备应用程序的桥梁     课程视频                     课件下载


    张旭(英特尔), 吴卫华(英特尔) 

    4月10日 13:45-14:30
    HTML5在行动: 智能电子教材和云架构的个性化教学服务平台       课程视频            课件下载


    刘明璋(英特尔), 张海立(英特尔)

     4月10日 15:15 - 16:00
    响应式网页设计                                        课程视频                             课件下载

     Daniel.W.Holmlund(英特尔)

    4月10日 16:00-16:45 
    Polyfills                                                      课程视频                             课件下载
    Daniel.W.Holmlund(英特尔)

     

  • 开发人员
  • 英特尔 AppUp® 开发人员
  • 合作伙伴
  • 学生
  • Android*
  • Apple iOS*
  • Apple Mac OS X*
  • Linux*
  • Microsoft Windows* (XP, Vista, 7)
  • Microsoft Windows* 8
  • Tizen*
  • 安卓*
  • HTML5
  • Windows*
  • HTML5
  • 中级
  • 英特尔® HTML5 Development Environment
  • URL
  • 使用软件工具测试Intel® 平台下的WINDOWS *应用程序功耗

    在Intel®平台上优化多媒体应用程序功耗

    $
    0
    0

    经过多年的硬件平台优化,硬件平台功耗逐年降低。CPU有了新的低功耗状态,显示功耗也大幅下降。然而,运行在平台上的软件所产生的功耗问题却越来越明显。在软件方面,多媒体应用程序对功耗的影响更加引人关注。事实上,研究表明优化过的多媒体应用程序播放时间是未优化过的媒体程序的两倍多。这篇白皮书介绍了设计和开发绿色多媒体应用程序需要考虑的要素,以及如何分析优化多媒体应用软件软件Intel®平台下的功耗。这篇白皮书旨在面向 ISVs, OEMs, 和其他技术相关人士。

  • 开发人员
  • 合作伙伴
  • 教授
  • 学生
  • Microsoft Windows* (XP, Vista, 7)
  • Microsoft Windows* 8
  • Windows*
  • 高级
  • 静态分析
  • 调试
  • 媒体处理
  • Microsoft Windows* 8 Desktop
  • Laptop
  • Desktop
  • URL
  • 提升性能
  • 利用jsPerf优化Web应用的性能

    $
    0
    0

    在前端开发的过程中,掌握好浏览器的特性进行有针对性的性能调优是一项基本工作,jsperf.com是一个用来发布基于HTML的针对性能比较的测试用例的网站,你可以在jsPerf上在线填写和运行测试用例,得到浏览器运行测试用例的性能,学会利用jsPerf会让你的优化工作事半功倍。

    书写测试用例

    我想写一个简单的例子,验证一个算法是否更高效,这里我想到了字符串的拼接。在JS里拼接大量字符串有两种常见的方法,一是直接用加号(+)连接所有的字符串,二是用数组的join函数拼接起来。在很多书中都提到采用第二种方法的效率更高,那么我们就用jsPerf来验证一下。

    第一步,打开jsPerf(http://jsperf.com),在Test case details区域填入测试的基本信息,测试的名称(Title)、短名称(Slug),Slug用于生成将来的测试页面的地址,所以不能与现有的重复。然后你可以选择是否马上发布(Published),在Description区域填入测试的目的和方法之类的描述。

    第二步就是写测试用例了。我准备为这两个算法各写一个测试用例(test case),而这两个例子都需要一个很大的字符串数组作为输入,这时你需要在Preparation code区域准备好这个数组,在"Define setup for all tests"区域填入如下代码,会为我生成这样一个大字符串数组。下面是生成数组的代码:

    var bigArray = [];
    for (var i = 0; i < 1000; i++) {
        bigArray.push('This is a test!test!test!');
    }

    你也可以在Define teardown for all tests区域执行一些JS代码,清除运行测试用例产生的DOM结点、JS变量等等,以免影响到再次运行测试用例。

    除了准备JS代码之外,还可以在Preparation code HTML区域准备你的HTML代码、CSS样式表,以及引入第三方JS库(如jQuery等)。

    准备好数组之后,就在下面的“Code snippets to compare”中分别填入算法的简单描述(Title)和代码(Code),Async选项框是用来测试一些异步调用的性能的,我们的代码没有使用异步方法,所以不必勾选。

    直接用加号连接:

    var result = '';
    for (var i = 0, length = bigArray.length; i < length; i++) {
        result += bigArray[i];
    }

    用数组的join函数:

    var result = bigArray.join('');

    jsPerf默认只有两个测试用例,如果你要添加额外的,可以点击最下面的“Add code snippet”添加,另一个按钮“Beautify code”可以帮助你格式化代码,自动调整缩进,让代码显示更美观。

    最后,点击“Save test case”保存测试用例。浏览器会自动跳转到测试页面。点击这里(http://jsperf.com/compare-string-concat)可以直接查看完整的测试用例。

    有时在提交了测试用例之后发现有问题,可以通过在测试地址后面加/edit打开测试用例的编辑页面,添加和修改你的测试用例。

    运行测试

    好,点击“Run tests”按钮开始测试两种算法的性能。建议在运行性能测试之前,关闭无关的浏览器页面,关闭其他程序,退出不必要的后台进程,以保证结果不受其他环境的影响。你也可以通过点击个别测试用例的名字单独运行这个例子。

    读懂测试结果

    测试结果以每秒钟执行测试代码的次数(Ops/sec)显示,这个数值越大越好。除了这个结果外,同时会显示测试过程中的统计误差,以及相对最好的慢了多少(%),统计误差也是非常重要的指标,如果你写的测试用例不好,或者说后台正在运行一些其他程序,会造成统计误差过大,这时测试结果就不够可靠。

    在我们这个例子中,在我的Chrome 24浏览器上,第二种方法比第一种方法慢了62%,在Firefox 18上,第二种方法慢了70%,我们惊奇地发现第二种方法反而比第一种更慢!只有在IE8上,第一种方法慢了78%。

    jsPerf还会统计所有运行过这个测试用例的浏览器的比较结果,显示在下方的Browserscope区域,可以通过它直观地看出各个版本浏览器的性能横向和纵向比较情况。

    异步测试

    jsPerf也能支持像setTimeout这种异步的调用测试,异步测试用例需要在书写用例时选中“Async”,并且在异步调用结束后及时调用deffered.resolve()。这儿(http://jsperf.com/smallest-timeout)有一个异步测试用例的示例。

    查看别人的测试用例

    jsPerf上提供所有测试的查询,打开http://jsperf.com/browse就可以看到最近提交的测试,也可以输入关键词来进行查找。查看别人写的测试用例,可以帮助你发现更多性能调优的方法,以便用于自己的开发工作中。


    Imagine Cup 微软“创新杯”全球学生大赛英特尔专区

    $
    0
    0

     

    Imagine Cup微软“创新杯”全球学生大赛英特尔专项奖设置与评奖规则

     

    Imagine Cup 微软“创新杯”全球学生大赛是目前全球规模最大、影响最广的学生科技大赛。2003年创办以来,至今已有来自190多个国家和地区,超过160万名学生参与了“创新杯”比赛和相关活动。Imagine Cup 2013比赛目前已经启动,中国区比赛项目针对世界公民(World Citizenship)、游戏(Games)和最佳创新(Innovation)三个比赛项目(Competitions)设立。英特尔作为2013 Imagine Cup中国区主要赞助方之一,特别为2013 Imagine Cup设立了一项英特尔特别奖及若干项英特尔鼓励奖,具体奖品与评奖规则如下。

    英特尔鼓励奖

    奖品:英特尔SSD 120G 固态硬盘一个 + 获邀在英特尔开发人员专区分享开发经验及作品介绍;

    评奖资格:在Imagine Cup 2013 中国区决赛中,采用下列任一英特尔平台及与其相对应的一种或多种英特尔技术的参赛作品将获得英特尔鼓励奖:

    1)     英特尔超极本平台:开发触屏应用,HTML5应用,运用英特尔指令集进行应用开发,使用英特尔软件开发工具(编译器、性能分析工具、函数库、Intel Media SDK等)进行应用性能优化,电源管理优化,运用英特尔无线显示技术等英特尔其它技术;

    2)     基于英特尔处理器的平板电脑平台:开发触屏应用、HTML5应用,运用感应器的应用、及运用英特尔AVX指令集的应用,运用英特尔无线显示技术等英特尔其它技术;

    3)     基于英特尔处理器的笔记本及台式机平台:运用英特尔指令集进行应用开发,使用英特尔软件开发工具(编译器、性能分析工具、函数库、Intel Media SDK等)进行应用性能优化,开发HTML5应用,运用英特尔无线显示技术等英特尔其它技术。

    英特尔特别奖(一支团队)

    奖品:三星XE500T1C-A01CN 11.6英寸平板电脑一台;

    评奖资格:在有资格获得英特尔鼓励奖的团队中,评选一支将英特尔与微软的平台和技术进行最佳融合且充分发挥英特尔平台技术优势的团队。

    英特尔技术资料

    Win8应用开发  

                                

    更多内容……

    超极本应用开发

    敬请期待更多内容……

    HTML5应用开发

    更多内容……

     

    资源链接

     

    Imagine Cup-HTML5

    $
    0
    0

    返回“Imagine Cup 微软“创新杯”全球学生大赛英特尔专区”首页>>

    HTML5测试框架Jessie(Jasmine)使用方法

    http://software.intel.com/node/342598

    HTML5应用开发:JavaScriptiScroll教程

    http://software.intel.com/zh-cn/articles/iScroll/ 

    HTML5应用开发:JavaScript语义模板库handlebars教程

    http://software.intel.com/zh-cn/articles/HTML5Handlebars 

    HTML5应用开发神奇的动态布局库isotope教程

    http://software.intel.com/zh-cn/articles/isotope/ 

    充分使用HTML5特性进行搜索引擎优化(SEO)  

    http://software.intel.com/zh-cn/blogs/2012/08/25/html5seo/

    移动Web应用程序开发 HTML5篇系列

    http://software.intel.com/zh-cn/blogs/2012/02/20/web-html5-html5

    http://software.intel.com/zh-cn/blogs/2012/02/22/web-html5

    http://software.intel.com/zh-cn/blogs/2012/03/05/webhtml5-web-sockets-api

    HTML5应用开发:神奇的动态布局库isotope教程

    http://software.intel.com/zh-cn/articles/isotope/

    国内HTML5前端开发框架汇总

    http://software.intel.com/zh-cn/blogs/2012/12/03/html5

    HTML5测试框架Jessie(Jasmine)使用方法

    http://software.intel.com/zh-cn/articles/html5-jessiejasmine

    充分使用HTML5特性进行搜索引擎优化(SEO)

    http://software.intel.com/zh-cn/blogs/2012/08/25/html5seo

    HTML5应用开发:JavaScriptiScroll教程

    http://software.intel.com/zh-cn/articles/iScroll

    HTML5应用开发:JavaScript语义模板库handlebars教程

    http://software.intel.com/zh-cn/articles/html5handlebars

    移动Web应用程序开发 HTML5 () 多媒体API

    http://software.intel.com/zh-cn/blogs/2012/02/27/web-html5-api

    优化联网待机状态下WINDOWS 8 应用程序

    cximage + png 图处理

    $
    0
    0

    看到论谈上有这么多关于 png 图片的处理,但是有一点想不通,他们怎么都用 gdi+png 来处理呢?

    不是最高效最好的方法还是cximage+png图片处理吗?

    使用cximage这个类,还需要你去下载一个cximage的demo。里面要用到这几个文件呀!

    找到这几个文件之后把他复制到你的工程中,进行配置,这样你就可以用cximage这个类了。

    第一步,打开的工程,点projects——settings

    在这里配置成功以后,看一下你的里边是不是有这些东西。

    cximage.lib libdcr.lib Jpeg.lib jasper.lib mng.lib png.lib tiff.lib zlib.lib 

    这几个东西是不是都有。你们好好捡查一下吧。

    下来就是导入头文件。

    你按下F5进行调试

    看看是不是有问题。这样还不行,还要进行一下代码测试,是不是有问题,

    在你的cxxxxxxdlg中添加头文件看他认不认。

    #include  "ximage.h"

    public:

     CxImage *m_bgcximage;

    看一下能不能成功,如果成功了就可以做东西了。呵呵。

    下来我们用一个jpg的图片来实验一下效果吧。给对话框添加个背景。好吧。首先,先用你的ps,或者其他工具,选将你的图片保存成jpg格式的。

    在这里还得添加一个函数,第一步按下ctrl+w如下图。点击class info 点击message filter选择windows点ok

    在按下ctrl+w在添加OnEraseBkgnd这个函数。

    好了具体的是代码了。我给大家贴出来。看看吧,能不能成功。

    BOOL CCximageDlg::OnEraseBkgnd(CDC* pDC) 
    {
    // TODO: Add your message handler code here and/or call default
    //return CDialog::OnEraseBkgnd(pDC);
    RECT rect;
    GetClientRect(&rect);
    m_bgcximage->Tile(pDC->GetSafeHdc(),&rect);
    return true;
    }

    在OnInitDialog()里写,这样就把jpg格式的图片就贴上来了。

    m_bgcximage = new CxImage();
    HRSRC temp=FindResource(NULL,"IDR_JPG1","JPG");
    if (!m_bgcximage->LoadResource(temp,CXIMAGE_FORMAT_JPG)){
    delete m_bgcximage;
    m_bgcximage =NULL;
    }

    运行后的效果是这样的。

    IDF2013英特尔信息技术峰会 HTML5交流体验专区 技术主题讲座视频

    $
    0
    0

    IDF2013英特尔信息技术峰会 HTML5交流体验专区 讲座视频

    本届IDF大会共吸引了近万人前来参观,仅HTML5交流体验专区的参会人数就达3千余人,使HTML5专区成为了整个IDF大会人气最旺、最吸引人的区域。

    在为期两天的活动中,共进行了20场技术讲座/讨论和16个精彩演示,为参观者呈现了一场难忘的饕餮大餐!

    这里我们汇集了讲座的视频,方便大家复习学习。

    兑现HTML5的跨平台开发承诺:“一次编写,随处运行”英特尔最佳HTML5开发工具         课程视频    课件下载


    Suhail Syed(英特尔),

    Rao Yeleswarapu (英特尔)

     4月10日 
    搭建从Web应用程序到移动设备应用程序的桥梁     课程视频                     课件下载


    张旭(英特尔), 吴卫华(英特尔) 

    4月10日 13:45-14:30
    HTML5在行动: 智能电子教材和云架构的个性化教学服务平台       课程视频            课件下载


    刘明璋(英特尔), 张海立(英特尔)

     4月10日 15:15 - 16:00
    响应式网页设计                                        课程视频                             课件下载

     Daniel.W.Holmlund(英特尔)

    4月10日 16:00-16:45 
    Polyfills                                                      课程视频                             课件下载
    Daniel.W.Holmlund(英特尔)

    Room 403:最前沿的话题,最轻松的表述, 技术精英的必选课

    11:15-12:00        W3C谈HTML5            陈本峰(W3C)    

    13:00-13:45        英特尔的HTML5愿景和战略:英特尔开发者专区、HTML5工具、运行时和云服务  
                             Syed Suhail (英特尔) Rao Yeleswarapu (英特尔)   

    13:45-14:30       Phonegap
                            Daniel Holmlund (英特尔)  

    15:15-16:00       针对HTML5应用的Web Runtime 优化实践    
                            丁俊勇 (英特尔)

    16:00-16:45        开发高性能的Web应用
                             刘聪 (英特尔)

     

     

    Viewing all 154 articles
    Browse latest View live


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