本文章是由機器翻譯。

使用 C ++ 的 Windows

簡介 Direct2D

Kenny Kerr

本專欄根據 Windows 7 鮮版。詳細資料如有變更。

內容

架構及主體
工廠和資源
呈現目標
筆刷] 及 [繪圖] 指令

推出 Windows Vista 的幾年前,很清楚即將結束 Windows 圖形裝置介面 (GDI) 的紀元。GDI,即使使用 GDI + 的協助有已顯示其時代特別與 Windows Presentation Foundation (WPF) 的上司圖形功能比較時。如同,未能足夠時,GDI WPF 利用的硬體加速的 Direct3D 的 abundance 時遺失其硬體加速功能。

不過,如果要開發高效能 」 和 「 高品質的商業應用程式將會仍然看 C ++ 和原生程式碼傳遞的電源。這就是為什麼幾件事激發 Windows 7 有關的 Direct2D 和 DirectWrite 簡介比我。Direct2D 會是全新的 2D 圖形設計來支援最佳可能效能,最嚴苛,和以視覺化方式豐富桌上型電腦應用程式的 API。DirectWrite 也是一個全新的 API,補充 Direct2D,並提供 [硬體加速文字 Direct2D,和高品質文字版面配置以進階支援 OpenType 印刷樣式呈現和 ClearType 文字的呈現方式搭配使用時。

這的篇文章,我們將探索這些新技術並可讓您的重要的原因,和如何開始使用目前的概念。

架構及主體

在 Windows XP,GDI 和 Direct3D 有相等的獨立作業系統是攸關。使用者模式部分 GDI 和 Direct3D interfaced 直接與核心模式對應中。結果都可能是直接硬體加速指定適當的顯示驅動程式。與 Windows Vista,Microsoft 委派控制視訊的硬體,以獨佔方式以 Direct3D 的責任。GDI 突然變成舊版的圖形透過最上層 Direct3D 的軟體式呈現主要支援的 API。

所以 GDI 是無作用和 Direct3D 會在的未來,但是其中不會這讓我們如何執行這所有相關 Direct2D 和 WPF 嗎?也,請注意第一件事是 Direct3D 有效地在的 Windows 圖形處理單元 (GPU) API,是否要呈現圖形或 hotwire 您 GPU,加入的計算能力的。略過 (這仍受支援) 的 OpenGL,Direct3D 會是直接控制圖形顯示介面卡從使用者模式應用程式在最低層的圖形管線。

Direct3D 會是所謂的即時模式圖形 API。這只是表示 API 提供薄層透過任何的圖形硬體提供存取硬體的功能,應該在硬體會受限於以某種方式填入部分的空白時。每次您要呈現,或在更新顯示時,您有效地必須告訴您所即將要呈現,提供 Direct3D 管線它需要呈現框架,然後告訴它您已完成,並會顯示更新所有的 Direct3D。雖然 Direct3D 會提供許多進階的 3D 功能,它是最多您直接控制所有的這些和它有少數的 3D 基本型別。不用,說這不是一般的工作。

若要在 Windows Vista,之前 Direct3D 也會包含一個較高層級保留-模式圖形已建置上立即模式 API 的最上層的 API。這個 API 可提供直接支援管理呼叫場景 3D 物件,— 框架物件與光源處理 」 的階層架構。因為 API 會保留圖形,整個畫面的複本,所以說,它被稱為保留的模式。應用程式只會更新的場景,並 API 自動負責呈現和更新顯示。不用說的問題是所有的是有代價的 ; 如果成本太高,或抽象不完全符合您需求您必須完全捨棄這項技術,直接,依靠即時模式的 API,而且提供您自己的幾何形狀演算法。

如果您在熟悉 WPF,保留-模式圖形 API 的上一個描述應該音效相當熟悉。雖然 Direct3D 停止提供其保留的模式 API,WPF 會包含它自己內部保留-模式 API,稱為 「 媒體整合層 (MIL)。MIL 會位於之間 WPF 和 Direct3D,及保留一份畫面 WPF,允許 Managed 程式碼互動時的背景中剩餘的視覺物件所定義的圖形則以確保變更的 MIL 與協調被反映在畫面,它會保留圖形中。這允許 WPF 提供非常豐富及互動式體驗,讓開發人員,但它有價格]。

