改善 Direct2D 應用程式的效能
雖然 Direct2D 是加速的硬體,而且適用于高效能,但您必須正確使用這些功能來最大化輸送量。 我們在這裡顯示的技巧衍生自研究常見案例,而且可能不適用於所有應用程式案例。 因此,仔細瞭解應用程式行為和效能目標有助於達成您想要的結果。
- 資源使用量
- 限制排清的使用
- 點陣圖
- 在虛線上使用磚點陣圖
- 轉譯複雜靜態內容的一般指導方針
- 使用幾何實現的個別基本快取
- 幾何轉譯
- 使用 Direct2D 繪製文字
- 裁剪任意圖形
- DXGI 互通性:避免頻繁切換
- 瞭解您的像素格式
- 場景複雜度
- 改善 Direct2D 列印應用程式的效能
- 結論
資源使用量
資源是某種類型的配置,不論是在視訊或系統記憶體中。 點陣圖和筆刷是資源的範例。
在 Direct2D 中,可以在軟體和硬體中建立資源。 在硬體上建立和刪除資源是昂貴的作業,因為它們需要大量額外負荷才能與視訊卡通訊。 讓我們看看 Direct2D 如何將內容轉譯至目標。
在 Direct2D 中,所有轉譯命令都會包含在 BeginDraw 呼叫與 EndDraw呼叫之間。 這些呼叫會呼叫轉譯目標。 您必須先呼叫 BeginDraw 方法,才能呼叫轉譯作業。 呼叫 BeginDraw 之後,內容通常會建置一批轉譯命令,但會延遲處理這些命令,直到下列其中一個語句成立為止:
- EndDraw 發生。 呼叫 EndDraw 時,它會導致任何批次繪圖作業完成,並傳回作業的狀態。
- 您明確呼叫 Flush: Flush 方法會導致批次處理,併發出所有擱置的命令。
- 保存轉譯命令的緩衝區已滿。 如果在滿足前兩個條件之前,此緩衝區已滿,則會清除轉譯命令。
在清除基本類型之前,Direct2D 會保留對應資源的內部參考,例如點陣圖和筆刷。
重複使用資源
如前所述,在硬體上建立和刪除資源的成本很高。 因此,盡可能重複使用資源。 在遊戲開發中採用點陣圖建立的範例。 通常,組成遊戲中場景的點陣圖都會同時建立,以及稍後畫面對畫面轉譯所需的所有不同變化。 在實際場景轉譯和重新轉譯時,會重複使用這些點陣圖,而不是重新建立。
注意
您無法重複使用視窗調整大小作業的資源。 當視窗調整大小時,某些縮放相依的資源,例如相容的轉譯目標,而且可能必須重新建立某些圖層資源,因為必須重新繪製視窗內容。 這在維護轉譯場景的整體品質時很重要。
限制排清的使用
由於 Flush 方法會導致批次處理的轉譯命令進行處理,因此建議您不要使用它。 針對最常見的案例,請將資源管理保留為 Direct2D。
點陣圖
如先前所述,在硬體中建立和刪除資源是相當昂貴的作業。 點陣圖是經常使用的資源類型。 在視訊卡上建立點陣圖的成本很高。 重複使用它們有助於加快應用程式的速度。
建立大型點陣圖
視訊卡通常具有最小記憶體配置大小。 如果要求配置小於此大小,則會配置此最小大小的資源,並浪費剩餘的記憶體,而無法用於其他專案。 如果您需要許多小型點陣圖,更好的技巧是配置一個大型點陣圖,並將所有小型點陣圖內容儲存在這個大型點陣圖中。 然後,可以讀取較大點陣圖的子領域,其中需要較小的點陣圖。 通常,您應該在小型點陣圖之間包含 (透明黑色圖元的填補) ,以避免作業期間較小的影像之間發生任何互動。 這也稱為 atlas,其優點是降低點陣圖建立額外負荷,以及小型點陣圖配置的記憶體浪費。 我們建議您將大部分的點陣圖保持在至少 64 KB,並限制小於 4 KB 的點陣圖數目。
建立點陣圖的 Atlas
有一些常見的案例,點陣圖 atlas 可以非常妥善地提供服務。 小型點陣圖可以儲存在大型點陣圖內。 當您需要這些小型點陣圖時,您可以藉由指定目的地矩形來提取這些小型點陣圖。 例如,應用程式必須繪製多個圖示。 所有與圖示相關聯的點陣圖都可以在前面載入大型點陣圖。 而且在轉譯時,可以從大型點陣圖擷取它們。
注意
在視訊記憶體中建立的 Direct2D 點陣圖僅限於儲存其所儲存介面卡所支援的點陣圖大小上限。 建立大於該點陣圖的點陣圖可能會導致錯誤。
注意
從Windows 8開始,Direct2D 包含Atlas 效果,可讓此程式更容易。
建立共用點陣圖
建立共用點陣圖可讓進階呼叫端建立直接由現有物件支援的 Direct2D 點陣圖物件,且已與轉譯目標相容。 這可避免建立多個表面,並協助降低效能額外負荷。
注意
共用點陣圖通常僅限於軟體目標或與 DXGI 互通的目標。 使用 CreateBitmapFromDxgiSurface、 CreateBitmapFromWicBitmap和 CreateSharedBitmap 方法來建立共用點陣圖。
複製點陣圖
建立 DXGI 介面是一項昂貴的作業,因此,您可以重複使用現有的表面。 即使在軟體中,如果點陣圖大部分是您想要的表單,但部分除外,最好更新該部分,而不是擲回整個點陣圖,然後重新建立所有專案。 雖然您可以使用 CreateCompatibleRenderTarget 來達到相同的結果,但轉譯通常比複製更昂貴。 這是因為為了改善快取位置,硬體實際上不會以點陣圖定址的相同記憶體順序來儲存點陣圖。 相反地,點陣圖可能會撥動。 驅動程式 (在低端元件) 上,或 GPU 上的記憶體管理員只會隱藏 CPU 的雜亂。 由於轉譯時資料如何寫入轉譯目標的條件約束,所以轉譯目標通常不會撥動,或以比您知道永遠不需要轉譯至表面的方式來擲回最佳效果。 因此, 會提供 CopyFrom* 方法,以便將矩形從來源複製到 Direct2D 點陣圖。
CopyFrom 可以用於其三種形式之一:
在虛線上使用磚點陣圖
轉譯虛線是相當昂貴的作業,因為基礎演算法的高品質和精確度。 對於大部分未涉及直線幾何的情況,使用磚式點陣圖可以更快產生相同的效果。
轉譯複雜靜態內容的一般指導方針
如果您在畫面上呈現相同的內容畫面格,請快取內容,特別是在場景很複雜時。
您可以使用三種快取技術:
- 使用色彩點陣圖進行完整場景快取。
- 每個基本快取使用 A8 點陣圖和 FillOpacityMask 方法。
- 使用幾何實現的個別基本快取。
讓我們更詳細地看看這其中每一項。
使用色彩點陣圖進行完整場景快取
當您轉譯靜態內容時,在動畫之類的案例中,建立另一個全色點陣圖,而不是直接寫入螢幕點陣圖。 儲存目前的目標、將目標設定為中繼點陣圖,並轉譯靜態內容。 然後,切換回原始螢幕點陣圖,並在其上繪製中繼點陣圖。
以下為範例:
// Create a bitmap.
m_d2dContext->CreateBitmap(size, nullptr, 0,
D2D1::BitmapProperties(
D2D1_BITMAP_OPTIONS_TARGET,
D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED),
dpiX, dpiY),
&sceneBitmap);
// Preserve the pre-existing target.
ComPtr<ID2D1Image> oldTarget;
m_d2dContext->GetTarget(&oldTarget);
// Render static content to the sceneBitmap.
m_d2dContext->SetTarget(sceneBitmap.Get());
m_d2dContext->BeginDraw();
…
m_d2dContext->EndDraw();
// Render sceneBitmap to oldTarget.
m_d2dContext->SetTarget(oldTarget.Get());
m_d2dContext->DrawBitmap(sceneBitmap.Get());
本範例會使用中繼點陣圖來快取,並在裝置內容轉譯時切換至的點陣圖。 這可避免針對相同用途建立相容的轉譯目標。
使用 A8 點陣圖和 FillOpacityMask 方法進行基本快取
當完整場景不是靜態,但是由幾何或靜態文字等元素所組成時,您可以使用每個基本快取技術。 這項技術會保留快取之基本類型的反鋸齒特性,並適用于變更筆刷類型。 它會使用 A8 點陣圖,其中 A8 是一種像素格式,代表 8 位的 Alpha 色板。 A8 點陣圖適用于將幾何/文字繪製為遮罩。 當您必須操作靜態內容的不透明度,而不是操作內容本身時,您可以翻譯、旋轉、扭曲或調整遮罩的不透明度。
以下為範例:
// Create an opacity bitmap.
m_d2dContext->CreateBitmap(size, nullptr, 0,
D2D1::BitmapProperties(
D2D1_BITMAP_OPTIONS_TARGET,
D2D1::PixelFormat(
DXGI_FORMAT_A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED),
dpiX, dpiY),
&opacityBitmap);
// Preserve the pre-existing target.
ComPtr<ID2D1Image> oldTarget;
m_d2dContext->GetTarget(&oldTarget);
// Render to the opacityBitmap.
m_d2dContext->SetTarget(opacityBitmap.Get());
m_d2dContext->BeginDraw();
…
m_d2dContext->EndDraw();
// Call the FillOpacityMask method
// Note: for this call to work correctly the anti alias mode must be D2D1_ANTIALIAS_MODE_ALIASED.
m_d2dContext->SetTarget(oldTarget.Get());
m_d2dContext->FillOpacityMask(
opacityBitmap.Get(),
m_contentBrush().Get(),
D2D1_OPACITY_MASK_CONTENT_GRAPHICS);
使用幾何實現的個別基本快取
另一種稱為 geometry 實現的每個基本快取技術,在處理幾何時提供更大的彈性。 當您想要重複繪製別名或反別名幾何時,將它們轉換成幾何實現,並重複繪製實現,會比重複繪製幾何本身還要快。 幾何實現通常也會耗用比不透明度遮罩少的記憶體, (特別適用于大型幾何) ,而且對縮放變更較不敏感。 如需詳細資訊,請參閱 幾何實現概觀。
以下為範例:
// Compute a flattening tolerance based on the scales at which the realization will be used.
float flatteningTolerance = D2D1::ComputeFlatteningTolerance(...);
ComPtr<ID2D1GeometryRealization> geometryRealization;
// Create realization of the filled interior of the geometry.
m_d2dDeviceContext1->CreateFilledGeometryRealization(
geometry.Get(),
flatteningTolerance,
&geometryRealization
);
// In your app's rendering code, draw the geometry realization with a brush.
m_d2dDeviceContext1->BeginDraw();
m_d2dDeviceContext1->DrawGeometryRealization(
geometryRealization.Get(),
m_brush.Get()
);
m_d2dDeviceContext1->EndDraw();
幾何轉譯
在繪製幾何上使用特定的繪製基本類型
在一般DrawGeometry呼叫上使用更特定的繪製基本呼叫,例如DrawRectangle。 這是因為使用 DrawRectangle時,幾何已經知道,因此轉譯速度會更快。
轉譯靜態幾何
在幾何為靜態的情況下,請使用上述每個基本快取技術。 不透明度遮罩和幾何實現可以大幅改善包含靜態幾何的場景轉譯速度。
使用多執行緒裝置內容
預期呈現大量複雜幾何內容的應用程式,應考慮在建立Direct2D裝置內容時指定D2D1_DEVICE_CONTEXT_OPTIONS_ENABLE_MULTI_THREADED_OPTIMIZATIONS旗標。 指定此旗標時,Direct2D 會將轉譯分散到系統上所有邏輯核心,這可大幅降低整體轉譯時間。
注意:
- 從Windows 8.1起,此旗標只會影響路徑幾何轉譯。 它不會影響只包含其他基本類型的場景, (例如文字、點陣圖或幾何實現) 。
- 此旗標在軟體 (轉譯時也不會有任何影響,亦即使用 WARP Direct3D 裝置進行轉譯時) 。 若要控制軟體多執行緒,呼叫端應該在建立 WARP Direct3D 裝置時使用D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS旗標。
- 指定此旗標可以在轉譯期間增加尖峰工作集,也可以增加已利用多執行緒處理之應用程式中的執行緒爭用。
使用 Direct2D 繪製文字
Direct2D 文字轉譯功能提供兩個部分。 第一個部分公開為 ID2D1RenderTarget::D rawText 和 ID2D1RenderTarget::D rawTextLayout 方法,可讓呼叫端傳遞字串和格式化參數或 DWrite 文字版面設定物件以取得多個格式。 這應該適用于大部分的來電者。 轉譯文字的第二種方式,公開為 ID2D1RenderTarget::D rawGlyphRun 方法,可為已經知道想要轉譯之圖像位置的客戶提供點陣化。 在 Direct2D 中繪製時,下列兩個一般規則有助於改善文字效能。
DrawTextLayout 與 DrawText
DrawText 和DrawTextLayout都讓應用程式能夠輕鬆地轉譯由DirectWrite API 格式化的文字。 DrawTextLayout會根據傳入的參數,將現有的DWriteTextLayout物件繪製到RenderTarget,而 DrawText會根據傳入的參數,建構呼叫端的DirectWrite配置。 如果必須多次轉譯相同的文字,請使用DrawTextLayout 而不是 DrawText,因為DrawText會在每次呼叫時建立版面配置。
選擇正確的文字轉譯模式
將文字反鋸齒模式設定為明確 D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE 。 轉譯灰階文字的品質相當於 ClearType,但速度會更快。
快取
使用完整場景或每個基本點陣圖快取,就像繪製其他基本類型一樣。
裁剪任意圖形
下圖顯示將剪輯套用至影像的結果。
您可以使用具有幾何遮罩的圖層,或使用不透明度筆刷的 FillGeometry 方法來取得此結果。
以下是使用圖層的範例:
// Call PushLayer() and pass in the clipping geometry.
m_d2dContext->PushLayer(
D2D1::LayerParameters(
boundsRect,
geometricMask));
以下是使用 FillGeometry 方法的範例:
// Create an opacity bitmap and render content.
m_d2dContext->CreateBitmap(size, nullptr, 0,
D2D1::BitmapProperties(
D2D1_BITMAP_OPTIONS_TARGET,
D2D1::PixelFormat(
DXGI_FORMAT_A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED),
dpiX, dpiY),
&opacityBitmap);
m_d2dContext->SetTarget(opacityBitmap.Get());
m_d2dContext->BeginDraw();
…
m_d2dContext->EndDraw();
// Create an opacity brush from the opacity bitmap.
m_d2dContext->CreateBitmapBrush(opacityBitmap.Get(),
D2D1::BitmapBrushProperties(),
D2D1::BrushProperties(),
&bitmapBrush);
// Call the FillGeometry method and pass in the clip geometry and the opacity brush
m_d2dContext->FillGeometry(
clipGeometry.Get(),
brush.Get(),
opacityBrush.Get());
在此程式碼範例中,當您呼叫 PushLayer 方法時,不會傳入應用程式建立層。 Direct2D 會為您建立圖層。 Direct2D 能夠管理此資源的配置和解構,而不需要來自應用程式的任何介入。 這可讓 Direct2D 在內部重複使用圖層,並套用資源管理優化。
在Windows 8許多優化都已使用圖層,建議您盡可能嘗試使用圖層 API,而不是FillGeometry。
Windows 8中的 PushLayer
ID2D1DeviceCoNtext介面衍生自ID2D1RenderTarget介面,而且是在 Windows 8 中顯示 Direct2D 內容的關鍵,如需此介面的詳細資訊,請參閱裝置和裝置內容。 透過裝置內容介面,您可以略過呼叫 CreateLayer 方法,然後將 Null 傳遞至 ID2D1DeviceCoNtext::P ushLayer 方法。 Direct2D 會自動管理圖層資源,而且可以在圖層和效果圖形之間共用資源。
軸對齊剪輯
如果要裁剪的區域會對齊繪圖介面的軸,而不是任意的。 此案例適用于使用裁剪矩形,而不是圖層。 效能提升比反鋸齒幾何更適合別名幾何。 如需軸對齊剪輯的詳細資訊,請參閱 PushAxisAlignedClip 主題。
DXGI 互通性:避免頻繁切換
Direct2D 可與 Direct3D 表面順暢地互通。 這非常適用于建立呈現 2D 和 3D 內容混合的應用程式。 但是,繪製 Direct2D 和 Direct3D 內容之間的每個切換都會影響效能。
轉譯至 DXGI 表面時,Direct2D 會在轉譯完成時儲存 Direct3D 裝置的狀態,並在轉譯完成時加以還原。 每次完成一批 Direct2D 轉譯時,都會支付此儲存和還原的成本,以及排清所有 2D 作業的成本,但 Direct3D 裝置尚未排清。 因此,若要提高效能,請限制 Direct2D 與 Direct3D 之間的轉譯切換數目。
瞭解您的像素格式
當您建立轉譯目標時,可以使用 D2D1_PIXEL_FORMAT 結構來指定轉譯目標所使用的像素格式和 Alpha 模式。 Alpha 色板是指定涵蓋範圍值或不透明度資訊的像素格式的一部分。 如果轉譯目標不使用 Alpha 色板,則應使用 D2D1_ALPHA_MODE_IGNORE Alpha 模式來建立。 這可讓轉譯不需要的 Alpha 色板所花費的時間。
如需像素格式和 Alpha 模式的詳細資訊,請參閱 支援的像素格式和 Alpha 模式。
場景複雜度
當您分析將呈現之場景中的效能作用點時,瞭解場景是否為填滿速率系結或頂點系結可以提供有用的資訊。
- 填滿速率:填滿率是指圖形卡每秒可轉譯和寫入視訊記憶體的圖元數目。
- 頂點系結:場景在包含許多複雜的幾何時會系結頂點。
瞭解場景複雜度
您可以藉由改變轉譯目標的大小來分析場景複雜度。 如果呈現目標大小的比例縮小,可以看到效能提升,則應用程式會受到填滿速率系結。 否則,場景複雜度是效能瓶頸。
當場景的填滿速率系結時,減少轉譯目標的大小可以改善效能。 這是因為要轉譯的圖元數目會與轉譯目標的大小成比例減少。
當場景系結頂點時,請減少幾何的複雜度。 但請記住,這會犧牲影像品質。 因此,應該在所需的品質與所需的效能之間做出仔細的取捨決策。
改善 Direct2D 列印應用程式的效能
Direct2D 提供與列印的相容性。 您可以使用 Direct2D 命令清單的形式傳送相同的 Direct2D 繪圖命令 (,) 到 Direct2D 列印控制項以進行列印、如果您不知道要繪製的裝置,或繪圖如何轉譯為列印。
您可以進一步微調 Direct2D 列印控制項的使用方式,以及 Direct2D 繪圖命令,以提供更好的效能來提供列印結果。
Direct2D列印控制項會在看到 Direct2D 程式碼模式時輸出偵錯訊息,以降低列印品質或效能 (,例如本主題稍後所列的程式碼模式) 提醒您可以避免效能問題的位置。 若要查看這些偵錯訊息,您必須在程式碼中啟用 Direct2D 偵錯層 。 如需啟用偵錯訊息輸出的指示,請參閱偵錯訊息。
當您建立 D2D 列印控制項時,請設定正確的屬性值
當您建立 Direct2D 列印控制項時,可以設定三個屬性。 這兩個屬性會影響 Direct2D 列印控制項處理特定 Direct2D 命令的方式,進而影響整體效能。
- 字型子集模式: Direct2D 列印控制項會先在每個頁面使用的字型資源,再傳送要列印的頁面。 此模式會減少列印所需的頁面資源大小。 根據頁面上的字型使用方式,您可以選擇不同的字型子集模式,以獲得最佳效能。
- D2D1_PRINT_FONT_SUBSET_MODE_DEFAULT 在大部分情況下提供最佳列印效能。 當設定為此模式時, Direct2D 列印控制項會使用啟發學習策略來決定何時要子集字型。
- 對於具有 1 或 2 頁的簡短列印工作,建議您 D2D1_PRINT_FONT_SUBSET_MODE_EACHPAGE ,其中 Direct2D 列印控制項子集和內嵌每個頁面的字型資源,然後在頁面列印之後捨棄該字型子集。 此選項可確保每一頁在產生後立即列印,但列印 (所需的頁面資源大小會稍微增加,且通常會有大型字型子集) 。
- 對於具有許多文字頁和小型字型大小 (的列印工作,例如使用單一字型) 的 100 頁文字,我們建議 D2D1_PRINT_FONT_SUBSET_MODE_NONE,其中 Direct2D 列印控制項完全不會子集字型資源;相反地,它會連同第一次使用字型的頁面一起傳送原始字型資源,並重新使用字型資源供稍後的頁面使用,而不需重新傳送。
- 點陣化 DPI:當 Direct2D 列印控制項需要在 Direct2D-XPS 轉換期間點陣化 Direct2D 命令時,它會使用此 DPI 進行點陣化。 換句話說,如果頁面沒有任何點陣化內容,則設定任何 DPI 並不會變更效能和品質。 根據頁面上的點陣化使用量,您可以選擇不同的點陣化 DPI,以達到精確度與效能的最佳平衡。
- 如果您在建立 Direct2D 列印控制項時未指定值,則 150 是預設值,在大部分情況下,這是列印品質與列印效能的最佳平衡。
- 較高的 DPI 值通常會導致較佳的列印品質 (,因為其產生的點陣圖較大,因此會保留更多詳細資料) 但效能較低。 我們不建議任何大於 300 的 DPI 值,因為這不會引入人類眼睛可察覺的額外資訊。
- 較低的 DPI 可能表示效能較佳,但也可能會產生較低的品質。
避免使用特定的 Direct2D 繪圖模式
Direct2D可以視覺化呈現哪些專案,以及列印子系統可在整個列印管線中維護及傳輸的內容之間有差異。 Direct2D 列印控制項會藉由近似或點陣化列印子系統不支援的 Direct2D 基本類型來橋接這些間距。 這類近似值通常會導致列印精確度較低、列印效能較低,或兩者都較低。 因此,即使客戶可以針對螢幕和列印轉譯使用相同的繪圖模式,但在所有情況下都不理想。 最好不要盡可能針對列印路徑使用這類 Direct2D 基本類型和模式,或自行控制品質與點陣化影像大小的位置。
以下是一份案例清單,其中列印效能和品質不理想,而且您可能想要考慮變更程式碼路徑,以獲得最佳列印效能。
- 避免使用 D2D1_PRIMITIVE_BLEND_SOURCEOVER以外的基本混合模式。
- 繪製 D2D1_COMPOSITE_MODE_SOURCE_OVER 和 D2D1_COMPOSITE_MODE_DESTINATION_OVER以外的影像時,請避免使用組合模式。
- 避免繪製 GDI Meta File。
- 避免將來源背景複製 (呼叫 PushLayer 的圖層資源,並將 D2D1_LAYER_OPTIONS1_INITIALIZE_FROM_BACKGROUND 傳遞至 D2D1_LAYER_PARAMETERS1 結構) 。
- 避免使用 D2D1_EXTEND_MODE_CLAMP 建立點陣圖筆刷或影像筆刷。 建議您使用D2D1_EXTEND_MODE_MIRROR,如果完全不在意影像系結以外的圖元 (,例如,附加至筆刷的影像已知大於填滿的目的地區域) 。
- 避免使用 檢視方塊轉換繪製點陣圖。
以直接和純文字方式繪製文字
Direct2D 在轉譯文字以顯示以提升效能和/或更佳的視覺品質時,會有數個優化。 但並非所有優化都會改善列印效能和品質,因為紙張上的列印通常處於較高的 DPI,而且列印不需要容納動畫之類的案例。 因此,建議您直接繪製原始文字或圖像,並在建立列印命令清單時避免下列任何優化。
- 避免使用 FillOpacityMask 方法繪製文字。
- 避免在別名模式中繪製文字。
盡可能繪製原始點陣圖
如果目標點陣圖是 JPEG、PNG、TIFF 或 JPEG-XR,您可以從磁片檔案或記憶體內部資料流程建立 WIC 點陣圖,然後使用ID2D1DeviceCoNtext::CreateBitmapFromWicBitmap從該 WIC 點陣圖建立Direct2D點陣圖,最後直接將該 Direct2D 點陣圖傳遞至 Direct2D 列印控制項,而不需進一步操作。 如此一來,Direct2D 列印控制項就能夠重複使用點陣圖資料流程,這通常可略過多餘的點陣圖編碼和解碼) ,並在中繼資料如色彩設定檔等中繼資料時保留更好的列印 (品質 () 。
繪製原始點陣圖可為應用程式提供下列優點。
- 一般而言, Direct2D 列印會保留原始資訊 (,而不會遺失或雜訊) 直到管線延遲為止,特別是當應用程式不知道 (或不想知道) 列印管線的詳細資料時, (列印管線的詳細資料,例如列印的目標印表機、目標印表機的 DPI 為何,依此類) 。
- 在許多情況下,延遲點陣圖點陣化表示將 96DPI 相片列印到 600DPI 印表機) 時,較佳的效能 (。
- 在某些情況下,傳遞原始影像是接受高精確度 (的唯一方式,例如內嵌色彩設定檔) 。
不過,您無法選擇進行這類優化,因為:
- 藉由查詢印表機資訊和早期點陣化,您可以點陣化內容本身,完全控制紙張上的最終外觀。
- 在某些情況下,早期點陣化可能會實際改善應用程式的端對端效能, (例如列印電子錢包大小的相片) 。
- 在某些情況下,傳遞原始點陣圖需要大幅變更現有的程式碼架構 (,例如影像延遲載入和資源更新路徑等) 。
結論
雖然 Direct2D 是硬體加速,而且適用于高效能,但您必須正確使用這些功能,才能將輸送量最大化。 我們在這裡探討的技術衍生自研究常見案例,而且可能不適用於所有應用程式案例。