Windows Composition API 指南 - 認識 Composition API


微軟在 Windows 10中 面向通用 Windows 應用 (Universal Windows Apps, UWA) 新引入了一套用於用戶界面合成的 API:Composition API。Composition API 將使開發者使用更少量的代碼在通用 Windows 應用實現更為炫麗的界面效果。本系列文章會對該套 API 的由來、用途以及使用方法進行介紹。

本文為個人博客備份文章,原文地址:http://validvoid.net/windows-composition-api-guide-introduction/

什么是 Composition API

簡單來說,Composition API 就是一套在桌面窗口管理器(Desktop Window Manager,下文簡稱 DWM)之上新引入的,面向通用 Windows 應用的用戶界面合成 API。DWM 是一個利用硬件加速特性進行圖形用戶界面合成以及渲染的組件,最早在 Windows Vista 中引入。DWM 誕生的目的旨在提供更高性能的界面渲染以及更豐富的界面效果。需要指出的是,可能很多用戶對 DWM 的印象就停留在 Windows Aero 視覺風格中的磨砂玻璃特效,但事實上 DWM 的能力遠不止如此。

Desktop Window Manager

自 DWM 引入以來,用戶在屏幕上實際看到的用戶界面實際上是由 DWM 對來自不同應用程序的緩沖區數據進行合成生產的圖像。DWM 基於 DirectX 利用顯卡顯存和 GPU 提供相比老式 GDI 渲染更好的性能來完成界面圖形的和成和渲染。對於采用老式 GDI 方法進行呈現的應用,DWM 也會對其繪圖方法進行映射。在 DWM 的渲染過程中,桌面實際上是一個全屏大小的 Direct3D 表面,桌面中的窗口則是由兩個三角形構成的網格經變換成 2D 矩形。UI 框架作為紋理映射到這些矩形上。窗口過渡等各種效果則是通過 shader 處理、變換等過程實現的。

在 DWM 處理中,每個應用程序都有各自的緩沖區,應用將自身的界面圖形數據寫入自己的緩沖區,DWM 讀取每個應用各自的緩沖區數據進行合成。DWM 使用非托管的媒體整合層(Media Integration Layer, MIL)將窗口描述為合成樹 (composition tree) 中的合成節點 (composition nodes) 進行渲染。合成樹表示了桌面以及其容納的窗口,MIL 依照合成樹按照從后往前的順序對整個用戶界面的內容進行渲染。有了 MIL 這種依靠合成樹的保留模式1圖形機制,應用就從刷新重繪這些工作中解放了出來。而自 Windows Vista 開始提供的諸如模糊、Flip 3D、實時縮略圖等功能,都是依靠即時緩沖區、shader 等特性實現的。簡言之,DWM 是由 DirectX 驅動的高性能新一代界面引擎。

DirectComposition

在 Windows 8 中,微軟引入了 DirectComposition API。DirectComposition 組件使開發者能夠進行高性能的位圖合成,並附加變換、特效以及動畫等各種效果,以此打造出更為復雜、生動、流暢的用戶界面。DirectComposition 利用圖形硬件的加速特性可以進行與 UI 線程無關的渲染處理,支持 2D 仿射變換、3D 透視變換等多種變換,以及剪切、不透明等基本特效。正如其名,DirectComposition 的設計受 DirectX 啟發,但提供更為友好的方式供開發者使用,也讓開發者更清晰地認識到 DWM 這一強大的合成引擎所能實現的效果。

不過,DirectComposition 是面向組建對象模型 (Component Object Model, COM) 構建的一套 API ,並不適合通常使用托管語言進行應用開發的開發者。實際上在 DirectComposition 的 MSDN 文檔里明確寫道:

The DirectComposition API is intended for experienced and highly-capable graphics developers who know C/C++, have a solid understanding of the Component Object Model (COM), and are familiar with Windows programming concepts.

即,DirectComposition API 適用於熟悉 C/C++、COM的圖形處理開發者。

Windows Composition API

