用于远程可视合成的协议的制作方法

文档序号:7604510阅读:336来源:国知局

专利名称::用于远程可视合成的协议的制作方法
技术领域
:本发明一般涉及电子数据处理,尤其涉及管理计算机系统中的图形和控制信息流。
背景技术
:基于数字多媒体、在数字设备上观看的数字格式的视频和音频合成、以及诸如图像和动画的数字媒体在性能和产量上正在快速增长。当今制造的几乎每一台个人计算机都包括某些形式的多媒体。诸如照相机、录影机、电话、电视等数字产品的销售在稳定增长。当因特网的成长在稳定快速地继续时,多媒体在因特网领域内也变得越来越流行。这些基于计算机技术的持续发展已不仅导致性能的增强,而且还导致这种计算机设备的用户对性能有了更高的期望。本行业已经以CDROM盘、通信调制解调器、以及更快的视频和音频卡来响应增长速度。增加的用户期望则不仅扩展到硬件能力,还扩展到数据的处理能力。例如,在诸如多媒体和音频压縮的领域中,对数据进行处理从而使它被处理成稳定和持续的流。该数据可在诸如电视会议、游戏、数字视频盘(DVD)、专业音频、电话的领域中使用,也可在对音频、视频、或音频和视频进行数字处理的其它领域中使用。呈现(rendering)数据几乎总是需要系统中各个模块之间的某些处理形式。例如,一视频片断可能需要在专用硬件模块中解码、在另一硬件模块中位图化视频字段、在软件模块中数字滤波音频、由另一软件模块插入副标头、由软件模块解析音频数据以跳过无声时段等等。要使流传送工作,必须将数据处理成稳定流然后呈现为音频和/或视频。然而,如果数据未进行足够快的处理,数据的表示就不流畅了。在常规的客户机-服务器呈现中,数据在服务器上得到处理,并以离散虚拟的帧的形式向在其上呈现帧的客户机发送。即使呈现条目中没有改变,每个帧仍然都包含呈现该帧所需的全部数据和信息。例如,即使帧与相邻帧完全相同,每个动画帧仍然具有要呈现该帧的全部数据和信息。结果,数据的传送消耗了大量的可用带宽。该带宽消耗减少了服务器可支持的客户机数量。另外,不能利用客户机上的硬件来处理数据。例如,处理数据的服务器不具有使用客户机硬件的硬件特征的能力,诸如3D通信加速器。
发明内容本发明提供了创建和控制远程装置上合成的方法和协议。该协议使服务器和其它装置能够利用远程装置的处理能力,来合成远程显示装置上的视觉内容。这使服务器能处理多个客户机,因为服务器无需处理用以真正呈现合成的功能(例如绘、画、动画等等)。这导致能够发挥更多客户机侧硬件的能力,诸如客户机的3D硬件加速管道以及客户机CPU。例如,客户机能处理动画功能,它使服务器能够向客户机发送描述动画功能的信息,而不是发送组成整个动画效果的单个静态帧。协议提供基本的髙层命令包,使应用程序能够在媒体上传送在客户机装置上创建合成的命令。这些包的有效载荷可包含用于使装置上的组件创建合成的真正命令。请求应用程序发送创建合成服务、创建呈现目标和呈现环境、创建合成节点、创建合成节点的资源、以及呈现合成的命令包。来自请求应用程序的包是资源命令包和控制包。资源命令包被路由到客户机使的相关资源。使用控制包来控制合成状态并维护客户机上的文本字形高速缓存。通知包被发送回请求应用程序。参照附图阅读说明性实施例的以下详述,本发明的附加特征和优点将显然。尽管所附权利要求书以特性陈述了本发明的特征,参照附图阅读以下详细说明书,本发明及其对象和优点可得到最佳的理解图1是一般示出本发明驻留其中的示例性计算机系统的框图2a是示出两个代码分段之间编程接口的简化框图2b是示出两个代码分段之间编程接口可选实施例的简化框图3a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有分成多个离散通信的通信,示出了分解(factoring)的概念;图3b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段具有分成多个离散通信的通信,示出了分解的概念;图4a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有略去、添加、或重新定义的某些方面,示出了重新定义的概念;图4b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段具有略去、添加、或重新定义的某些方面,示出了重新定义的概念;图5a是示出两个代码分段之间编程接口的简化框图,其中该代码分段具有使两个代码模块的某些功能合并,从而它们之间的接口改变形式,示出了串联编码的概念;图5b是示出两个代码分段之间编程接口可选实施例的简化框图,其中该代码分段使两个代码模块的某些功能合并,从而它们之间的接口改变形式,示出了内编码的概念;图6a是示出两个代码分段之间编程接口的简化框图,其中通信通过间接地将该通信分成多个离散通信来完成,示出了分离的概念;图6b是示出两个代码分段之间编程接口可选实施例的简化框图,其中通信通过间接地将该通信分成多个离散通信来完成,示出了分离的概念;图7a是示出动态地重写代码以用其它东西替换编程接口而获取相同结果的简化框图,其中示出了重写的概念;图7b是示出动态地重写代码以用其它东西替换编程接口而获取相同结果的可选实施例的简化框图,其中示出了重写的概念;图8是一般示出本发明在其中操作的示例性环境的框图9是一般示出本发明在其中操作的可选示例性环境的框图io是示出根据本发明教导创建一合成的步骤的流程图。具体实施例方式本发明提供服务器将合成处理的各方面卸载到客户机的能力。这导致服务器侧可升级性的增加。通信协议的高层描述性质导致比用直接模式模型发送数据的情形少得多的数据和信息被发送到客户机中用于呈现数据。在描述本发明细节之前,将描述本发明可在其中实现的示例性装置和本发明可在其中操作的环境的纵览。参照附图,其中相似标记号指向相似元件,本发明被示为在适当计算环境中实现。尽管不是必需的,本发明将在由诸如客户机工作站或服务器的计算机执行的诸如程序模块的计算机可执行指令的一般环境中进行说明。通常,程序模块包括执行特定任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。此外,本领域技术人员将理解本发明可在其它计算机系统配置中实践,包括手持式装置、多处理器系统、基于微处理器的或可编程的消费品电器、网络PC、迷你计算机、大型计算机等等。本发明还可在任务由经通信网络链接远程处理装置执行的分布式计算环境中实践。在分布式计算环境中,程序模块可被置于本地和远程存储器存储设备中。图1示出了本发明可在其上实现的适当的计算系统环境100的示例。该计算系统环境100仅是适当计算环境的一个示例,并非旨在提出对本发明使用或功能性范围作任何限制。计算环境100也不应被解释为对示例性操作环境100中所示的任一组件或其组合有任何依赖性或任何需求。本发明也可在很多其它通用或专用计算系统环境或配置中操作。适于本发明使用的众所周知的计算系统、环境、和/或配置的示例包括,但不限于,个人计算机、服务器计算机、手持式或膝上型装置、书写板装置、多处理器系统、基于微处理器的系统、置顶盒、可编程消费品电器、网络PC、迷你计算机、大型机、包括任一种以上系统或设备的分布式计算环境等等。本发明可以计算机可执行指令的一般环境进行说明,诸如由计算机执行的程序模块。一般而言,程序模块包括执行具体任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。本发明还可在任务由经通信网络连接的远程处理装置执行的分布式计算环境中实践。在分布式计算环境中,程序模块可置于包括存储器存储设备的本地和远程计算机存储介质中。参照图1,实现本发明的示例性系统包括以计算机iio形式的通用计算装置。计算机110的组件可包括,但不限于,处理单元120、系统存储器130以及把包括系统存储器在内的各种系统组件耦合到处理单元120的系统总线121。系统总线121可能是若干总线结构类型中的任何一种,包括存储器总线或存储器控制器、外围总线、以及使用多种总线架构的任一种的本地总线。作为示例,而非限制,这些架构包括工业标准架构(ISA)总线、微信道架构(MCA)总线、增强型ISA(EISA)总线、视频电子标准协会(VESA)局部总线和也称为Mezzanine总线的外围部件互连(PCI)总线。计算机110通常包括各种计算机可读介质。计算机可读介质可以是能被计算机110访问的任何可用介质,并包括易失性和非易失性介质、可移动和不可移动介质。作为示例,而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实现、用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的易失性和非易失性介质、可移动和不可移动介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字化多功能光盘(DVD)或其它光学存储技术、磁盒、磁带、磁盘存储器或其它磁性存储设备、或任何其它可用于存储所需信息并可由计算机110访问的介质。通信介质通常在诸如载波或其它传输机制的已调制数据信号中体现计算机可读指令、数据结构、程序模块、或其它数据,且包括任何信息输送介质。术语"已调制数据信号"意指在信号中用对信息编码方式设置或改变其一个或多个特征的信号。作为示例,而非限制,通信介质包括诸如有线网络或直线连接的有线介质,和诸如声学、射频、红外线和其它无线介质的无线介质。以上任何介质的合成也应包括在计算机可读介质的范围中。系统存储器130包括诸如只读存储器(ROM)131和随机存取存储器(RAM)132的易失性和/或非易失性存储器形式的计算机可读介质。包含有助于计算机110如起动时在元件间传送信息的基本例程的基本输入/输出系统(BIOS)133通常存储在ROM131中。RAM132通常包含可被处理单元120立即访问和/或当时正被操作的数据和/或程序模块。作为示例,而非限制,图l示出了操作系统134、应用程序135、其它程序模块136、和程序数据137。计算机110还可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。作为示例,图1图示了读取和写入不可移动、非易失性磁性介质的硬盘驱动器141,读取和写入可移动、非易失性磁盘152的磁盘驱动器151,读取和写入可移动、非易失性光盘156,诸如CD-ROM或其它光学介质的光盘驱动器155。其它也用在示例性计算环境中的可移动/不可移动、易失性/非易失性计算机存储介质包括,但不限于,如磁带、闪存卡、数字化视频光盘、数字化录像带、固态RAM、固态ROM等等。硬盘驱动器141通常通过诸如接口140的不可移动存储器接口与系统总线121连接,而磁盘驱动器151和光盘驱动器155通常通过诸如接口150的可移动存储器接口与系统总线121连接。如上所述并如图1所示的驱动器及其相关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块、和其它数据的存储。在图1中,例如,硬盘驱动器141被示为存储操作系统144、应用程序145、其它程序模块146、和程序数据147。注意这些组件可以与操作系统134、应用程序135、其它程序模块136、和程序数据137相同或不同。在此给予操作系统144、应用程序145、其它程序模块146、和程序数据147的数字不同至少说明他们是不同的副本。用户可通过输入装置如键盘162、通常是指鼠标、跟踪球或触摸板等的定位装置161、话筒163、以及书写板或电子数字化仪164向计算机110输入命令和信息。其它输入装置(未示出)可包括游戏杆、游戏垫、卫星接收器、扫描仪等等。这些和其它输入设备常常通过与系统总线耦合的用户输入接口160与处理单元120相连,但也可通过诸如并行端口、游戏端口或通用串行总线(USB)的其它接口连接。监视器191或其它类型的显示设备也可通过诸如视频接口190的接口与系统总线121相连。监视器191还可与触摸屏面板等等集成。注意监视器和/或触摸屏面板可物理地与装有计算装置110的外壳相耦合,诸如书写板类型的个人计算机。另外,诸如计算装置110的计算机还可包括诸如扬声器197和打印机196的其它输出设备,它们通过输出外围接口194等等相连。计算机110可以在使用与一台或多台远程计算机,诸如远程计算机180的逻辑连接的网络化环境中运行。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等装置或其它公共网络节点,而且通常包括上述与个人计算机110相关的许多或全部组件,尽管在图1中仅图示了存储器存储设备181。图1中所描绘的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。这样的网络化环境在办公室、企业范围计算机网络、企业内部互联网和因特网上是常见的。例如,计算机系统110可包括数据源自的源机器,而远程计算机180则可包括目标机器。当用于LAN网络化环境中时,计算机IIO通过网络接口或适配器170与局域网171连接。当用于WAN网络化环境中时,计算机IIO通常包括调制解调器172或其它用于在广域网173,诸如因特网中建立通信的装置。可以是内置式或外置式的调制解调器172与系统总线121通过用户输入接口160或其它适当机制连接。在网络化环境中,与计算机110相关的程序模块或其一部分可存储在远程存储器存储装置中。作为示例,而非限制,图1示出了驻留于远程计算机180中的远程应用程序185。应当理解,所示网络连接是示例性的,且其它用于在计算机间建立通信连接的技术也可以使用。应注意,编程接口(或更简称为接口)可被视为使一个或多个代码分段能与一个或多个其它代码分段通信,或能访问其所提供的功能性的任意机制、进程、和协议。或者,编程接口可被视为一系统组件的能够与其它组件的一个或多个机制、方法、函数调用、模块等通信耦合的一个或多个机制、方法、函数调用、模块、对象等。前面句子中的术语"代码分段"旨在包括一个或多个指令或代码行,并包括例如代码模块、对象、子程序、函数等等,无论所应用的是何种术语,或者是否单独编译代码分段,或者代码分段是否被提供为源、中间体、或对象代码,或者是否在运行时系统或进程中利用代码分段,或者它们是否位于同一机器或不同机器或分布在多个机器上,或者代码分段所表示的功能是否整个地在软件中、硬件中、还是硬件和软件的合成中实现。在概念上,编程接口一般可如图2a或2b所示。图2a示出接口1为第一代码分段和第二代码分段通信的通道。图2b示出包括接口对象II和12的一接口,使得系统的第一和第二代码分段能通过媒体M通信。在图2b的视图中,可将接口对象II和12视为同一系统的独立接口,也可视为对象II和12加上媒体M组成了接口。尽管图2a和2b示出了双向流和流每一侧上的接口,某些实现可仅具有单向的信息流(或如以下所述的无信息流),或者可仅在一侧具有接口对象。作为示例,而非限制,诸如应用程序编程接口(API)、进入点、方法、函数、子程序、远程过程调用、以及组件对象模型(COM)接口的术语,都被包括在编程接口的定义中。这种编程接口的各个方面可包括第一代码分段向第二代码分段传送信息(其中在最广泛意义上使用"信息",并包括数据、命令、请求等)的方法;第二代码分段接收信息的方法;以及信息的结构、序列、语法、组织、模式、信息的定时、和内容。这样,不管媒体是有线、无线、或两者合成,只要信息以接口定义的方式传输,基层的传输媒体本身对接口的操作就不重要了。在某些情况中,信息不在常规意义上的一个方向或两个方向上传递,因为当一代码分段仅访问由第二代码分段执行的功能时,信息传递可通过另一机制(例如信息置于与代码分段之间与信息流分开的缓存器、文件等)进行或者不存在。任意或所有这些方面在给定情况中可能是重要的,例如,取决于代码分段是否是松散耦合或紧密耦合配置中系统的一部分,因此该列表应被视为是说明性且非限制的。该编程接口的概念对本领域技术人员是众所周知的,且在本发明以上详细描述中显然。然而,可有实现编程接口的其它方法,并且除非被确切排除,它们也将被包括在本说明书结束处陈述的权利要求书中。这些其它方法会显得比图2a和2b的简化视图更深奥或更复杂,但即便如此它们仍执行完成相同总体结果的相似功能。我们将简要描述编程接口的部分说明性任选实施例。A.分解通过将通信分成多个离散通信可间接地完成从一个代码分段到另一代码分段的通信。这在图3a和3b中进行示意描述。如图所示,可根据可划分功能组来描述某些接口。因而,可分解图2a和2b的接口功能以获取同样的结果,正如数学上可提供24,或者为2x2x3x2。相应地,如图3a所示,可划分由接口1提供的功能以将该接口的通信转换成多个接口接口1A、接口1B、接口1C等而获取同样的结果。如图3b所示,可再次将接口I1提供的功能划分成多个接口Ila、Ilb、Ilc等而获取同样的结果。类似地,从第一代码分段接收信息的第二代码分段的接口12也可被分解成多个接口I2a、12b、12c等。在分解时,包括在第一代码分段中的接口数量不需要匹配包括在第二代码分段中的接口数量。在图3a和3b的任一情形中,接口1和II的功能实质分别与图2a和2b的一样。接口的分解也可遵从结合、交换、以及其它数学属性使得分解难以识别。例如,操作的顺序在某些应用中并不重要,且因而由接口实现的功能可在到达接口之前由另一代码或接口很好地实现,或者由系统的独立组件执行。此外,编程领域技术人员可理解,有各种各样获取同样结果而作不同函数调用的方法。B.重新定义在某些情形中,略去、添加、或重新定义编程接口的某些方面(例如参数)而仍完成所要结果是可能的。这如图4a和4b所示。例如,假设图2a的接口l包括一函数调用Square(input,precision,output),它包括三个参数input(输入),precision(精度)和output(输出),并从第一代码分段发往第二代码分段。如果中间参数precision在给定情形中无关紧要,如图4a所示,则可略去它甚至用meaningless(无意义)参数替换它(在此情形中)。也可添加不重要的additional(附加)参数。在任一情形中,只要在输入由第二代码分段进行square(平方)之后返回输出,就可获得square的功能。对计算机系统某些下游部分或其它部分precision可以是非常好的有意义的参数;然而,一旦认为precision对于计算square的有限目的而言是不必要的,则替换或略去它。例如,替代传送有效的precision值,可传送诸如生日的无意义值而不会不利地影响结果。类似地,如图4b所示,由接口Il'替换接口Il,它进行了对接口略去或添加参数的重新定义。接口I2可类似地被替换为接口12',它进行了略去不必要参数或在其它地方进行处理的参数的重新定义。此处的要点是,在某些情形中,编程接口可包括某些目的所不需要的一些方面,诸如参数,因此可略去或重新定义它们,或者在其它地方进行处理用于其它目的。C.串联编码合并两个独立代码模块的部分或所有功能从而使它们之间的"接口"改变形式也是可行的。例如,可将图2a和2b的功能分别转换成图5a和5b的功能。在图5a中,先前图2a的第一代码分段和第二代码分段被合并成一包含它们的模块。在此情形中,代码分段仍然可互相通信,但接口则被调整为更适于单个模块的形式。因而,例如,正式的调用和返回语句不再必要,但是依照接口1的类似处理或响应仍然有效。类似地,如图5b所示,图2b的接口I2的一部分可被写入I1内以形成接口I1'。如图所示,接口12被划分成I2a和I2b,而接口部分I2a被编码在接口II内以形成接口Il'。作为具体示例,考虑图2b的接口II执行函数调用square(i叩ut,output),它在由第二代码分段处理用input传送的值(以平方之)之后由接口I2接收,并用output传送回平方后的值。在此情形中,由第二代码分段(平方input)执行的处理无需调用接口就可由第一代码分段执行。D.分离通过将通信分成多个离散通信可间接地完成从一个代码分段到另一代码分段的通信。这在图6a和6b中进行示意描述。如图6a所示,提供一个或多个中间件(分离接口,因为它们从原始接口中分离功能和/或接口功能)以转换第一接口接口1上的通信以使它们遵从一不同接口(在此情形中为接口2A、接口2B和接口2C)。可这样完成例如,有己安装的应用程序基础根据接口l协议被设计为与操作系统通信,但是随后操作系统被更改成使用一不同接口(在此情形中为接口2A、接口2B和接口2C)。要点是,由第二代码分段使用的原始接口被更改,从而它不再与第一代码分段使用的接口兼容,且因而使用一中间体使得新旧接口兼容。类似地,如图6b所示,可将分离接口DI1引入第三代码分段以接收来自接口II的通信,并引入分离接口DI2以将接口功能传送给例如经重新设计与DI2—起工作的接口12a和I2b,而仍提供同样的功能结果。类似地,DIl和DI2可一起工作以将图2b接口II和12的功能翻译成一新操作系统,而仍提供同样的或相似的功能结果。E.重写另一可能变体是动态地重写代码以用其它东西替换接口功能而仍提供同样的总体结果。例如,可有一系统,其中以中间语言(例如微软IL、JavaByteCode等)呈现的代码分段被提供给执行环境中的运行时(JIT)编译器或解释器(诸如由.Net框架、Java运行时环境、或其它类似运行时类型环境所提供的)。可编写JIT编译器以动态转换从第一代码分段到第二代码分段的通信,即让它们遵从第二代码分段(原始或不同的第二代码分段)所需的一不同接口。这在图7a和7b中描述。如图7a所示,该方法类似于上述分离情形。可这样完成例如,其中已安装的应用程序基础根据接口1协议被设计为与操作系统通信,但是随后操作系统被更改成使用一不同接口。可使用JIT编译器以遵从已安装了基础的应用程序到操作系统新接口在运行中的通信。如图7b所示,动态地重写接口的方法可被应用于动态分解,或用其它方法改变接口。还要注意,用于通过任选实施例获取与接口相同或相似结果的上述情形也可以各种方法合成,串行地和/或并行地,或者用其它介入代码。因而,以上呈现的任选实施例并非互相排斥,而是可以加以混合、匹配和合成以产生与图2a和2b所示一般情形相同或等效的情形。还要注意,由于使用大多数编程结构,有许多未在此描述的可获取接口相同或相似功能的其它类似方法,但虽然如此仍可由本发明的精神和范围来表示,即,要注意,在接口值之下的接口至少代表部分功能,并使能有利结果。在以下描述中,本发明将参照一个或多个计算机所执行的操作的和动作符号表示来描述,除非另有指明。这样,可以理解,这种经常被称为是计算机可执行的动作和操作,包括由以结构化形式表示数据的电子信号计算机的处理单元进行的操纵。这种操纵转换数据或将其保持在计算机存储器系统的单元中,这可用本领域技术人员众所周知的方式来重新配置或以其它方式改变计算机的操作。保持数据的数据结构是具有由数据格式定义的特定属性的存储器物理单元。然而,尽管本发明在前述环境中进行描述,但这并非旨在作出限制,因为本领域技术人员将理解此后所述的各种动作和操作也可在硬件中实现。现在参照图8,示出了本发明在其中操作的示例性环境200。应用程序202、204驻留在服务器206上。窗口管理器208使人操作、组织窗口,并执行诸如移动窗口、调整窗口尺寸、去除窗口、用标题栏或其它使以上操作简易化的条目装饰窗口等的操作。应用程序202、204创建了可视树以指示应用程序如何显示一条目(例如文本文档、图形、动画等)。可视树表示由图形系统呈现给媒体(例如显示器、打印机、平面等)的一数据结构。当呈现可视树时,可视树中的数据是在使用应用程序时用户在显示屏的应用程序区域看到的"情景"。应用程序202、204保留对它们相应视觉树的控制,以控制在显示装置(例如监视器191)上发生在应用程序显示区域的事件。应用程序202、204通过接口228向进行中合成循环呈现其可视树输出。该输出被用以建立应用程序可视树的子树。该子树被合成为一平面,而该平面被呈现给窗口管理器208用于桌面合成。然后窗口管理器208基于显示屏上应用程序的可视性来评估将要显示的和不会显示的,而基于该评估创建了一组合成树214、216。合成树独立于可视树而被呈现。合成树包括从可视树编译的用户将在显示装置上见到的所有元素。例如,如果创建了文档的可视树,合成树将是要显示的那部分文档。本发明允许远程创建和操作合成树,而无需在服务器上创建合成树。尽管本发明根据远程创建和操作合成树来描述,可以理解可使用本发明在图8服务器上创建并呈现各合成。现在参照图9,服务器206上的应用程序202、204在客户机装置220上显示。尽管仅示出了一客户机装置,可以理解可使用任何数量的客户机装置。通过使用包的信道232,应用程序202、204和窗口管理器208使用接口228经网络230分别与合成模块222-226通信。可连同单个应用程序领域使用的合成模块数量按需可为任意数量。注意服务器206和客户机220无需通过网络或任意其它方式连接,相反,数据可通过能由服务器平台写入而由客户机平台读取的任何媒体来传送。在一实施例中,包用远程数据协议来封装,以向客户机220发送创建合成树214、216的信息。每个包中置入标识符以标识哪个合成模块222-226是该包的目标。组件234将包多路分离,并将包发送给模块222-226的适当的变化队列240、242、244。本发明的装置无关协议向应用程序和客户机提供通过信道232与服务器的接口以合成内容。内容的类型包括资源命令包和控制包。资源类型包括笔、画刷、位图、字形、视频片断、几何图形(椭圆、长方形、方框、圆等)、动画、存储等。合成节点是客户机应用程序可用的空间容量的基本单元。客户机创建其合成服务上的合成节点。一合成节点可包含一个或多个资源。总是有一个表示屏幕内容或桌面的根合成节点。有一个或多个表示屏幕以外合成的合成节点。在以下描述中,将通过典型的调用序列来描述装置无关协议。通信是异步的。使用了特定的连接、重新连接、以及断开语义。应用程序202、204、208分别与存在于客户机220上的合成模块222、224通信。通常单个连接会起动并在应用程序的使用寿命期间保持,因为连接和断开连接是昂贵的操作,且与客户机上合成模块的通信可能比较频繁。保持连接的成本比重复断开和连接的成本低得多。服务器应用程序202、204、208和合成模块222-226之间的通信是以包形式进行的。服务器应用程序202、204、208与客户机220连接,并开始发送包。包可以是资源包、控制包、以及批处理包。使用资源包来创建资源和更新资源。使用控制包来控制合成状态并在客户机220上维护一文本字形位图缓存器。使用批处理包来原子化地应用多个更改。一创建批命令被发送给客户机220以指示一批处理的开始。合成模块积累请求直至批处理被"终止"。通过发送批处理结束/呈现包结束该批处理。此时,合成服务开始处理命令。合成服务中的变化队列保持批处理化结构以便确保各变化原子化地发生。现在参照图10,示出了创建和控制合成的步骤。将使用服务器应用程序202来描述这些步骤。本领域技术人员理解可使用任意代码分段。创建一合成模块(步骤300)。合成模块负责呈现已创建的连接的合成。创建产生一资源命令的一呈现目标,该资源命令创建一呈现目标资源(步骤302),并且创建与呈现目标资源相关联的呈现环境(步骤304)。呈现目标是用于呈现资源的目的地目标。创建一合成节点(步骤306)。然后创建资源(步骤308)并呈现合成(步骤310)。合成利用了简单和复合资源的组合以便向目标呈现内容。简单资源是自包含的,且对任何其它资源没有直接的依赖。复合资源指其它依赖性资源。复合资源的一个示例是"描绘数据"资源。"描绘数据"资源由可随后引用诸如画刷、笔、或几何图形描述的其它资源的描绘指令的保留列表组成。使用描绘数据资源来编码在其它资源帮助下执行的描绘操作。描绘数据资源与合成节点相关联,它们具有在空间上本地化这些描绘操作的任务。当需要更新一合成时,发送一更新命令(步骤312)。更新可添加资源或更新资源。可能需要删除特定的合成并创建新的合成。例如,如果合成是文本文档,如果关闭文本文档则删除该合成。如果要删除该合成,向合成服务发送一解除命令(步骤314)。动画在平台上是渗透性的。通过使客户机能采取估算和展现动画的全部责任,本发明在一实施例中提供了可縮放的动画。这在许多情形中是满足需要的,特别是在动画较复杂或动画目标需要未经加速的一组操作(诸如镶嵌式铺装)发生时。对于某些低成本、高可视性的用户接口效果,诸如动漫,允许这些操作在一链合成过程中发生是有意义的。在此情形中,应用程序202将采样高层动画函数,并向合成服务提供一系列与资源相关联的经时间标记的值作为请求。这些表示资源要进行动画的间隔,以及该间隔保持活动的时间线的两个端点。应用程序202发送更新资源包以更新一资源值。注意该序列掩饰了基层的复杂性。合成模块将经时间标记的值标准化为合成服务的全局时间线,而合成管理器(未示出)在合成到呈现目标期间将更新块插入适当资源。对于每个已合成帧,合成模块将估算资源的间隔以导出瞬时值。既然己描述了编程接口的总体结构,将描述资源和控制命令包。使用控制包来控制合成状态并维护由客户机220上合成模块使用的字形缓存器。控帝U包是Resource—Command—Null、Resource—Command—Release、Resource—Command_Shutdown、Resource—Command—Synchronize、Resource—Command—Status、Resource—Command—Add_Glyph_Bitmaps、Resource_Command一Free—Glyph—Bitmaps、以及Resource—Command—Flush—Queue。Resource—Command—Release释放了一资源。Resource—Command—Shutdown关闭了合成模块并删除了与该合成模块相关联的一切。Resource—CommancLSynchronize删除与该合成模块相关联的一切以开始刷新。Resource—Command—Status向合成模块发送一状态消息。Resource—Command—Add—Glyph_Bitmaps向字形缓存器添加位图。Resource_Command—Free_Glyph—Bitmaps从字形缓冲器移除位图。Resource_Command_Flush—Queue排空变化队列。维持一从客户机220向服务器206传回通知包的通知队列。它们可以是以下类型Notification—Resource—Deleted、Notification一Shutdown、Notification—Synchronize、Notification—Status、以及Notification—Error。使用资源命令包来呈现资源。资源可被定义为"用于呈现要求不同分辨率和/或物理装置的不同实现的一情景的所需要的任一对象;在一合成树上使用多次的;或者可独立于其用户通过动画而变化的"。资源能够串行化本身、应用更新、并提供特定分辨率和装置的实现。资源类型包括空、存储、描绘数据、位图、字形、顶点、时间线、双重动画、色彩动画、点动画、长方形动画、尺寸动画、双重动画集、色彩动画集、点动画集、长方形动画集、尺寸动画集、变换、双重、色彩、点、长方形、尺寸、梯度、画刷、图、几何图形、笔、视频、Composition—Node、Composition—Context、图f象、Hwnd—Composition—Target、以及Intermediate—Composition—Target。使用Hwnd一Composition一Target来向窗口呈现。使用Intermediate—Composition—Target用于屏幕以外的呈现。通常无需回调,发送给合成模块的资源就可以由合成模块直接实现。如果不可直接实现,发送所需实现。要实现类似"文本"和"图像"的资源是昂贵的(根据处理开销)并因此转换成在合成树上使用的适当"准备呈现"形式。将资源转换成准备呈现形式节约了在合成模块中合成的开销。如果需要任何对用户代码的回调,资源也可被转换成适当的"准备呈现"形式。可由合成模块有效地镶嵌式铺装成正确分辨率的其它类似"几何图形"资源在需要时由合成模块本身实现。通常资源被分成一些类型,诸如绘图资源、值资源、以及结构资源。绘图资源是由描绘层定义的对象,且可直接由该层使用。绘图资源的示例包括描绘数据、位图、图像、字形、几何图形、以及画刷。具有很低并给定描绘成本的绘图资源可在直接来自与装置和分辨率无关的资源数据的合成期间得以实现。几何图形是简单的绘图资源,因为它在合成模块的合成循环中可有效地镶嵌式铺装成所需的最终分辨率。相反,复杂的绘图资源需要复杂的计算、对用户代码的回调、或者输入/输出以产生实现。在一实施例中,复杂的绘图资源不由合成模块实现。相反,适当的实现由应用程序202、204和/或服务器206在合成之前提供。"图像"是复杂资源的一个示例。图像从盘上读取、解码、以适当分辨率采样、并进行过滤。值资源表示由另一资源使用的简单的可变或动态值。值资源的示例是双重、点、色彩、以及变换。例如,描绘数据资源可指要画线的点资源,其中点之一期望通过动画或应用程序的强制指向而变化。如果值资源可变动,则值资源包含定义该值如何随时间变化的动画间隔数据。结构资源是在合成过程中起作用的对象,但并非直接是呈现的一部分。这些对象被实现为资源,从而它们可通过变化队列参与更新,并使用值资源来更新间隔值。经标识的结构资源包括合成节点。一般而言,必须在被使用之前实现资源。实现可被称为"适于给定分辨率的并准备由特定装置使用的资源表示"。实现的一个示例是经镶嵌式铺装成三角形的具有特定分辨率和变形的几何图形,并可能已载入到视频卡上的顶端缓存。实现在合成模块中按需创建,或者在服务器206上创建并传送给合成模块。如果所需资源实现未发现或创建,则通过通知队列将通知在服务器206上排队。该通知指示资源句柄、变换、以及所需装置、以及所使用实现的任何变形。包具有如下所示的结构MIL—PACKET_TYPEpacketType;HMIL一RESOUHGEresHandle;MIL—RESOURCE—TYPEtype;DWORDsize;hitmarshalType',其中MiLPacket一Type是批处理包、控制包、或者资源包之一。HMIL—Resource句柄必须具有资源的适当类型。这些句柄标记必须用于资源、环境、或合成节点(例如compnode)。Mil一ResourceJType是如上所述的资源类型(例如位图、变形、几何图形等)。附加于包的是用以指令合成服务执行任务的命令。这使得第三方供应商提供自己的代码以操作其合成服务。一种这样的实现如下。//HRESULTCMilResourceBrushSolidColorData::MarshalDataCorestructBrushSolidColorPacketM工Ii一COLORFcolr'-HMIIj一RESOURCEhColor/}一/*HRESULTCMilResourceBrushSolidColorData::MarshalDataCore(IMilTransporpEncoder)HRESULThr-S—OK;Assert(NULL!=pEncoder)'-//CallbasemethodbeforeourownCMilResourceBrushData::MarshalDataCore(pEncoder)pEncoder->AddColor(&(m一brushSolidData,color))〖pEncoder->AddResource(m一brushSolidData.hColor),-Cleanup:RRETURN(hr);//HRESULTCMilResourceBrushLinearGradient::MarshalstructBrushLinearGradientPacket:Packetintbrushtype=MilUceBrushTypeliinearGradientfloatAlpha,.HMIL一RESOURCEhTransform/floatbeginPoint3t〖floatbeginPointy,'HM工Ii一RESOURCEhBeginPoint/floatendPointx,'floatendPointyHMIIi一RESOURCEhEndPoint;intwrapMode'-HM工Ij一RESOURCEhG:radient'-intbGammaCorrectintbAdjustToObject//CMilResourceBrushData::MarshalDatastructBrushDataPacket:Packetintbrushtype,'doubledblOpacity'-HM工L一RESOURCEhOpacity'-HM工L二RESOURCEhTransform,'<table>tableseeoriginaldocumentpage19</column></row><table>intmarshalType-MilAnimatedValueMarshalAux;HMIL—RESOURCEhAnimationCollectiori;intoffsetToValue/intsizeOfValue-sizeof(TValue〉intoffsetToBaseValueintsizeOfBaseValue=sizeof(TValue)zstructMasterAnimationCollectionPacket:PacketintcAnimationsHM工、RESOURCEh.andleArray;//for(riAnimation',0;nAnimation<m—cAnimations;nAnimation++)〃{//pEncoder->AddResource(m—rghAnimations[nAnimation])7—〃}structMasterAnimationPacket:Packetintanimtype=MilAnimationCopyHMIL—RESOURCEhTimeline///m一animationData.WriteData(pEncoder);//TMilMasterValue<TValue,ResType>::SendUpdatePacket(structMasterValueUpdatePacketjPacketintvalueType-MilValueMarshalin仁auxType=MilValueMarshalAux'.in仁size,'//sizeof(TValue)//resrvememoryforvaluecopy,structTMilAnimationDataPacket:Packetint:animationTypeintinterpolationMethod'-BYTEf工sAdditive,'BYTEfIsAccumulating'-UINTcValues;//nextspacevaluesandkeytimes.//pEncoder->AddMemory(m一rgValues,size:of(TValue)*tn—cValues)〃pEncoder->AddMetuory(m—rgKeyTimes,sijzeof(double)*m一cValues),BYTEfHasKeySplinePoints丁一//Next:spaceforsplinepoints,//if(m—rgKeySplinePoints)〃{—//pEncoder->AddByte((BYTE)TRUE);//pEncoder->AddMemory(//m—rgKeySplinePoints,//sizeof(MIL—2DPOINTD)*2*(m—cValues-1));〃}—一//else〃(〃pEncoder"AddByte((BYTE)FALSE);〃}structBitmapUpdatePixelsPacket:Packetintbitmaptype=MilBi仁mapUpdatePixels;intprectX,'intprectY'.intprectWidth,'intprectHeightU工NTstride,'UINTcbSize'.//pixelsafterthisstructBitmapAddDirtyRectPacket:PacketUINTbitmaptype=MilBitmapAddDirtyRect))UINTprectX,.U工NTprectY,-UINTprectWidth'.UINTprectHeight;structSitmapMarshalPixelsPacket:PacketU工OTbitmaptype=MilBitmapCopyintprectX/intprectY'-intprectWidth',intprectHeightjUINTstride;UINTformat;UINTcbSize;//pixelsafterthis)structRenderDataMarshalPacket:Packetintrenderdatatype=MilRenderDataCopyUINTnHandleCount'-U工NTnByteCount///handlesanddatafollow,//CMasterCompositionContext::SetRootstructCompositionContextSetRootPacket:PacketUINTco觀andType-CONTEXT—SETROOTHM工IiCOMPNODEhRoot,—//CMasterCompositionNode::SetPropertystructCompositionNodeSetPropertyPacket:Packet<一U工NTcommandType-CCompositionCommand::NODE—SETPROPERTY,'HMIL—RESOURCEhResource'.—//commandmemtnoryhere.//CMasterCompositionNode::InsertChildAtstructCompositionNode工nsertChildAtPacket:PacketU工NTcommandType=CCompositionCo腿and::NODE—INSERTCHILD'-HMIL—COMPNODEhChild'-UINTiPosition'-//CMasterCompositionNode::Ren\oveChi1dstructCompositionNodleRemoveChildPacket:PacketUINTco誦andType-CCompositionCommand::NODE—REMOVECH工IjD,'HMIL—COMPNODEhChild/—}一//CMasterCompositionNode::MarshalstructCompositionNodeMarshalPacket:PacketUINTcommandType=CCompositionCo飄and::NODE—CREATE,'HMIL—RESOURCEhTransform;-—HM工L:RESOURCEhClip));HM工L二RESOURCEhRenderData'-HMIL—RESOURCEhAlpha'-UINTchildCount'-//handleshere//CMilResourceGeometry::MarshalEmptystructGeometryMarshalEmptyPacket:PacketU工NTgeomType///CMilResourceGeometry::MarshalIjiiiestructGeometryMarshalljinePacket:PacketiritpGeonVType,'HMIIj—RESOURCEhTransformRes;doublePointlX'-doublePointlY'.HM工L一RESOURCEhPointlResdoublePoint2X,-doublePoint2Y,'HMILRESOURCEhPoint2Res;//CMilResourceGeometry::MarshalRectanglestructGeometryMarshalRectangle:PacketintpGeomTypeHM工Ij一RESOURCEhTransformRes'-doubleRectX,.doubleRectY'-doubleRectWidth'.doubleRectHeight'-HM工Ij—RESOURCEhRectRes,'doubleRadiusX'.HM工L一RESOURCEhRadiusXResdoubleRadiusY'-doubleRadiusYRes'.//CMilResourceGeometry::MarshalEllipsestructGeometryMarshalEllipsePacketintpGeomTypeHMIIj一RESOURCEhTransformResdoubleCenterX,-doubleCenterY',HMIL一RESOURCEhCenterRes'-doubleRadiusX,-HM工L一RESOURCEhRadiusXRes,.doubleRadiusY,-HM工Ii一RESOURCEhRadiusYRes;}一//CMilResourceGeometry::MarshalPathstructGeometryMarshstlPath:PacketintpGeomType;HM工L—RESOURCEhTransformRes丄ntFil工Mode,-intCountzintSize;//pathdataappendedhere,//pEncoder->AddMemory(pGeom->FigureData,pGeom->Size》//HRESULTCMilResourceGeometry::MarshalCollectionstructGeometryMarshalCollectionPacket:PacketintpGeomType,'HMIIj—RESOURCEhTransformRes7intCombineMode'-intcount///handleshere://for(U工NTi=0,'i<p<3eotn->Count;i")〃{//pEncoder->AddResource(pGeom->Resources[i]),-〃/}//HRESULTCGlyphCacheMasterManager::UpdateResource(boolfAddBitmaps)structUpdateGlyphCachePacket:PacketMIIj—UPDATE—GLYPHCACHEus'.ARRAY—RECORDglyphlndeces;//UINTarrayofindeces.AllocatedwithAddAxrayARRAY一RECORDglyphBitmaps〖]//numtTerofentriesisnrofglyphlndecesARRAY—RECORDno:rmAdvancedWidth,-//numberofentriesisnrofARRAY—RECORDfontFileName}—//HRESUI/TCMilMasterGlyphRun::DoMarshalstructGlyphRunMarshalPacket:PacketGliYPHRUN—MARSHAL—TYPEglyphRunType;M工L—CREA^E一GLYPh5uNcreateStruct;USHORTGlyphlndeces[],-DOUBLEAdvanceWidths[〗,-WCHARUnicodeString[〗7MIL—2DPO工NTFGlyphOffsets[〗USHORTCharacterToGlyphMap[〗WCHARFontFileName[〗;〃HRESULTCMilMasterGlyphRun:--MarshalRealizationstructGlyphRunRealizationPacket|PacketGLYPHRUN—MARSHAL—TYPEglyphRunType7DOUBLEscaleX,*DOUBLEscaleY,'//HRESULTCMilMasterGlyphRun::MairshEilGeometryHandlestructGlyphRunMarshalGeometryHandlePacket:PacketGIjYPHRUN—MARSHAL—TYPEglyphRunTypeHMIIi—RESOURCEhGeometry/}一//CMilResourcePen::SetWidthstructPenSetWidthPacket:PacketintpenCommand=CMilPenData::MilPenSetWidth'.doublewidth,.//CMilResourcePen::MarshalstructPenMarshalPacket:PacketintpenCommand=CMilPenData::MilPenCopy/HM工L一RESOURCEhBrushRes;HMILi—RESOURCEhWidthRes'.doublewidth,-doubletniterLimit,'BYTEstartCap;BYTEendCap;BYTEdashCap,BYTEj0inCap7//CMasterHWndRenderTarget:-MarshalstructHWndRenderTargetMarshalPaclcet:PacketinttargetCommand-CCompositionCommand:-HWNDRT—CREATE'-HMIL—CONTEXTm一hCompositionContext<formula>formulaseeoriginaldocumentpage25</formula>U工NTintervalCount///copymemoryhere.//pEncoder-:>AddMemory(&ct,sizeof(MIL—CREATE—TIMELINE))//CMilMasterTimeline::SendAddlntervalPacketstructTimelineAddlntervalPacket:Packetinttype-MilTimelineAddlnterval;//copyintervalmemoryhere//pEncoder->AddMemory(pti,sizeof(MIL—TIME—INTERVAL));}'—//CMilMasterTimeline::SendClearPacketstructTimelineSendClearPacket:Packetinttype=MilTimelineClear;//CMilMasterTimeline::SendEnablePacketstructTimelineSeridEnablePacket:Packetinttype-MilTimelineEnablezHM工:LRESOURCEhParentTimeLine;〃CMilMasterTimeline::SendDisablePacketstructTimelineSendDisablePacket:Packetinttype-MilTimelineDisable,*//HRESULTCMilRescurceTransform::MarshalIdentitystructTransformMarshalldentityPacketPacketinttransType=MilTransforiu工cientity;//HRESULTCMilResourceTransform::MarshalMatrix3x2structTransformMarshalMatrix3x2Packet:PacketinttransType=MilTransformMatrix3x2doubleS一lldoubledoubles:2idoubleS:22doubleDX;doubleDY;//HRESULTCMilResourceTransform::MarshalMatrix4x4structTransformMarshalMatrix4x4Pacicet:PacketinttransType=MilTransformMatrix4x4floatcoef[16〗,"//HRESULTCMilResourceTransform::MarshalT:ranslatestructTransformMarshalTranslatePacket:PacketinttransType=MilTransformTranslatedoubleOffsetX;HM工L一RESOURCEOffsetXRes/doubleOffsetY'-HMIL—RESOURCEOffsetYRes'-}一//HRESULTCMilResourceTransform::Ma.rshalScalestructTransformMarshalSealePaclcet:PacketinttransType-MilTransformScale;doubleScaleX'.HM工Ij一RESOURCEhScaleXRes'-doubleScaleY/HM工Ii一RESOURCEhScaleYRes);doubleCerxterX'.doubleCenterY/HMIL—RESOURCEhCenterRes'-}一//HRESULTCMilResourceTransform::MarslialRotatestructTransformMarshalRotatePacket:PacketinttransType-MilTransformRotate,'doubleAngle/HMIL—RESOURCEhAngleRes'-doubleCenterX,'doubleCenterY,.HMILRESOURCEhCenterRes//HRESULTCMilResourceTransform:'■MarshalSkewstructTransformMarshalSkewPacket:PacketinttransType=MilTransformSkew,.doubleAngleX/HMIL—RESOURCEhAngleXRes'.dobleAngleY,.HMIL—RESOURCEhAngleYRes;doubleCenterX,'doubleCenterY,*HMILRESOURCEhCenterResstructTransformMarshalCollection:PacketkinttransType=MilTransformCollection,'intCount,'//reservememoryforcollectionhandles//for(UINTi=0,'i<pTrans->Comit;i++)〃{//pEricoder->AddResource(pTrans"Resources[i]),'〃)—执行步骤300到314的指令示例如下。在该示例中,创建合成模块和呈现目标。然后发送批处理打开控制包。发送要创建合成节点、描绘数据资源、以及合成环境的命令。根节点在合成环境上设置,而合成环境在hwnd目标上设置。此时,合成节点、合成环境、描绘数据资源、根节点以及hwnd目标相关联。然后创建资源。资源是几何图形资源、原彩色画笔资源、以及笔资源。然后发送更新包以更新笔、把椭圆添加到几何图形资源中、并画出几何图形。然后画出经填充的长方形,描绘数据在合成节点上设置,并更新合成节点。为了删除该合成,发送资源释放命令以释放资源,并去除合成装置。main()MilCompositionDevice—Create(&g一hCompositionDevice)//Createsthedevice->generatesaconnectpacket.//handledbycompositionproxythatcreatesaclientcompositiondeviceforthisconnection.MilResource一HWndRenderTarget一Create(&g_hRenderTarget)//createarendertargetgeneratesaresourcecommandtocreate匕herendertargetresource,Mi1CompositionDevice—CreateBatch(&hBatch)'-//Opensabatchgeneratesabatchopencontrolpacket//handledbyclientcompositiondevice.MilResource—CompositionNode—CreatehRootNode);//createacompositionnode->generatesaresourcecommandpackettocreateacompositionnode.MilResource—RenderData—Create(&g一hRenderData);//createarenderdataresource->generatesaresourcecommandpackettocreatearenderdata.MilResource—CompositionContext—CreatehCompositionContext);//createacompositioncontextcommand->generatesaresourcecommandpackettocreateacompositioncontext.MilCompositionContext—SetRootNode(g—hCompositionContext,g—hRootNode,h"tch);//settherootnodeonthecompositioncontext->generatesaresourcecommandtosettherootnodeonthecontext//packetishandledbycompositioncontextresourceMilResource—HWndRenderTarget—SetCompisitionContext(g一hRenderTarget,g_hCompositionContext,hBatch)),'//setthecompositioncontextonthehwndtarget->generatesaresourcecommandpackettosetthecompcontextonhwndtarget//packetishandledbythehwndtargetresource.MilResource—Geometry—Create(&hGeometry》//createageometryresource->generatesaresourcecommandpacketthatcreatesageometryresource.MilResource一SolidBru'sh一Create(&hSolidBrush)'-//createasolidbrushresource->generatesnopacket.MilResource—SolidBrush—Update(hSolidBrush,——1.0,NULL,&color,g—hColor,hBatch)///setthecoloronthesolid->generatesaresourcecommandpacketthatcreatesabrushresourcewiththegivencolor,MilResource—Pen—Create(&g一hPen)//createapenresource->generatesaresourcecommandpacketthatcreatesthepenresource,MilResource—Pen一Update(g—hPen,hSolidBrush,g一hPenWidth,MilPenCapFlat,MilPenCapFlat,MilPenCapFlat,Mi1PenJoinMiter,10,0,NULIi,0.0,NULL,hBatch)//updatethepen->generatesapenupdatepacket//handledbythepenresourceMilGeotnetry一UpdateEllipse(hGeometry,NULL,—100-0,NULIi,50.0,NULL,100.0,100,Q,NULL,hBatch);//updatethegeometrytocontainanellipsupdatepacket*"〃geometryresource、>generatesageometryhandledbytheMilRenderData—DrawGeometry(g—hRenderData,hSolidBrush,hGeometry)//drawthegeomet:rytotherenderdata->generatesarenderdataupdatepackettodrawthegeometry//handledbytherenderdataMilRenderData—FillRectangle—InlineSolidBrush(g—hRenderData,200,200,300,300,colory》;//drawafilledrectangleusingaspecifiedbrushtotherenderdata->generatesarenderdataupdatepacket〃handledbytherenderdataresourceMilCompositionNode—SetRenderData(g一hRootNode,g—hRenderData,hBatch),-//setstherenderdataonacompositionnode->generatesacompositionnodeupdatepacket〃handledbythecompnoderesourceMilBatch—Commit(hBatch)//generatesabathclose/commitpacket.//'handledbyclientcompositiondevice.//thisisthenotificationprocessingloopdoWaitOnEvents();MilCompositionDevice—ProcessNotifications(g一hCoxupositiont)evice);//hereweinternallyprocessnotificationpacketscomingfromtheclientcompositiondevice.}while(compositionstillrunning:controlledbylayerusingthecompositor),'//alltheresourcereleasecallsgenerateresourcedestroypacketsandqueueflushcontrolpackets.//handledbyclientcompositiondevice.MilResource—Release(g一hCompositionContext)MilResource—Release(g一hRootNode),'MilResource—Release(g—hHandleTable,g一hRenderData)MilResource一Release(g一hPen)MilResource—Release(g一hColor》MilResource—Release(g—hPenWidth)'-MilResource一Release(g—hITarget)MilCompositionDevice一Destroy(g—hCotnpositionDevice)'-//onexitingtheloopweshutdown<formula>formulaseeoriginaldocumentpage31</formula><formula>formulaseeoriginaldocumentpage32</formula>权利要求1.一种在装置上呈现一组合成的方法,其特征在于,所述方法包括以下步骤发送一创建合成节点包,用于创建一合成;发送至少一创建资源包,以创建用于呈现所述合成的资源;以及发送至少一呈现更新包,以创建所述合成。2.如权利要求1所述的方法,其特征在于,还包括发送一创建描绘数据资源包,以创建一描绘数据资源的步骤。3.如权利要求1所述的方法,其特征在于,还包括发送一批处理打开包以打开一批处理过程的步骤。4.如权利要求3所述的方法,其特征在于,还包括以下步骤发送多个创建资源包;发送至少一个资源更新包;以及发送一结束/呈现批处理包。5.如权利要求1所述的方法,其特征在于,还包括发送一释放命令以释放一资源的步骤。6.—种数据结构,其特征在于,包括一第一字段,具有一包类型;一第二字段,具有一句柄,所述句柄匹配所述包类型;一第三字段,具有匹配所述包类型的资源类型和命令类型之一;以及一第四字段,具有一命令。7.如权利要求6所述的数据结构,其特征在于,所述包类型是控制包和资源命令包之一。8.如权利要求7所述的数据结构,其特征在于,所述控制包和资源命令包之一包括所述控制包、所述资源命令包、以及一批处理包中之一。9.如权利要求6所述的数据结构,其特征在于,所述句柄包括资源句柄、环境句柄、以及合成节点句柄之一。10.如权利要求6所述的数据结构,其特征在于,所述资源类型和命令类型之一包括资源类型,所述资源类型包括存储、位图、变换、几何图形以及笔之一。11.如权利要求IO所述的数据结构,其特征在于,所述资源类型还包括动画类型。12.如权利要求11所述的数据结构,其特征在于,所述动画类型包括双重动画、色彩动画、点动画、长方形动画、以及尺寸动画之一。13.如权利要求6所述的数据结构,其特征在于,所述资源类型包括合成节点、以及合成环境之一。14.如权利要求6所述的数据结构,其特征在于,所述控制类型包括释放资源的释放一资源类型、关闭一装置的关闭类型、以及删除装置上所有的同步类型之一。15.如权利要求6所述的数据结构,其特征在于,所述控制类型包括将位图添加到字形缓存器的添加字形位图类型、从所述字形缓存器移除位图的释放字形位图类型、以及排空变化队列的排空队列类型之一。16.—种在装置上呈现合成的方法,其特征在于,所述方法包括以下步骤响应于接收一创建合成节点包,创建一合成节点;响应于接收至少一个创建资源包,创建至少一个用于呈现所述合成的资源;以及响应于接收至少一个呈现更新包,创建所述合成。17.如权利要求16所述的方法,其特征在于,还包括响应于接收一创建描绘数据资源包,创建一描绘数据资源的步骤。18.如权利要求16所述的方法,其特征在于,还包括响应于接收一批处理打开包打开一批处理过程的步骤。19.如权利要求18所述的方法,其特征在于,还包括响应于接收一结束/呈现批处理包,处理至少一创建资源包和至少一资源更新包的步骤。20.如权利要求16所述的方法,其特征在于,还包括响应于接收一释放命令,释放一资源的步骤。21.如权利要求16所述的方法,其特征在于,还包括响应于接收一命令包,发送一通知的步骤。全文摘要揭示了在远程装置上创建和控制合成的方法和协议。该协议使服务器和其它装置能够利用远程装置的处理能力,来呈现远程装置上的合成,从而增加服务器的可升级性并发挥远程装置的处理能力。该协议用处理这些命令所需的信息的有效载荷,来提供高层命令包以向远程装置传送资源命令包和控制包。文档编号H04L29/08GK101411164SQ200480001334公开日2009年4月15日申请日期2004年7月26日优先权日2003年10月23日发明者D·B·柯蒂斯,G·D·斯伟德伯格,O·D·温克雷亚努,P·C·戴伟申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1