面向开发人员的 Windows Store 博客
Windows 8 应用程序开发人员博客
IEBlog 简体中文
Windows 团队博客
Inside Windows Live 博客
下载 Windows 8 Consumer Preview
开发中心 - Metro 风格的应用程序
关注 @BuildWindows8
//build/ 会议
Windows 8 Consumer Preview论坛
Windows Metro 风格应用程序论坛
在尽量减少电源消耗的同时尽量提高响应性和资源利用率(即实现“快速而顺畅”)是重大的工程难题。虽然这项工作需要我们在 Windows 中提供适当的资源使用水平支持,但也需要开发人员在开发其应用程序时将资源利用率纳入考虑。电源效率适用于所有类型的设备和使用情境,减少电源消耗对所有人都有益无害。Windows 8 PC 基于 WinRT 的新运行时模型对本领域进行了重大创新,这不是那种能够在现有桌面应用程序的基础上翻新,同时保持功能性和兼容性的创新。与之前曾提到的状态迁移和设置类似,电源消耗是 Windows 中针对新情境进行重新设计的领域之一。通过基于 x86 的现有 PC,所有现有支持将照常提供,并且所有通过桌面应用程序完成的工作也可以照常完成(当然,也得到了改进)。随着支持的所有 SoC 硬件(包括 Intel)中新硬件的不断涌现,这种电源效率水平将日益普及。虽然我们讨论了在改善桌面应用程序的电源消耗方面的某些努力,但为了实现全天候不间断连接的使用情境,我们将看到在下一代硬件中运行,并且支持全新电源管理功能的新应用程序写入 WinRT。 基本功能和用户体验团队的两位主管项目经理 Sharif Farag and Ben Srour 创作了这篇博文。 --Steven
在尽量减少电源消耗的同时尽量提高响应性和资源利用率(即实现“快速而顺畅”)是重大的工程难题。虽然这项工作需要我们在 Windows 中提供适当的资源使用水平支持,但也需要开发人员在开发其应用程序时将资源利用率纳入考虑。电源效率适用于所有类型的设备和使用情境,减少电源消耗对所有人都有益无害。Windows 8 PC 基于 WinRT 的新运行时模型对本领域进行了重大创新,这不是那种能够在现有桌面应用程序的基础上翻新,同时保持功能性和兼容性的创新。与之前曾提到的状态迁移和设置类似,电源消耗是 Windows 中针对新情境进行重新设计的领域之一。通过基于 x86 的现有 PC,所有现有支持将照常提供,并且所有通过桌面应用程序完成的工作也可以照常完成(当然,也得到了改进)。随着支持的所有 SoC 硬件(包括 Intel)中新硬件的不断涌现,这种电源效率水平将日益普及。虽然我们讨论了在改善桌面应用程序的电源消耗方面的某些努力,但为了实现全天候不间断连接的使用情境,我们将看到在下一代硬件中运行,并且支持全新电源管理功能的新应用程序写入 WinRT。
基本功能和用户体验团队的两位主管项目经理 Sharif Farag and Ben Srour 创作了这篇博文。
--Steven
我们曾发布过几篇有关我们如何改善 Windows 8 PC 电源寿命的博文。在 Pat Stemen 构建电源智能的、通用的 Windows 一文中,我们曾讨论过我们致力于在 Windows 8 中针对片上系统 (SOC) 硬件提供一种称为“连接待命”电源模式,这种模式与智能手机的电源模式相似。在在不耗尽您电池的前提下更新实时图块一文中,我们曾谈到我们如何通过实时图块为您提供最新的信息,同时避免产生消耗电池寿命的大量后台活动。在本文中,我们将继续介绍尚未提及的一些创新,包括我们如何在保证应用程序正常工作的前提下,尽可能减少 Windows 8 中运行的应用程序的电源消耗。
Pat 曾在他的博文中提到,应用程序会通过消耗资源(例如 CPU、磁盘、内存和其他资源)来影响电源消耗,因为每种资源都具有其相应的电源成本。因此,降低电源消耗的关键在于当应用程序处于活动状态时允许其使用所需的资源,并且当它们处于闲置状态时尽可能减少其使用的资源。这一点对于操作系统本身同样适用。Pat 列举了我们的一些工作成果以证明这点,但事实上,我们在此领域还实施了成千上万的其他小改进,这些改进可限制操作系统的资源使用和活动性,我们将其统称为“电源保健”改进。我们同时也需要注意不要在这方面走得太远,以至于破换了用户需要的功能,例如:从启动到切换出的完整活动性。
例如,在回复有关实时图块的博文时,@ItsMe 问道:
“后台复制作业会怎样处理呢。如果我将资源管理器应用程序置于后台以查看或编辑一个 Word 文档,这是否意味着直到我再次“全屏”复制作业之前,该作业将处于暂停状态?会是这样吗?”
答案是否定的,文件复制毫无疑问将继续按照现有的方式工作,也就是说如果您开始了复制作业,然后切换到其他应用程序,复制作业将在后台自动完成而不会挂起。这同样适用于您在 PC 前工作或离开 PC 一段时间后出现屏幕保护或锁定屏幕时的情况。挂起非活动的应用程序仅适用于 Metro 风格的应用程序,而非复制文件这样的基础操作系统功能。
在 Windows 8 中,我们从一条适用于大多数 Metro 风格应用程序的规则入手:如果应用程序未在屏幕中出现,或者屏幕未开启,则应用程序不应该影响您的电源寿命。这并不意味着 WinRT 和用户模型会妨碍多任务功能。我们需要通过全新的方式来思考何时以及如何将先进的硬件功能、网络需求、设备类型和可靠性/安全性/隐私性纳入考虑。虽然存在一些例外(例如,后台电子邮件同步、桌面工具),但在大多数情况下,我们希望应用程序能够在您与其积极互动时完成大部分工作。当应用程序不在前台工作时,我们希望确保其完全挂起,或根据应用程序可访问的一系列常用后台功能使用有限的资源。
归根结底,这表示应用程序会处于以下三种可能的状态之一:
实现前台应用程序的活动运行非常容易,我们只需允许其运行并利用 CPU、磁盘、内存和其他所需的资源。在这方面,Metro 风格的应用程序在本质上与 Windows 应用程序一直以来的工作方式完全相同。这种状态包含两种情况,即全屏状态下的单个应用程序,以及屏幕中有两个应用程序,其中一个“贴靠”到侧面时的情况。这仅适用于屏幕开启时的情况,因为这样才能表明用户正在与 PC 进行交互。
开发快速且及时响应的应用程序需要考虑一系列新的因素。就像从字符过渡到 GUI 编程一样,由于概念存在本质上的差异,构建节约电源和资源的应用程序需要采用全新的方法。举例来说,早期 Windows 程序开发人员经常对 WNDPROC 的概念感到困惑,并感到处理键入的最佳方式是捕获中断,并将其转换为按键,基于消息的方法打破了这一做法,Windows 会处理这种转换并告知应用程序何时应接收按键,这与早期的实现方式完全不同。由于目前在售的 PC 75% 以上通过电池供电,程序开发人员显然需要重新思考程序的开发理念。
有鉴于此,在开发应用程序时应抱持前瞻性的态度,以便跟上硬件发展的速度和客户需求的变化。我们需要对现有应用程序模式进行改进,以便满足用户节约电源和电池寿命的需要。当然,我们已多次表示,您目前使用的桌面应用程序将继续按照 Windows 7 中的方式工作(同时也会在多个方面得到改进)。但随着时间的推移,我们将在 Windows 中加入新的应用程序,以便帮助您消耗更少的电源完成更多工作,范围从娱乐直到专业工具,不一而足。可用于计算的资源,需要的资源及计算类型正在不断发生变化,而 Windows 8 将为您提供抓住这一机遇所需的新工具。
在基于前台的方法中,并发对于开发快速、顺畅且及时响应的应用程序来说至关重要。在 //build/ 大会上,我们曾展示过如何使用新的工具和 API 来开发高度并发的应用程序。借助这些工具,开发人员可以从全新的角度思考如何针对特定情境编写代码。例如,程序开发人员可以利用新操作系统的后台任务基础结构,通过高效节能的方式在后台完成所需的活动,而不再需要保持一个始终在后台单独运行的应用程序。后台任务可以通过多种方式激活,例如,推送通知、定时事件乃至传入网络数据。当您的 PC 接入电源时,智能化��系统还将允许后台应用程序更频繁地运行。总而言之,通过按需运行的代码来替代始终运行的代码,电池寿命将大大延长。例如,当您的 PC 接入电源时,新闻阅读器应用程序可以在午夜自动为您下载内容,这样当您启动该应用程序时,将在第一时间看到最新的内容。这样做不会影响工作效率,这是一种全新的工作方式,它会帮助您在尽可能减少对关键系统资源影响的情况下完成工作。
除了改进应用程序代码在后台执行的方式之外,我们还在工具基础结构和 WinRT API 方面进行了许多改进,以便简化和增强异步编程。快速且及时反映的应用程序需要在异步编程的坚实基础上构建。在 //build/ 大会的一次主要会议上,Anders Hejlsberg 曾展示过一种 WinRT 方法,通过该方法可构建以查看大型商品目录为中心的异步用户体验。借助此类技术,应用程序将能够提供出色的情境和前台性能,并延长电池寿命。
当您启动应用程序并从中切出后,将进入第二阶段,操作系统会将该应用程序挂起。也就是说 Windows 计划程序(用于计划进程和线程的 CPU 访问的组件)不会将其包含在 CPU 计划之中。由于操作系统不会将该其列入计划,该应用程序将不会使用 CPU,CPU 可能会因此进入低功耗状态。CPU 进入低功耗状态对于延长电池寿命来说可能至关重要。开发人员对这种方法可能并不陌生,因为该方法与您调试应用程序时将其“暂停”的过程非常相似。实际上,该应用程序运行的所有线程都将暂停。挂起的应用程序与缓存状态类似。由于应用程序已经初始化,您将获得实时应用程序切换的便利。操作系统计划程序只需在应用程序切换回前台时再次允许其执行即可。
这种全新挂起状态的优点之一在于您可以实时切换回挂起的应用程序。当您切换至挂起的应用程序时,该应用程序将瞬间恢复,并返回至您离开时的状态。这样,您就能够以前所未有的速度,在 Windows 中的更多应用程序间更快地切换。您无需再关心 PC 中正在运行的应用程序数量,由于实时图块会通知您应用程序的当前状态,并且应用程序能够保存和恢复状态,大量应用程序始终看起来像是处于运行状态。
例如,假设一个应用程序会持续记录您即将到来的行程。此应用程序可以通过实时图块通知向您显示下一次行程的状态,即使应用程序已挂起甚至未在后台中运行也是如此。当您切换至此应用程序时,它将自动回到上一次的位置(例如,行程搜索),仿佛您不曾离开过。由于正在运行的概念非常抽象,启动应用程序和切换至应用程序本质上已经成为了同义词。无论通过 Back 堆栈、Alt+Tab 还是 [Start](开始)屏幕切换至应用程序,您始终可以实时返回至已挂起的应用程序。
因此,“正在运行”的程序列表实际上就是您在 [Start](开始)屏幕上看到的程序列表。对于键盘用户,请记住以下几点:Alt+Tab 与 Windows 7 中的工作方式相同,适用于所有正在运行的程序,[Taskbar](任务栏)对于桌面应用程序的工作方式也完全相同(甚至针对多显示器情境进行了优化)。
借助挂起应用程序的功能,您可以在不影响电池寿命或系统性能的情况下,非常快速地在它们之间进行切换。这与传统的桌面应用程序完全不同,在桌面应用程序中,我们将精力全部放在如何优化启动耗时较长的应用程序的工作流程上。
通常来说,在两种情况下我们不会挂起未进行后台活动的应用程序。第一,如果您尚未在当前登录的会话中启动该应用程序,则必须点击应用程序的图块以将其启动。第二种情况更加有趣。如果系统的内存快要耗尽,系统将移除某个应用程序的挂起状态并终止该应用程序。内存是一种有限的资源,而我们希望确保您最常使用的应用程序随时处于就绪状态。如果您一段时间内未使用某个应用程序,而操作系统此时需要更多内存,则系统将自动终止其中一个挂起的应用程序。这种情况不会经常发生,因为内存管理器将接手挂起的应用程序并将其保存到磁盘(磁盘的容量通常比物理内存更大)。当您切换回这些应用程序时,它们将瞬间就绪。但在某些情况下,系统必须终止某个挂起的应用程序。这种情况通常发生在多个用户登录到一台 PC,或您正在使用大量内存密集型应用程序时。
操作系统在决定终止哪些应用程序时,会对多种因素进行综合考量,例如,应用程序最后一次使用的时间,应用程序占用的内存大小等等。理想情况下,操作系统会终止尽可能少的应用程序,因此,您将能够频繁地切换回已挂起的应用程序。即使应用程序会从挂起状态终止,实际上对您的体验影响甚微,因为应用程序模型的演进允许开发人员在应用程序使用过程中逐步保存其状态,并在应用程序重新启动时将其恢复。例如,当您决定转移到其他应用程序时,行程跟踪应用程序可以记录下您正位于行程搜索页面,当您切换回来时,应用程序将利用该信息返回相应页面,即使系统已将其终止也是如此。
还要强调一点,即使后台中有多个已挂起的应用程序正在占用内存,也不会对 PC 的性能或电池寿命产生负面影响。事实上,您根本不需要直接管理或关闭应用程序。这在当今的计算设备中是一种常见的方法,并代表了一种前卫的操作系统设计理念(相关示例,请参见 Frasier Spears 撰写的有关 iOS 多任务功能的博文)。
即使无需通过关闭应用程序来提高性能或电池寿命,您仍可以在即将发布的 Windows 8 Beta 版中关闭应用程序。在某些情况下,应用程序会陷入错误状态,或者您已经不需要继续使用该应用程序。您将可以使用鼠标、触控操作或键盘快捷键来关闭应用程序。我们将在 Beta 版推出后发布一片后续博文,并在其中介绍我们在此领域进行的一些更改,敬请期待!
在开发人员预览版中,您可以先运行多个该版本中内置的应用程序(例如,股票、新闻或天气应用程序),然后通过打开新的任务管理器来查看生效的挂起状态。请注意,此处列出的 CPU 使用率为 0%,这是由于虽然这些应用程序在内存中,但它们实质上处于睡眠状态,不会对电池寿命或性能产生负面影响。
在后台挂起的 Metro 风格应用程序
我们已经讨论过,开发人员需要思考如何能够在不影响电池寿命的情况下,完成之前可在后台完成的任务。您可以求助于多任务来实现这一点,但如果所有应用程序始终在运行后台任务,您将永远无法实现较长(甚至有所改善)的电池寿命。随着笔记本电脑和移动设备的日益普及,这一点的重要性显然不可小视。因此在 Windows 8 和 WinRT 中,我们创建了新的 API 以涵盖 Metro 风格应用程序的后台处理。
再次强调,您的桌面应用程序将继续按照一直以来的方式运行,但他们对于电池寿命的影响也将如常(虽然我们将在下文中介绍某些改进)。
我们力图提供丰富的应用程序功能及多任务支持以满足人们对 Windows 的期望,同时在资源使用率方面做出权衡。为此,我们列出了一系列希望支持的关键情境,并着手通过尽可能高效利用资源的方式来实现这些情境。结论就是一系列后台多任务 API,这些 API 允许应用程序通过高效利用资源和电源的方式在后台完成操作,并可以帮助开发人员将精力集中在应用程序的功能上,而不必进行额外的工作。
我们采取专注情境的方法来支持应用程序可能需要在后台完成的大多数常见任务。以下是 WinRT 中 Metro 风格应用程序支持的后台功能:
以下是根据开发人员的常用模式及我们期待看到的常见模式设置的一组情境。其中某些情境使用了相同的平台功能,接下来我们将对它们进行一一介绍,以便让您了解 Windows 8 的前景和能力。
情境
描述
后台下载或上传
在 Internet 上访问和存储内容是非常常见的应用程序情境。我们希望当您切换回应用程序时,始终能看到已加载的最新内容。对于基于杂志或新闻的应用程序来说尤为如此。应用程序可以使用新的后台传输 API 以便在后台执行上传和下载任务。我们将此 API 称为“完全中转”,也就是说操作系统自身会执行上传/下载。这样就可以在运行时完全排除应用程序代码,并帮助延长电池寿命。
后台音频
我们仍希望您能够同时执行多个任务,尤其当其中一个是听音乐时。任何媒体或通信应用程序都可以在后台播放音频。为了尽可能提高效率,我们会在您暂停音频时挂起应用程序。
共享
如果您的应用程序正在使用个性共享向云服务发送内容,应用程序将在后台完成该操作。
锁屏应用程序
锁屏应用程序通常需要通知您最新信息,并且这种情况随时可能发生,即使您并未使用应用程序时也是如此。最常见的例子是您的电子邮件、VoIP 和即时消息应用程序。即使在电池模式下的后台中,或者当屏幕已锁定时,锁屏应用程序也可以提供通知并同步数据。
打印
即使执行打印操作的应用程序已移至后台,您仍然可以继续打印文档。
设备同步
即使应用程序未在屏幕中显示,您也可以在连接的设备(例如,相机)和 PC 间同步内容。
带有 Windows 通知服务的实时图块
应用程序可以通过向 Windows 8 PC 发送推送通知的方式为应用程序的实时图块提供最新内容,以造成始终运行的印象(即使事实上已挂起)。
计划的通知
应用程序可以通过在特定时间更新图块(例如,日历约会)或在桌面上弹出通知的方式提醒您下班前要做的某件事。应用程序负责计划这些事件,但 Windows 会负责递送通知,以便尽可能减少电池消耗。
后台任务
应用程序可以在发生特定事件时运行代码,例如发生周期性中断,或当您登录到 Windows 或即时消息服务时。锁屏应用程序可以每隔 15 分钟运行代码,但非锁屏应用程序仅在设备接入 A/C 电源时才能注册为每隔 15 分钟运行代码。
当 Windows 8 发布时,将面临前所未有的众多 PC 种类。其中许多将具有与目前运行 Windows 7 的设备相同的电源选项。除了彻底关闭外,它们还可以根据需要或在一段闲置期后进入“睡眠”状态。在睡眠状态下,所有系统活动将彻底挂起。
在具有睡眠功能(默认设置)的 PC 上运行的应用程序
在上图中我们可以看到,在 PC 睡眠前的闲置期,桌面应用程序将继续按照与所有 Windows 版本中相同的方式继续运行,同时 Metro 风格的应用程序将按照稍早前介绍的受控方式运行。当 PC 进入睡眠模式后,桌面应用程序和 Metro 风格的应用程序都将彻底挂起。这将有助于延长电池寿命,计算机进入睡眠模式后,消耗的电量将非常少。但这样做不利于数据刷新,因为当计算机进入睡眠状态时,将不会更新实时图块、下载新电子邮件或准备好向您发送警报及其他通知。
Pat 在他的博文中已经提到,我们针对很少完全关闭的新型 PC 提供了一种类似智能手机的电源状态。这些有趣的 PC 通常基于“片上系统”(SoC) 体系结构构建,进入闲置期后,它们不会关闭,而是在保持运行的同时进入一种能耗极低的状态。这种新的状态被称为“连接待命”。该功能可支持某些常见的连接情境,例如,始终更新电子邮件,并能够接收即时消息或来电,同时还能提供惊人的电池寿命。下图显示了桌面应用程序和 Metro 风格的应用程序在连接待命状态下的行为。但为了真正提高工作效率,我们不得不同时考虑 Metro 风格的应用程序(您已经看到,我们可以非常有效地确保节约系统资源)和桌面应用程序,这对于桌面应用程序来说比较困难,因为它们已经过多年的完善,旨在以全(在前台运行时)或无(当 PC 进入睡眠模式时)的方式访问系统资源。
在具有连接待命功能的 PC 上运行的应用程序
为此,我们在 Windows 8 中加入了一种名为“桌面活动审查器”的新组件,该组件只会在这些具有连接待命功能的新平台上运行。此组件旨在减少设备进入连接待命状态后桌面应用程序所使用的资源。如果我们允许应用程序在这种低能耗模式下不受抑制地继续运行,PC 的电量将更快耗尽。因此,我们会挂起桌面应用程序,阻止其使用资源,并尽量延长电池寿命。从应用程序的角度来看,这与 PC 进入睡眠状态的情形别无二致。当 PC 从连接待命状态中唤醒时,应用程序将按照 PC 从睡眠状态中唤醒时的模式恢复。
此外,系统中还有几种连接待命状态所需的组件,我们不能将其挂起。这些组件包括驱动程序、某些收件箱和第 3 方服务,当然,还有我们之前提到的使用后台资源的 Metro 风格应用程序。这些组件提供的功能包括:当您返回设备时,响应用户的输入,或提供网络功能。我们对这些功能进行了谨慎的评估,以确保它们不会对电池寿命造成影响,然后才允许其在连接待命状态下运行。此外,还有一系列进程需要保持运行,以响应系统的活动。这些进程将在受到抑制的情况下短期运行,直到某种后台活动启动后,它们才会不受抑制地运行。此类进程的典型示例是反病毒产品,它们经常会为了响应某种系统活动而进行扫描。当通过后台机制进行接收电子邮件等活动时,反病毒产品将不受抑制的运行。但在未发生传入网络活动的大部分时间,这些组件将受到抑制,以便尽量减少对电池寿命的影响。
您可以看到,我们在设计 Windows 8 时投入了大量的精力来延长电池寿命。我们开发出了全新的应用程序模型,以便在支持连接体验的同时提供始终如一的长久电池寿命。针对 Windows 7 设计的应用程序将继续按照原有的模式工作,而新的 Metro 风格应用程序可以利用操作系统提供的后台基础架构,开发出更加高效节能的全新连接体验。
-- Sharif Farag 和 Ben Srour