現在,隨着 Windows 10 的到來,開發者有了新的選擇: Composition API。Composition API 基於 Windows 運行時 (Windows Runtime, WinRT) 構建,在整合 Direct2D 和 Direct3D 的立即模式2圖形能力的同時,提供了保留模式的視覺樹機制,實現了效果豐富、支持動畫的高性能界面合成渲染。Composition API 面向 通用 Windows 應用,通過 Windows.UI.Composition 命名空間提供。這意味着,開發者可以使用任何一種通用 Windows 平台 (Universal Windows Platform, UWP) 語言(C#, JavaScript, C++/CX 或 Modern C++ 等)在 UWA 應用中使用,並在所有 UWP 平台設備(PC、平板、手機)上(幾乎)無差別運行。

Windows.UI.Composition 是聲明式、保留模式的 API。它不僅可以與如今廣泛使用的 XAML 結合使用,也可以脫離 XAML 獨立使用。這意味着開發者如今可以以更為靈活的方式,使用自己最熟悉的語言,整合 XAML、DirectX 的各種特性打造現代 UI。下圖展示了通用 Windows 應用使用 XAML、Composition API 以及 DirectX 進行渲染的層次結構:

借助 Composition API,開發者可以在基於 XAML 的應用中隨時從框架層深入至視覺層應用更為復雜的圖形效果。

為什么使用 Composition API

  • 基於硬件加速的高性能表現
  • 更強大的特效和動畫支持
  • 基於 WinRT 構建,面向所有通用 Windows 應用
  • 在通用 Windows 平台保證一致體驗
  • 避免使用 C/C++ 操作 DirectX
  • 提供了保留模式的 API,可以方便地通過操縱視覺樹控制繪制過程
  • 與 XAML (幾乎)無縫結合

Composition API 特性概要

Composition API 除了提供一套視覺樹機制外,還提供了以下特性,這些特性將在后文逐一做詳細介紹:

  • 特效

    Composition API 支持實時特效,特效可以動畫化、自定義、鏈接。特效效果包括 2D 仿射變換 (2D affine transforms)、算數合成(arithmetic composites)、混合 (blends)、色源生成 (color source)、二圖合成 (composite)、對比度調整 (contrast)、曝光 (exposure)、灰階 (grayscale)、伽馬轉移(gamma transfer)、色調旋轉 (hue rotate)、反相 (invert)、飽和度調整 (saturate)、褐色化 (sepia)、色溫調整 (temperature)以及着色 (tint)。

  • 動畫

    Composition API 包含了一套表達式化、框架不可知的動畫系統。該系統支持兩類動畫:關鍵幀動畫以及表達式動畫。動畫可以用來移動視覺元素,將變換、剪切或特效等動畫化。該動畫系統直接運行於合成器進程,從而確保了動畫的平滑和伸縮性,使大量不同動畫的並發成為可能。

  • 與 XAML 互操作

  • 與原生層互操作

對象模型

 

如圖所示,CompositionObject 是 Composition API 的核心基類。它實現 ICompositionObject 接口,表示視覺樹中的一個節點。

由 CompositionObject 類派生出了以下主要類型:

Windows.UI.Composition 包含一個實現 ICompositor 接口的合成器類 Compositor,該類扮演創建合成對象的工廠角色,負責創建視覺樹種幾乎所有操作對象,MSDN 文檔對其描述為“管理應用與系統合成器之間的會話。”


鏈接


注釋

  1. 保留模式:圖形 API 可以分為保留模式和立即模式兩類。保留模式 API 是聲明式的,應用從形狀、線條等圖形基元構建場景,將場景抽象成一個圖或樹的模型保存在內存中。當要繪制一幀畫面時,圖形處理將場景變換為一組繪圖命令。在幀間,圖形處理庫回將場景保留在內存中。要渲染更新的內容,應用會發送更新場景的命令——例如添加或刪除一個形狀。之后圖形處理庫負責重繪場景。保留模式更為直觀,更容易操作,因為諸如初始化、狀態管理、資源清理等很多底層工作都由 API 負責實行了。但保留模式 API 缺乏靈活性,因為它是用自己的場景模型,很多特性可能並未公開。另外,因為其提供了通用的場景模型,保留模式 API 可能會有更多的內存占用。 

  2. 立即模式:圖形 API 可以分為保留模式和立即模式兩類。立即模式 API 是過程式的。每次有新幀進行繪制,應用都會直接發送繪圖命令。圖形處理庫並不會儲存場景模型,而是由應用自行管理場景。相比保留模式,立即模式 API 因為能夠進行針對性優化,因而在性能上可以實現更好的表現。 


術語和翻譯說明

某些術語如 "Sprite",有部分資料翻譯為精靈,個人以為不如保留原文不翻譯,翻譯后可能會造成誤解,故本系列涉及到的概念、術語視上下文酌情翻譯或不譯。一般指某一類型、接口時直接使用類名、接口名原文,否則酌情翻譯為泛指的中文,比如 "Visual" 特指類型時使用 Visual,一般敘述翻譯為視覺元素。


參考資料

  1. Kerr, Kenny. "Graphics and Animation - Windows Composition Turns 10."MSDN Magazine 15 Oct. 2015: 12. 7 Dec. 2015.
  2. Microsoft. "DirectComposition (Windows)" Web. 7 Dec. 2015.https://msdn.microsoft.com/en-us/library/windows/desktop/hh437371(v=vs.85).aspx
  3. Microsoft. "Visual Layer - Windows app development." Web. 7 Dec. 2015.https://msdn.microsoft.com/en-us/library/windows/apps/mt592880.aspx
  4. Wikipedia contributors. "Desktop Window Manager." Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 11 Aug. 2015. Web. 7 Dec. 2015.
  5. Wikipedia contributors. "Windows Presentation Foundation." Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 10 Nov. 2015. Web. 7 Dec. 2015.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM