具体实施方式
实施例可以包括用于在用户接口(UI)线程中执行基元组成的功能。通过在UI线程中组成诸如图形处理单元(GPU)数据结构之类的基元,用户接口框架能够减少负责处理动画、处理输入和呈现帧的单独的组成线程的工作负载。这样转而增强将用户接口框架扩展到具有相对有限资源的计算设备(例如移动设备、平板计算机、嵌入式设备等)的能力。
例如,在一个或多个实施例中,执行基元组成的计算机系统在UI线程中遍历程序的用户接口层次结构。所述用户接口层次结构描述程序的用户接口的元素。根据遍历用户接口层次结构,UI线程直接生成表示UI层次结构的至少一部分的静态GPU数据结构。所述UI线程将这些静态GPU数据结构传递到单独的组成线程,所述单独的组成线程保留静态GPU数据结构以便在生成用户接口的多个视频帧期间重复使用。因此,所述组成线程分别重复使用从UI线程接收的静态GPU数据结构以便呈现多个视频帧中的每个视频帧。这包括组成线程针对多个视频帧中的每个视频帧,根据静态GPU数据结构导出GPU数据和GPU命令以及将所述数据和命令发送到GPU来呈现。
本发明的实施例可以包括或使用专用或通用计算机,所述计算机包括诸如一个或多个处理器和系统存储器之类的计算机硬件,如下面更详细介绍的那样。本发明范围内的实施例还包括物理和其他计算机可读介质以便传送或存储计算机可执行指令和/或数据结构。此类计算机可读介质可以是任何能够由通用或专用计算机系统访问的可用介质。存储计算机可执行指令的计算机可读介质是计算机存储介质(设备)。承载计算机可执行指令的计算机可读介质是传输介质。因此,通过举例而非限制,本发明的实施例可以包括至少两种明显不同的计算机可读介质:计算机存储介质(设备)和传输介质。
计算机存储介质(设备)包括RAM、ROM、EEPROM、CD-ROM、DVD-ROM、固态驱动器(“SSD”)(例如,基于RAM)、闪存、相变存储器(“PCM”)、其他类型的存储器、其他光盘存储、磁盘存储或其他磁存储设备,或任何其他可以用于存储计算机可执行指令或数据结构形式的所需程序代码装置以及可以由通用或专用计算机访问的介质。
将“网络”定义为能够在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当通过网络或其他通信连接(硬连线、无线,或者硬连线或无线的组合)将信息传输或提供给计算机时,计算机完全将连接视为传输介质。传输介质可以包括能够用于承载计算机可执行指令或数据结构形式的所需程序代码装置以及能够由通用或专用计算机访问的网络和/或数据链路。上述各项的组合也应该包括在计算机可读介质的范围内。
进一步,当到达各种计算机系统组件时,可以将计算机可执行指令或数据结构形式的程序代码装置自动从传输介质传送到计算机存储介质(设备)(或反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以在网络接口模块(例如,“NIC”)内的RAM中缓存,然后最终传送到计算机系统中的计算机系统RAM和/或低易失性计算机存储介质(设备)。因此,应该理解,计算机存储介质(设备)可以包括在也(或甚至主要)使用传输介质的计算机系统组件中。
计算机可执行指令例如包括指令和数据,当指令和数据在处理器上执行时,导致通用计算机、专用计算机或专用处理设备执行某个功能或功能的组。所述计算机可执行指令例如可以是二进制文件、诸如汇编语言之类的中间格式指令,或甚至源代码。尽管已经采用特定于结构特征和/或方法学行为的语言描述了主题,但要理解,在所附权利要求中定义的主题并不一定限于上面的所述特征或操作。相反,所述特征和操作作为实现权利要求的示例形式公开。
本领域的技术人员将理解,本发明可以在网络计算环境中实现,这些环境具有许多类型的计算机系统配置,包括个人计算机、台式计算机、膝上型计算机、“上网本”计算机、平板计算机、消息处理器、手持设备、多处理器系统、基于微处理器或可编程的消费电子、网络PC、微型计算机、大型计算机、移动电话、PDA、媒体设备、寻呼机、路由器、交换机等。本发明还可以在分布式系统环境中实现,其中通过网络(由硬连线数据链路、无线数据链路或通过硬连线和无线数据链路的组合)链接的本地和远程计算机系统二者执行任务。在分布式系统环境中,程序模块可以位于本地和远程存储器存储设备中。
许多计算机系统包括针对图形信息的处理和呈现进行优化的计算机硬件。例如,某些计算机系统包括一个或多个GPU,这些GPU针对图形信息的处理和呈现进行优化,例如将变换和纹理应用于多边形以呈现场景。GPU通常包括并行处理体系结构,其可以同时处理大量与图形相关的任务以在帧缓冲区中构建场景,从而在显示设备上显示。为了做出高质量图形,许多计算机系统至少在可用存储器数量、一般处理能力和GPU复杂性方面已经变得越来越强大和复杂。利用GPU,某些计算机系统现在能够实时制作拟真和高帧速率的流畅图形。
开发人员可以在开发用于操作系统级应用以及用户级应用的用户接口时利用GPU的效能。一种呈现用户接口的方法是提供在逻辑上将应用功能和图形呈现功能分离的用户接口框架。例如,第一任务可以处理可能无界的应用功能(例如,用户接口布局任务、执行应用代码、处理网络通信、执行复杂计算),而第二任务可以执行大致有界的呈现功能(例如,执行呈现管道以及另外准备GPU数据结构以便由一个或多个GPU处理)。
例如,图1示出了通过使用UI线程和组成线程便利用户接口呈现的示例计算机体系结构100。参考图1,计算机体系结构100包括UI线程102、组成线程112和GPU线程122。尽管在此描述为“线程”,但将理解,UI线程102、组成线程112和/或GPU线程122可以包括任务、过程,或任何其他编程或逻辑分离单元。
UI(或应用)线程102被配置为针对使用UI线程102的程序104(例如,操作系统级程序或终端用户应用程序)的用户接口维护用户接口层次结构106。UI线程102本身可以生成用户接口层次结构106,或它可以从其他地方接收用户接口层次结构106的全部或部分。例如,可以根据生成用户接口的编程代码的执行和/或根据表示用户接口的标记(例如,可扩展应用标记语言(XAML))的解析来生成接口层次结构106。用户接口层次结构106可以被配置为使用任何适当的数据结构(例如,树形结构)表示用户接口的元素,例如UI控件(例如,按钮、列表框、网格、文本框等)、图像、矢量图形、视频、随时间推移修改用户接口的动画等。UI线程102可以被进一步配置为通过修改用户接口层次结构106以及通过响应于用户接口事件(例如,与用户接口交互的用户输入,例如触摸输入(即,触摸手势)、指点设备输入和/或键盘输入;接收数据;从其他过程接收信号;等等)而执行应用代码,来实现与用户接口的交互。
UI线程102还被配置为偶尔遍历用户接口层次结构106以生成针对用户接口的组成信息(例如,在每次执行UI线程102期间,根据定义的间隔,响应于用户接口层次结构106中的改变)。例如,在UI线程102遍历用户接口层次结构106期间或响应于UI线程102遍历用户接口层次结构106,UI线程102可以将以层次结构表示的用户接口元素转换为一个或多个描述用户接口元素的组成结构108。在某些实施例中,组成结构108可以将场景的用户接口元素描述为多个多边形。因此,组成结构108可以包括描述多边形顶点、纹理、颜色、梯度、照明信息、应用于多边形的屏蔽,和/或裁剪信息等的信息。根据组成结构108,UI线程102可以被配置为偶尔将组成数据110发送到组成线程112以便由组成线程112进一步处理,从而准备在GPU线程122中由GPU 124呈现。组成数据110可以包括用于用户接口层次结构106的初始组成结构108和/或由用户接口层次结构106中的改变引起的组成结构108的更新。
组成线程112被配置为接收组成数据110,并将组成数据110“组成”到可以由GPU 124处理/呈现的GPU基元(即,示出的GPU数据结构118)。如图所示,组成线程112被配置为维护组成层次结构114,组成层次结构114以组成结构108中的组成数据110的形式几乎完全镜像用户接口层次结构106。每次执行组成线程112线程时,它被配置为遍历组成层次结构114并在遍历时收集组成数据,并将收集的组成数据馈送给呈现管道116。呈现管道116转而将收集的组成数据组成到GPU数据结构118(例如,顶点缓冲区、索引缓冲区、纹理、着色器等)。根据新生成的GPU数据结构118,组成线程112被配置为将GPU数据和命令120发送到GPU线程112,GPU线程112转而在GPU 124中呈现由GPU数据结构118表示的用户接口场景并填充帧缓冲区126。
呈现管道116可以包括一系列生成GPU数据结构118的可编程和/或不可编程组件。例如,呈现管道116可以包括着色器(例如,顶点、像素、几何)、光栅器、混合器等的组合。呈现管道可以从组成层次结构114接收组成数据(例如,顶点数据)作为输入,并使组成数据经过每个管道组件以生成GPU数据结构118。转换可以包括将一个或多个变换(例如,模型、相机、透视)应用于顶点数据以便在2D或3D空间中定位一个或多个多边形;将纹理、颜色、梯度等映射到顶点数据;以及任何其他适当的任务。
正因如此,每次执行组成线程112时,它被配置为生成表示单个视频帧的场景的新GPU数据结构,并将此数据传递到GPU线程122以呈现帧。因此,组成线程112通常以等于用于显示用户接口所需输出帧速率的频率(例如,60fps)执行。组成线程112的工作负载相对有界和可预测,因此假设具有足够的计算资源,它通常可以实现所需的帧速率。另一方面,UI线程102可以不太频繁地执行和/或处理更多无界任务。
计算机体系结构100在相对强大的计算系统上很好地呈现复杂的用户接口。然而,组成线程112在每次执行期间做了大量工作,包括每次运行时遍历组成层次结构114以及通过执行呈现管道116生成新的GPU数据结构118。此外,组成线程112在其组成层次结构114中存储大量大部分上重复的数据,当呈现具有大量元素的复杂用户接口时或者当采用任何形式的缓存时,这种情况会加重。在具有更有限的资源(例如,存储器和处理资源)的计算机系统(例如,便携式设备)的上下文中,组成线程112可能无法足够快地执行此处理以便按照所需的帧速率执行,从而导致呈现的用户接口质量下降,或它可能没有足够的存储器资源来维护组成层次结构114。
同样,图2示出了在UI线程中采用基元组成以呈现用户接口的备选计算机体系结构200的实施例。参考图2,计算机体系结构200包括UI线程202、组成线程216和GPU线程226。类似于图1的计算机体系结构100,这些“线程”可以包括任务、过程,或任何其他编程或逻辑分离单元。
类似于图1的UI线程102,UI线程202被配置来为使用UI线程202的程序204(例如,操作系统应用或终端用户应用)的用户接口维护用户接口层次结构206。用户接口层次结构206可以表示用户接口的元素,例如UI控件(例如,按钮、列表框、网格、文本框等)、图像、矢量图形、视频、随时间推移修改用户接口元素的动画等,并且可以由UI线程202生成(例如,通过解析XAML)或从其他地方接收。UI线程202还可以被配置为通过修改用户接口层次结构206以及通过响应于用户接口事件(例如,用户输入事件、网络事件、数据处理事件等)而执行程序204代码,来实现与用户接口的交互。
但是,与图1中的UI线程102不同,UI线程202被配置为作为遍历用户接口层次结构206的结果,直接生成静态GPU数据结构208。也就是说,UI线程202(而非组成线程216)被配置为生成或组成可以由GPU 228处理/呈现的GPU基元(例如,顶点缓冲区、索引缓冲区、纹理、着色器等)。与图1中的组成线程112所生成的GPU数据结构118(它们在每次执行线程时重新生成)不同,UI线程202被配置为生成可用于呈现多个稍有修改或没有任何修改的帧的静态GPU数据结构208。因此,在计算机体系结构200的上下文中,“静态”表示至少某些GPU数据结构208在呈现多个帧时重复使用,而非针对每个帧重新生成。在UI线程102中生成“静态”GPU结构导致所生成的GPU数据量远少于图1的组成线程112生成的GPU数据量。
UI线程202可以被配置为在生成静态GPU数据结构208时采用一种或多种优化。例如,UI线程202可以被配置为生成与在不同帧之间基本保持不变的静态用户接口元素对应的GPU数据结构。因此,当对应的用户接口元素改变时,UI线程202只能生成新的静态GPU数据结构208。此外,UI线程202可以被配置为限制可使用的用户接口元素的类型,并且可以被配置为使用被优化以生成这些接口特定类型元素的GPU数据结构的功能。在一个或多个实施例中,例如,程序204的大量用户接口元素可以基于特定类型的用户接口基元(例如,圆、矩形、弧),并且UI线程202可以包括将这些用户接口基元转换为GPU基元的优化功能。通过这样配置,UI线程202可以在很大程度上,甚至完全不需要使用通用呈现管道(例如,计算机体系结构100中的呈现管道116)。
如图所示,UI线程202被配置为将作为GPU数据214的静态GPU数据结构208传递到组成线程216,组成线程216转而被配置为维护静态GPU数据结构220。如介绍的那样,组成线程216被配置为保留至少某些静态GPU数据结构220以用于生成多个帧。因此,如果用户接口在不同帧之间保持相对静态(在许多用户接口场景中相对普遍地发生),则组成线程216只能利用GPU 228(例如,利用GPU数据和命令224)指令GPU线程226呈现静态GPU数据结构220,并且可以针对使用同一静态GPU数据结构220的多个帧这样做。
UI线程202还可以被配置为根据用户接口层次结构206生成组成结构210。如果生成,则这些组成结构210可以描述应用于由静态GPU数据结构208表示的用户接口元素的动画。因此,UI线程202还可以被配置为将作为组成数据212的任何生成的组成结构210传递到组成线程216,并且组成线程216可以被配置为维护组成层次结构218。但是,计算机体系结构200中的组成层次结构218可以潜在维护的组成信息量远少于计算机体系结构100的组成层次结构114维护的组成信息量。例如,组成层次结构218只能维护与应用于静态GPU数据结构220的动画有关的组成信息。组成线程216然后可以被配置为使用组成层次结构218中的动画信息修改静态GPU数据结构220的多个部分,以使得(与生成新结构相反)当由GPU 228呈现时,任何对应的用户接口元素在不同帧之间以动画方式呈现。
此外,组成线程216还可以被配置为接收输入222,例如用户输入。输入222可以包括任意形式的输入,例如,触摸输入(手势)、指点设备输入、网络输入、相机输入、传感器设备输入(例如,罗盘、GPS、加速计、回转仪、温度计、光传感器)、麦克风输入等。当输入222将导致静态GPU数据结构220表示的任何用户接口元素的动画时,组成线程216可以被配置为自己启动用户接口元素的动画。因此,组成线程216可以独立于UI线程202中的组成数据创建和/或修改组成层次结构218中的动画信息,并且可以使静态GPU数据结构220表示的用户接口元素以动画方式呈现。例如,组成线程216可以被配置为根据输入修改静态GPU数据结构的多个部分(例如,通过修改GPU数据,这样将更改对应用户接口元素的位置、缩放、旋转、透明度、裁剪、颜色、透视、不透明度、模型变换和/或方向),以便当由GPU 228呈现时,对应的用户接口元素在不同帧之间以动画方式呈现。
计算机体系结构200的配置因此通过消除全部或部分呈现管道,以及通过移除组合层次结构218中的多数(甚至全部)来简化组成线程216。因此,组成线程216可以在每次执行期间占用少得多的存储器和处理资源。具体而言,组成线程216不再存储和遍历大部分重复的组成层次结构218,并且组成线程216不再每次执行时都生成新的GPU数据结构。因此,即使在具有有限资源的计算机系统中,组成线程216仍可以频繁执行(例如,以60fps的速度)以将每个帧的GPU数据和命令224馈送给GPU线程226来呈现。在多数简单的执行场景中(例如,用户接口在不同帧之间保持不变的场景),组成线程可以直接利用静态GPU数据结构240来发送GPU数据和命令。换言之,组成线程可以为GPU线程226提供GPU数据并“命令开始”,在其中已接收用户输入或者其中组成线程216需要处理动画数据的更复杂的执行场景中,组成线程216可以处理输入和/或修改组成层次结构218或静态GPU数据结构220中的一项或多项来以动画方式呈现用户接口元素。在任何一种情况下,通过处理一小组有界任务,组成线程216可以确保即使资源非常有限,用户接口也能以一贯的高帧速率绘制,并且用户接口能对输入做出响应。
另一方面,UI线程202执行的频率可以比组成线程216的执行频率低得多,以及/或者可以在执行来处理无界任务(例如,用户接口布局任务、网络任务、数据绑定任务、光栅化、棋盘形布置或其他复杂计算)时耗用额外的时间。UI线程202可以根据需要更新静态GPU结构208,但由于静态GPU结构208对应于主要为静态的用户接口元素,因此,这些更新在许多用户接口场景中发生的频率相对较低。所以,生成GPU基元的成本和将数据传送到组成线程216的成本二者与计算机体系结构100相比显著降低。因此,总而言之,计算机体系结构200可以在生成最少量的GPU数据的同时呈现用户接口并且针对具有有限资源的设备进行优化。
图3示出使用基元组成呈现程序的用户接口的示例方法300的流程图。将参考计算机体系结构200的组件和数据来描述方法300。
方法300包括在用户接口线程中遍历程序的用户接口层次结构的行为(行为302)。行为302可以包括UI线程遍历程序的用户接口层次结构的行为,所述用户接口层次结构描述程序的用户接口的一个或多个用户接口元素。例如,承载程序204或由程序204使用的UI线程202可以遍历用户接口层次结构206。用户接口层次结构206可以将信息存储在表示程序204的用户接口的用户接口元素的数据结构(例如,树形结构)中。
方法300还包括根据用户接口线程遍历用户接口层次结构,直接在用户接口线程中生成一个或多个静态GPU数据结构的行为(行为304)。行为304可以根据遍历用户接口层次结构的UI线程,包括UI线程直接生成表示用户接口层次结构的至少一部分的一个或多个静态GPU数据结构的行为。例如,UI线程202可以直接生成静态GPU数据结构208。这些GPU结构在某些实例中可以对应于在不同帧之间保持基本静态的用户接口元素。即使当某些用户接口元素以动画方式呈现,它们仍在静态GPU结构208中表示,因为组成线程216可以在稍后以动画方式呈现它们。作为GPU数据,静态GPU数据结构208例如可以包括一个或多个顶点缓冲区、索引缓冲区、纹理、着色器等。
此外,方法300还包括将一个或多个静态GPU数据结构传递到组成线程的行为(行为306)。行为306可以包括UI线程将一个或多个静态GPU数据结构传递到组成线程的行为,所述组成线程保留一个或多个静态GPU数据结构以便在生成对应于用户接口的多个视频帧期间重复使用。例如,UI线程202可以将等同于静态GPU数据结构208或通过静态GPU数据结构208导出的GPU数据214传递到组成线程216。组成线程216转而可以存储接收的GPU数据214作为静态GPU数据结构220,并且可以跨组成线程216的多次执行保留此信息以利用同一静态GPU数据结构220生成多个视频帧。
依照这些,方法300还包括在组成线程中根据一个或多个静态GPU数据结构生成多个视频帧的行为(行为308)。行为308可以包括组成线程生成对应于用户接口的多个视频帧的行为,其中包括组成线程针对多个视频帧中的每个视频帧,将根据一个或多个静态GPU数据结构导出的GPU数据和GPU命令发送到的GPU,以便组成线程在呈现对应于用户接口的多个视频帧时,重复使用从UI线程接收的一个或多个静态GPU数据结构。例如,根据静态GPU数据结构220,组成线程216可以将GPU数据和命令224发送到GPU 228来呈现。在一个或多个实施例中,组成线程216可以在组成线程216的每次执行时,针对一个或多个视频帧发送GPU数据和命令224,同时跨多次执行保留GPU数据结构220。因此,组成线程216可以在生成多个视频帧时使用同一静态GPU数据结构220。
尽管未示出,但是方法300还可以包括UI线程202生成对应于用户接口的动画的组成结构210,以及将组成数据212传递到组成线程216的行为。因此,组成线程216可以存储组成层次结构218,组成层次结构218可以包括组成数据212,组成数据212描述用户接口的一个或多个动画。因此,在将GPU数据和命令224发送到GPU 228之前,组成线程216可以修改静态GPU数据结构220以导致对应的用户接口元素在呈现时采取动画方式。例如,组成线程216可以修改GPU数据结构220中的信息,这样将导致改变对应用户接口元素的位置、缩放、旋转、透明度、裁剪、颜色、透视、不透明度、模型变换或方向中的一项或多项。同样,尽管组成线程216可以响应于从UI线程202接收到组成数据212,而修改静态GPU数据结构220,但是组成线程216也可以响应于用户输入222而自己启动动画。
在执行方法300时,UI线程202可以执行某些无界任务(例如,用户接口布局任务、网络任务、数据绑定任务、光栅化、棋盘形布置或其他复杂计算),但是组成线程216只能执行有界任务。因此,UI线程202可以根据第一计划操作,与组成线程216操作时所用的第二计划相比,所述第一计划使用频率相对较低,以及/或者UI线程202的执行时间有时可能相对较长。因此,组成线程216可以确保用户接口以高帧速率持续呈现,并且确保用户接口能及时对用户输入做出响应。
相应地,在此描述的实施例的适用范围扩及用于在用户接口线程中执行基元组成,从而增强将用户接口框架扩展到具有有限资源的计算设备的能力的方法、系统和计算机程序产品。通过直接在UI线程中生成可用于生成多个视频帧的静态GPU数据结构,组成线程中的工作负载被降低了,从而使其能够可靠地执行高帧速率。
在不偏离本发明的精神或本质特征的情况下,可以通过其他具体形式来实现本发明。所描述的实施例在各方面都仅被视为示例而非限制。因此,本发明的范围由所附权利要求而非上述描述来指出。处于权利要求的等同物的含义和范围内的所有改变也将包含在所述权利要求的范围内。