有說,所有,它應該是相當明顯 Direct2D 的時候。Direct2D 為簡單和複雜的 geometries 」、 「 點陣圖中和 「 建立直接在之上無與倫比的效能的 Direct3D 的立即模式圖形 API 的文字,提供豐富的呈現方式的支援。結果會是以高效能,而低負荷的方法,為產生高品質的圖形內容,您的應用程式。它提供一個明顯較簡單的 API 產生 2D 相較於在大部分的情況下新增一些額外負荷時,直接使用 Direct3D 的內容。事實的一些特定作業,例如每個基本型別反鋸齒,您想是硬碟按下 outperform Direct2D 與 Direct3D。Direct2D 應該也可以輕鬆地 outperform MIL 和 Quartz2DE 的。

如果,未能足夠時,它會進一步提供許多其他功能,例如遠端的呈現方式透過遠端桌面通訊協定 (RDP),後援的伺服器端呈現的軟體或補償缺少硬體支援呈現 ClearType 的文字] 和 [使用 GDI 和 Direct3D 前所未有的互通性。讓我們只是假設還有沒有這個 WPF 的 「 airspace 呢。

現在讓我們撰寫一些程式碼取得下!若要將範例著重,我會使用 Active Template Library (ATL) 」 和 「 Windows Template Library (WTL) 來處理所有未定案視窗化程式碼。請記住,Direct2D 是有關轉譯。如果您要將呈現至視窗,您仍需要管理的視窗。如果您希望滑鼠輸入,您仍然需要以平常的方式回應視窗訊息。您可以取得的概念。[圖 1 將包含您,我將在本文的期間填寫視窗的一個基本架構。

[圖 1] 視窗骷髏

#define HR(_hr_expr) { hr = _hr_expr; if (FAILED(hr)) return hr; }
class Window : public CWindowImpl<Window, CWindow, CWinTraits<WS_OVERLAPPEDWINDOW>>
{
public:
    BEGIN_MSG_MAP(Window)
        MSG_WM_DESTROY(OnDestroy)
    END_MSG_MAP()

    HRESULT Create()
    {
        VERIFY(__super::Create(0)); // top-level
        VERIFY(SetWindowText(L"Direct2D Sample"));

        VERIFY(SetWindowPos(0, // z-order
                            100, // x
                            100, // y
                            600, // pixel width,
                            400, // pixel height,
                            SWP_NOZORDER | SWP_SHOWWINDOW));

        VERIFY(UpdateWindow());
        return S_OK;
    }
private:
    void OnDestroy()
    {
        ::PostQuitMessage(1);
    }
};

工廠和資源

以各種其他 Direct3D 和 XmlLite API,Direct2D 會使用 COM 規格的輕量型版本,來管理物件存留期,透過衍生自 IUnknown 的介面。 還有不需要初始化 COM 執行時間,並擔心 Apartment 或 Proxy。 這是只在慣例,以簡化管理的資源,並將允許 API 和應用程式公開 (Expose) 來使用物件,以妥善定義的方式。 請記住,因為 Direct2D 使用 COM 介面並不表示您可以提供您自己的介面的實作。 除非另有說明,否則 Direct2D 將使用只有自己的實作。 我會建議您使用 ATL 的 CComPtr 智慧型指標類別來管理,介面的指標像我在本文中範例。

每個 Direct2D 應用程式一開始先建立 Factory 物件中。 D2D1CreateFactory 函式會傳回在 ID2D1Factory 介面的實作:

CComPtr<ID2D1Factory> factory;
HR(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory));

不用說才能使用這些型別必須包含 d2d1.h,Direct2D 標頭檔的各種 Direct2D 介面、 結構,常數以及 D2D1CreateFactory 函式的宣告。 d2d1.lib 檔案被提供來匯入 D2D1CreateFactory 函式中。 d2d1helper.h 標頭檔也提供一個大許多有用的函式和類別的 Direct2D 使用從 C ++。 我通常 Direct2D 專案中加入一個專案的先行編譯標頭中加入下列指示詞:

#include <d2d1.h>
#include <d2d1helper.h>
#pragma comment(lib, "d2d1.lib")

如我所述 Direct2D 不依賴 COM,但 D2D1CreateFactory,第一個參數可能會讓您相信否則。 D2D1_FACTORY_TYPE 列舉會定義 D2D1_FACTORY_TYPE_SINGLE_THREADED 和 D2D1_FACTORY_TYPE_MULTI_THREADED 的常數,但這些 COM Apartment 與無關,不假設任何執行緒相似性。 D2D1_FACTORY_TYPE_SINGLE_THREADED 常數只會指定 Factory 物件中,以及任何及所有的物件生根的工廠,可能被存取只有單一執行緒一次。 以這種方式建立的物件,會提供單一執行緒存取,避免任何不必要的序列化的呈現方式呼叫最佳效能。 所 D2D1_FACTORY_TYPE_MULTI_THREADED 的常數從另一方面來說,指定 Factory 物件中,以及任何及所有的物件,該工廠,在根目錄可能可以存取由多個執行緒同時。 Direct2D 會提供必要的同步處理與連鎖的參考計數。 這可用來共用某些資源時,同時呈現不同的目標大小寫。 請注意此平行處理原則專屬於的 CPU,並指示傳送給 [GPU 可能仍會序列化和最終 parallelized 獨立。

[確定],所以什麼 Factory 物件用於? 也,負責建立與裝置無關 (Device-Independent 的所有資源,主要 geometries,以及都建立呈現目標裝置的表示。 呈現目標,然後有負責建立裝置的相關資源。 在裝置的相依性和與裝置無關 (Device-Independent 資源之間的差異很重要的正確使用 Direct2D 大小寫。 其中一個為保留的模式圖形 API 例如 WPF 的優點是硬體與程式設計模型之間中, 繼層通常負責顯示裝置可能會遺失的情況下)。 這可能是各種不同的原因。 解析度可能會在背景中進行變更,例如當使用者取消停駐這些筆記型電腦時, 可能遺失的遠端桌面連線工作階段,可能會移除顯示介面卡等等。 像 Direct2D 的即時模式圖形 API 必須考慮到這些事件。 不用說好處,是用來呈現特定裝置的資源可能會實際存在裝置上,因此提供最較佳的效能。

這些原因最好來清楚地分隔的與裝置無關 (Device-Independent 資源建立裝置的相關資源。 以容納這,在 [圖 2 我加入這兩個方法至視窗類別,從 [圖 1 中。

[圖 2 個別建立裝置的獨立和裝置的相依的資源

HRESULT CreateDeviceIndependentResources()
{
    HRESULT hr;
    HR(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_factory));
    // TODO: Create device-independent resources here
    return S_OK;
}
HRESULT CreateDeviceResources()
{
    HRESULT hr;
    // TODO: Create device resources here
    return S_OK;
}

我會擴充出其下的幾個章節中但的時間的您可以呼叫 CreateDeviceIndependentResources 從建立視窗類別的方法因為需要一次會建立與裝置無關 (Device-Independent) 資源。 CreateDeviceResources 會,但是,要求,以建立所需的裝置資源上呼叫。 您要也加入 m_factory 成員變數如下:

CComPtr<ID2D1Factory> m_factory;

呈現目標

呈現目標會用來表示裝置,並取決於基礎的裝置本身。 與呈現目標,您可以建立如筆刷的各種資源,並執行實際的繪製作業。 Direct2D 會支援許多不同類型的呈現目標。 如果您建置從頭 Direct2D 應用程式,您可能會建立呈現目標,以呈現內容視窗 (HWND)。 您也可以建立呈現 GDI 的裝置內容 (DC) 或 DirectX 圖形基礎結構 (DXGI) 出現在 Direct3D 應用程式用於呈現目標。 您甚至可以建立呈現目標的各種類型的螢幕外的轉譯點陣圖資源。

建立呈現目標的不同類型提供各種 Factory 方法。 方法本身都是很明顯。 舉例來說,在的 CreateHwndRenderTarget 方法會建立視窗呈現目標,而 CreateDxgiSurfaceRenderTarget 方法則會建立 DXGI 介面呈現目標。 若要呈現至視窗,您將需要更新 CreateDeviceResources 方法建立視窗的呈現目標。 最起碼,它可能看起來像 [圖 3 。 請注意這個範例不 DPI,但也就是在另一篇文章的主題。

[圖 3] 建立視窗的轉譯目標

HRESULT CreateDeviceResources()
{
    HRESULT hr;
    if (0 == m_target)
    {
        CRect rect;
        VERIFY(GetClientRect(&rect));
        D2D1_SIZE_U size = D2D1::SizeU(rect.Width(), rect.Height());
        HR(m_factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(),
                        D2D1::HwndRenderTargetProperties(m_hWnd, size), &m_target));
    }
    return S_OK;
}

您想也加入 m_target 成員變數:

CComPtr<ID2D1HwndRenderTarget> m_target;

CreateDeviceResources 方法建立裝置的資源只当呈現目標不是尚未建立或,您會發現很快就,如果是遺失的裝置中,而且需要重新建立呈現目標。

CreateHwndRenderTarget 方法的第一個參數實際上屬於型別 D2D1_RENDER_TARGET_PROPERTIES。 這個參數是通用的所有呈現目標建立函式。 RenderTargetProperties 函式是實際 Helper 函式在 d2d1helper.h 標頭檔中定義。 它表示初始化 Direct2D 所使用的資料結構的許多一般模式,並有助於大幅簡化您的程式碼。 RenderTargetProperties Helper 函式將有您,以產生的結構的最常見初始設定的預設值的參數。 您可以覆寫調整像素格式和 DPI 的資訊以及其他的特性,例如是否要強制硬體或軟體為基礎的呈現方式,以及是否支援 GDI Interop 呈現目標的這些值。

同樣地,CreateHwndRenderTarget 的第二個參數是實際 D2D1_HWND_RENDER_TARGET_PROPERTIES 結構,並提供特定視窗的資訊。

在建立呈現目標,我現在可以進行一些實際的呈現。 要執行這項操作,至視窗類別中加入呈現方法基本如 [圖 4 ] 所示的外框。

[圖 4 呈現

void Render()
{
    if (SUCCEEDED(CreateDeviceResources()))
    {
        if (0 == (D2D1_WINDOW_STATE_OCCLUDED & m_target->CheckWindowState()))
        {
            m_target->BeginDraw();
            m_target->SetTransform(D2D1::Matrix3x2F::Identity());
            m_target->Clear(D2D1::ColorF(D2D1::ColorF::Red));
            // TODO: add drawing code here

            if (D2DERR_RECREATE_TARGET == m_target->EndDraw())
            {
                DiscardDeviceResources();
            }
        }
    }
}

這裡的邏輯是相當重要的因為它可讓您非常有效率更新,感謝以重複使用的裝置資源,和因為它必須預期裝置遺失。 在呈現) 方法會藉由呼叫 CreateDeviceResources 我所描述的方法會啟動。 當然它不需要執行任何動作如果仍然可以使用裝置資源。 為的最佳化我會檢查視窗狀態以確保它不是 occluded,是只花俏詞彙,表示視窗會受阻,從 [檢視] 和 [任何繪製就會浪費珍貴的 CPU 和 GPU) 資源。 雖然這很少因為桌面視窗管理員 (DWM) 處理桌面撰寫,它會不會影響,而且是不錯的最佳化,停用桌面撰寫時。

呈現目標的 BeginDraw] 和 [EndDraw 方法的呼叫之間,必須被 sandwiched 實際的繪圖。 大部分的呈現目標的方法將有您,void 傳回型別。 因為繪製作業的批次處理,只有當繪製作業會清除且呈現至裝置時,才,將會偵測任何失敗。 EndDraw 方法,因此具有 HRESULT 傳回型別。 它會使用 D2DERR_RECREATE_TARGET 常數,表示已經失效的呈現目標,並且必須重新建立。 然後它會呼叫它必須釋放所有裝置資源的 DiscardDeviceResources。

void DiscardDeviceResources()
{
    m_target.Release();
}

我應該也只是提到呈現目標的 SetTransform 和清除方法,呼叫。 SetTransform 會在這種情況下指定應使用的識別矩陣轉換任何後續的繪製作業。 不用說的矩陣的真正不轉譯所有,讓這只是確保繪製作業的使用常值 (Literal) 的座標空間,以與裝置無關 (Device-Independent 像素為單位)。 您就可以但是,呼叫 SetTransform 重複呈現變更轉換在作業期間。 清除方法只清除後續的繪圖作業在繪圖區域,並在這種情況下會讓它紅色。

不用說如果是建立視窗,此時就會將發現視窗仍會保持狀態白色。 項目仍需要呼叫 Render 方法來更新顯示。 此中,,您可以加入訊息處理常式,WM_PAINT] 和 [WM_DISPLAYCHANGE 的視窗訊息。 您可以執行的訊息對應中加入下列:

MSG_WM_PAINT(OnPaint)
MSG_WM_DISPLAYCHANGE(OnDisplayChange)

回應 WM_PAINT 明顯,但處理 WM_DISPLAYCHANGE 同樣重要,以確保正確重新繪製視窗中,應該顯示解析度,或色彩深度變更 (請參閱 [圖 5 ).

[圖 5 重新繪製

void OnPaint(CDCHandle /*dc*/)
{
    PAINTSTRUCT paint;
    VERIFY(BeginPaint(&paint));
    Render();
    EndPaint(&paint);
}
void OnDisplayChange(UINT /*bpp*/, CSize /*resolution*/)
{
    Render();
}

請注意,BeginPaint 所傳回的 DC 不完全使用。建立視窗現在會在一個紅色的背景視窗如預期般。但是調整大小] 視窗將,時,顯示某些閃爍情況。發生,則是視窗背景會仍然自動被清除使用視窗類別背景筆刷,因為 WM_ERASEBKGND 訊息的預設處理。若要避免這,只處理此訊息,並傳回 TRUE 的 OnEraseBackground 方法,以表示您將會處理清除視窗背景。您現在可以調整視窗大小時避免任何的閃爍情況。

時在您可能會想要處理視窗調整大小。若要這樣做加入 WM_SIZE 視窗訊息,在訊息處理常式,如下所示:

MSG_WM_SIZE(OnSize)

[OnSize 控制代碼然後只要通知呈現目標,大小已變更的需要:

void OnSize(UINT /*type*/, CSize size)
{
    if (0 != m_target)
    {
        if (FAILED(m_target->Resize(D2D1::SizeU(size.cx, size.cy))))
        {
            DiscardDeviceResources();
            VERIFY(Invalidate(FALSE));
        }
    }
}

如果它無法調整大小,您只是放棄,裝置的資源,並重新它們會自動建立下一次呈現視窗。 請注意如何調整大小方法接受新裝置 (以像素為單位) 的大小,因為 WM_SIZE 訊息進行通訊,用戶端區域,以像素為單位) 的大小。 即使 Direct2D 會使用與裝置無關 (Device-Independent 座標系統,視窗呈現目標的瞭解它最後必須對應至裝置像素為單位)。

筆刷] 及 [繪圖] 指令

若要進行任何有意義的繪圖,您要建立一些筆刷。 您需要繪製各種幾何圖形,以及文字的筆刷。 讓其建立應 CreateDeviceResources 方法中,筆刷就會落在裝置相關的資源的類別。 如您所預期 Direct2D 提供實線和點陣圖的筆刷以及線性和 (放射) 的漸層筆刷。 若要以便純色筆刷您可以將下列的方法呼叫之後建立呈現目標的加入。 這的種方式它會重新建立才會重新建立呈現目標。

HR(m_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black), &m_brush));

請記得也發行筆刷 DiscardDeviceResources 方法中的,如下所示:

m_brush.Release();

您要也加入 m_brush 成員變數如下:

CComPtr<ID2D1SolidColorBrush> m_brush;

fig02.gif

[圖 7 基本的繪圖

您現在可以加入某些清除和 EndDraw 方法之間轉譯方法繪製命令的 Basic。[圖 6 中的程式碼會產生以對角線透過它圓形。雖然我會讓未來的文章的筆刷的完整討論,值得一提 Direct2D 讓您能夠有效率地變更呈現,時的筆刷的色彩 obviating 需要建立多個不同的色彩的筆刷。

[圖 6 圓形,以對角線

m_target->DrawLine(D2D1::Point2(10.0f, 10.0f), // start
                   D2D1::Point2(200.0f, 200.0f), // end
                   m_brush,
                   10.0f); // stroke width

const D2D1_POINT_2F center = D2D1::Point2(105.0f, 105.0f);

const D2D1_ELLIPSE ellipse = D2D1::Ellipse(center,
                                           95.0f, // radius X
                                           95.0f); // radius Y

m_target->DrawEllipse(&ellipse,
                      m_brush,
                      5.0f); // stroke width

如我已提到 Direct2D 會使用與裝置無關 (Device-Independent 座標系統,因此座標表示不一定對應到顯示像素為單位),但是而將會接受目標裝置的 [DPI 設定。圖 7 會顯示 [繪圖] 命令的結果。

雖然我已經使用的不透明筆刷,但您也可以指定的 Alpha 值建立核心部分的內容的 Alpha 混色與筆刷時。

不幸的是,我已完全用完空間,但現在應該有最好的可能 Direct2D 和 DirectWrite 會對往後的原生應用程式。有許多多個原因喜歡這些新技術,我希望深入包括豐富 geometries 和作業以及 DirectWrite 的所有功能的後續資料行中。在同時啟動 Direct2D 實驗。我相信您會發現它令人印象深刻。

了解: Direct2D 呈現

許多人將會想要 對照 Direct2D 和 Direct3D 應用程式的效能。這是以橘子比較的蘋果的東西,Direct2D 會提供其他 2D 呈現 API 如 GDI 更類似基本型別的一組 / GDI + 或 WPF。也就更容易使用。不過,可能 Direct2D 實際上可以 out-perform 組簡單或 naïve,Direct3D 中的應用程式一些不同的案例某些客戶驚人。例如,Direct2D 或混用重複從點陣圖繪製大量的行與不同的色彩時,可以 outperform 一個 naïve Direct3D 應用程式。

Direct2D 如何執行這在於瞭解 Direct2D 不會維護 1: 1 的關聯性之間繪製的要求,發行給它,並在基本型別,它發出到 Direct3D。事實上,Direct2D 嘗試彙總到 Direct3D 它的要求,在數種不同方式。

降低的 Vertex 緩衝區的對應

請考慮在 naïve Direct3D 應用程式。它在建立頂點緩衝區,將其對應,寫入其幾何形狀,緩衝區解除對應中,它和繪製它。這種方法的問題是如果頂點緩衝區仍在使用,GPU) 的下一個的對應要求時在 CPU 將必須延後直到,GPU 是與它,並接著它可以只對應回應用程式的記憶體。這可以大幅減少應用程式的效能。

Direct2D 解決了這個的問題,保留頂點緩衝區對應到記憶體和累積到其中的許多連續基本的幾何形狀。只有當頂點緩衝區未滿,或清除應用程式會呼叫或 EndDraw,不會 Direct2D 然後傳送在繪圖關閉 Direct3D 呼叫。導覽和解除對應呼叫數會大幅降低,因為,這可以減少 GPU 停止的數。

合併的繪圖呼叫

即使允許 geometries 累積在頂點緩衝區中之後,在 naïve Direct3D 應用程式必須發出的大部分的 Direct2D 的繪製呼叫,以便 Direct3D 會繪製呼叫。考慮使用不同的色彩呈現兩個不同的矩形 (每個色彩可能會需要撰寫不同的著色器以表示它常數的資料)。每次更新著色器常數資料時,需要發出不同的繪製呼叫。

只要不要變更某些其他常數。例如,是連續使用筆刷的相同型別。或者,如果點陣圖的筆刷,相同的輸入點陣圖使用一致的。Direct2D 可以使用 [其頂點著色器] 來繼續累積著色器常數的資料,並再發出一個 Direct3D 繪製大量的 Direct2D 繪製呼叫的呼叫。

Out-of-Order 文字轉譯

透過三個階段的硬體中,完全執行 Direct2D 文字呈現管線。第一個階段會將圖像 (Glyph) 寫入至一個的紋理下, 一個階段下拉式範例這些圖像 (Glyph),並在最後的階段會執行傳輸 [文字] 至呈現目標清除-型別篩選作業。.naïve 應用程式會循序呈現每個階段,變更三次的呈現目標,並發出在繪製呼叫每個紋理之間移動資料。Direct2D 會呈現文字的基本項目順序與其他基本型別。它將會先累積大量的圖像 (Glyph)。然後它下, 拉式範例全部的並 (和諧) 與其他發行給 Direct2D 的幾何基本的最後一個組順序的圖像 (Glyph)。結合文字呈現方式,以這種方式減少時間呈現目標的變更,以及一般的 Direct3D 裝置狀態變更的數目以呈現在的文字即使 Direct2D 文字呈現呼叫是交錯式的其他基本型別。

結合頂點緩衝區批次處理,繪製呼叫結合,和 Out-of-順序呈現文字,Direct2D 是效能的能夠達成呈現,需要大量的開發工作,以符合如果應用程式效能的而直接目標 Direct3D 數量。

--標記 Lawrence,資深軟體開發工程師,Microsoft。

您問題或意見寄至mmwincpp@Microsoft.com

Kenny Kerr 會是一個軟體工匠,專精於 Windows 的軟體開發。他有熱情,以寫入的教導有關程式設計和軟體設計的開發人員。您可以與 Kenny 在weblogs.asp。net / kennykerr.