改善 Direct2D 應用程式的效能
雖然 Direct2D 是硬體加速,並適用於高效能,但您必須正確使用這些功能來最大化效能。 我們在此處顯示的技術衍生自研究常見案例,而且可能不適用於所有應用程式案例。 因此,仔細瞭解應用程式行為和效能目標有助於達成您想要的結果。
- 資源使用量
- 限制清空 的使用
- 位圖
- 在虛線 上使用並排點圖
- 轉譯複雜靜態內容的一般指導方針
- 使用幾何實現的個別基本快取
- 幾何渲染
- 使用 Direct2D 繪製文字
- 裁剪任意圖形
- DXGI 互作性:避免頻繁切換
- 瞭解您的像素格式
- 場景複雜度
- 改善 Direct2D 列印應用程式的效能
- 結論
資源使用量
資源是視訊或系統記憶體中的某種配置。 位圖和筆刷是資源的範例。
在 Direct2D 中,可以在軟體和硬體中建立資源。 在硬體上建立和刪除資源是昂貴的作業,因為它們需要大量額外負荷才能與視訊卡通訊。 讓我們看看 Direct2D 如何將內容轉譯至目標。
在 Direct2D 中,所有的繪圖命令都會包含在呼叫 BeginDraw 和呼叫 EndDraw 之間。 這些呼叫是針對渲染目標進行的。 呼叫轉譯作業之前,您必須先呼叫 BeginDraw 方法。 呼叫 BeginDraw 之後,內容通常會建置一批轉譯命令,但延遲處理這些命令,直到下列其中一個語句成立為止:
- EndDraw 發生。 呼叫 EndDraw 時,它會導致任何批次的繪圖作業完成,並傳回作業的狀態。
- 您明確呼叫 Flush:Flush 方法會導致批次被處理,並發佈所有待處理命令。
- 包含轉譯命令的緩衝區已滿。 如果完成前兩個條件之前,此緩衝區已滿,則會清除轉譯命令。
在清除基元之前,Direct2D 會保留對應資源的內部引用,例如位圖和畫筆。
重複使用資源
如先前所述,在硬體上建立和刪除資源的成本很高。 因此,盡可能重複使用資源。 以遊戲開發中建立位圖的範例為例。 通常,遊戲中組成場景的點陣圖會在建立時同時生成,並包含後續畫面對畫面渲染所需的所有不同變化。 在實際場景轉譯和重新轉譯時,會重複使用這些點陣圖,而不是重新建立。
注意
您無法針對視窗重設大小作業重複使用資源。 當視窗重新調整大小時,某些與縮放相關的資源,例如相容的轉譯目標,以及可能的圖層資源,必須重新建立,因為視窗內容需要重新繪製。 對於維護轉譯場景的整體品質而言,這很重要。
限制沖洗的使用
由於 Flush 方法會導致處理批次轉譯命令,因此建議您不要使用它。 針對最常見的案例,請將資源管理保留至 Direct2D。
點陣圖
如先前所述,在硬體中建立和刪除資源是非常昂貴的作業。 位圖是經常使用的資源類型。 在視訊卡上建立位圖的成本很高。 重複使用它們有助於加快應用程式的速度。
建立大型位圖
視訊卡的記憶體配置大小通常最低。 如果要求配置小於這個,則會配置這個大小下限的資源,而剩餘的記憶體會浪費,而其他專案則無法使用。 如果您需要許多小型位圖,更好的技術是配置一個大型位圖,並將所有小型位圖內容儲存在這個大型位圖中。 然後可以在需要較小位圖的地方讀取較大位圖的子區域。 通常,您應該在小型點陣圖之間包含邊框間距(透明黑色圖元),以避免在作業期間與較小的影像進行任何互動。 這也稱為 atlas,其優點是減少位圖建立額外負荷和小型位圖配置的記憶體浪費。 我們建議您將大部分位圖保持在至少 64 KB,並限制小於 4 KB 的點陣圖數目。
建立位圖集
有一些常見的情境,位圖圖集可以發揮良好效果。 小型點圖可以儲存在大型位圖內。 當您需要時,您可以透過指定目標矩形,從較大的點陣圖中提取這些小型點陣圖。 例如,應用程式必須繪製多個圖示。 與圖示相關聯的所有位圖都可以事先載入至一個大位圖中。 在渲染時,可以從大型位圖中擷取它們。
注意
在視訊記憶體中建立的 Direct2D 位圖,其大小會受限於儲存該位圖的顯示卡所支援的最大位圖大小。 建立比某個大小更大的點陣圖可能會導致錯誤。
注意
從 Windows 8 開始,Direct2D 包含 Atlas 效果,可讓此過程更容易。
建立共享位圖
建立共享位圖可讓進階呼叫者建立直接受現有物件支援的 Direct2D 位圖物件,且已與轉譯目標相容。 這可避免建立多個表面,並協助降低效能額外負荷。
注意
共享點陣圖通常僅限於軟體目標或與 DXGI 互通的目標。 使用 CreateBitmapFromDxgiSurface、CreateBitmapFromWicBitmap和 CreateSharedBitmap 方法來建立共享位圖。
複製點陣圖
建立 DXGI 表面是一項昂貴的作業,因此您可以在需要時重複使用現有的表面。 即使在軟體中,如果點陣圖大部分符合您想要的形式,除了小部分外,最好更新那個部分,而不是丟棄整個點陣圖並重新建立整個影像。 雖然您可以使用 CreateCompatibleRenderTarget 來達到相同的結果,但轉譯通常比複製更昂貴。 這是因為為了改善快取區域性,硬體實際上不會以點陣圖被定址的相同記憶體順序儲存位圖。 相反地,位圖可能會扭動。 驅動程式會隱藏從CPU中擷取的模糊功能(其速度很慢,只用於低端元件),或是 GPU 上的記憶體管理員。 由於在渲染時數據如何寫入渲染目標的限制,渲染目標通常不會被打亂,或者其打亂方式尚不如您確定不必渲染至該表面時所能達到的最佳效果。 因此,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::DrawText 和 ID2D1RenderTarget::DrawTextLayout 方法公開,可以讓呼叫者傳遞字串和格式化參數,或使用 DWrite 文字排版物件來處理多種格式。 這應該適用於大多數來電者。 轉譯文字的第二種方式,公開為 ID2D1RenderTarget::DrawGlyphRun 方法,可為已經知道他們希望轉譯的字形位置的客戶提供點陣化。 在 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 不會變更效能和品質。 根據頁面上的點陣化使用量,您可以選擇不同的點陣化 DPIs,以在逼真度與效能之間取得最佳平衡。
- 如果您在建立 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 元檔案。
- 避免推送複製來源背景的圖層資源(呼叫 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 是硬體加速,而且適用於高效能,但您必須正確使用這些功能,才能將輸送量最大化。 我們在這裡探討的技術衍生自研究常見案例,而且可能不適用於所有應用程式案例。