解析度與控制項縮放
本文中所用的「解析度」一詞,是指位圖的尺寸(高寬)。
win2d xaml 控制項繪製的物件均有解析度和 dpi 這兩項屬性。物件的 dpi 指示了繪製時其構成畫素的密度。 dpi 就像縮放因數 —— dpi 越高則繪製物件構成的畫素數越多;反之,dpi 越低,其構成畫素數就越少。有關一般 win2d 對 dpi 處理的更多詳情,可以參閱另一篇文章。
dpi 無關尺寸有時也稱作「邏輯尺寸」。而 dpi 相關尺寸,也就是以畫素為單位的尺寸,也稱作「物理尺寸」。
乙個控制項在載入時其解析度和縮放的預設行為是:
控制項將其繪製資源(canvascontrol
控制項的canvasimagesource
,canvasvirtualcontrol
控制項的canvasvirtualimagesource
和canvasanimatedcontrol
控制項的canvasswapchain
)的尺寸和 dpi 設定為與自身匹配。
大部分 win2d 操作都是以 dips (dpi 無關的單位)為基礎進行的,並且 win2d xaml 控制項的繪圖資源會自動依據 dpi 進行縮放。這意味著通常應用可以忽略 dpi。除非額外指定,尺寸和座標總是 dpi 無關的。乙個應用可以為繪製到控制項的內容硬編碼多種不同的尺寸和座標,當應用執行在不同 dpi 的環境下時,內容就會隨之進行縮放。
但對某些應用而言,這種預設的行為並不足夠。本文概括了幾種預設行為不足以應對的場景,並講解了應用能如何對其進行修正。
場景:控制項內容的解析度必須固定且小於正常值
當乙個 2d 精靈(sprite) 遊戲需要無視顯示硬體的實際解析度二總是以固定的 640x480 解析度進行渲染時,要求的正是這種場景。
要解決這一需求完全無需額外編寫任何 win2d **。
僅需確保你的canvascontrol
、canvasvirtualcontrol
或canvasanimatedcontrol
控制項被設定為乙個viewbox
控制項的子元素,尺寸受其限制。
例如,要無視 dpi 而強制把控制項的寬設為 320 畫素,高設為 224 畫素,則將
<canvas:canvasanimatedcontrol
/>
修改為
<viewbox
>
<
canvas:canvasanimatedcontrol
width
="320"
height
="224"
/>
viewbox
>
如果你不希望應用通過使用信箱模式/郵筒模式保持內容比例,則需要新增stretch
屬性:
<viewbox
stretch
="fill"
>
<
canvas:canvasanimatedcontrol
width
="320"
height
="224"
/>
viewbox
>
注意使用 viewbox 對控制項進行縮放時其插值模式並不能保證縮放效果。其過濾方法可能看起來就像於canvasinterpolationmode.linear
或其它類似方法。如果你的乙個用需要某種特定的插值模式,那麼就不要使用 viewbox 固定控制項尺寸,而應當將內容繪製到乙個固定尺寸的canvasrendertarget
作為中轉,再以希望的插值模式縮放繪製到目標。
場景:應用在高解析度環境下渲染失常
某些顯示裝置擁有極高的解析度,但其 gpu (圖形處理單元)的效能並不足以流暢處理大量畫素的動畫。若不經測試,開發者很難知道應用在此類高解析度裝置上表現如何。一種解決方案是利用控制項的dpiscale
屬性減小控制項的 dpi。
例如,使用以下**將控制項的解析度減半:
<canvas:canvasanimatedcontrol
dpiscale
="0.5f"
/>
實際使用中,dpi 縮放因數取決於你應用的具體需求。一種做法是固定縮放因數,確保應用的 dpi 總是 96而非更高。
例如:
float dpilimit = 96.0f;if(control.dpi >dpilimit)
這種做法通過利用在高 dpi 環境下不易察覺解析度縮小的情況換取了部分效能上的提公升。
類似於上文提到的 viewbox,縮小控制項解析度這一方法的插值模式也不能保證控制項的縮放效果。如果你的應用需要某種特定的插值模式,還是需要轉而使用乙個繪圖中介軟體。
Win2D 官方文章系列翻譯 畫素格式
directxpixelformat 列舉 包含了 direct3d 和 dxgi 所使用全部各種畫素格式,但其中只有部分被 win2d 所支援 或被 win2d 構建的基礎 direct2d 所支援 如果不確定該採用哪種格式,預設選擇b8g8r8a8uintnormalized作為畫素格式以及pr...
Win2D 官方文章系列翻譯 幕後繪製
應用有時需要將圖形繪製到並不立即顯示的目標上。此類繪製動作被稱作 幕後繪製 或 繪製到紋理 當應用需要將繪製操作輸出儲存到乙個檔案 返回為乙個畫素陣列或留作後續操作的輸入源時,常需要進行這種幕後繪製。通過使用 win2d 中的 canvasrendertarget 可以輕鬆實現以上場景。canvas...
Win2D 官方文章系列翻譯 預乘 Alpha
在計算機繪圖中有兩種表示顏色值不透明度的方法。win2d 中兩種方法均有所採用。本文旨在解釋兩種方法之間的區別以及其各自的使用場景。直接 alpha straight alpha 當使用直接,亦即線性 alpha 時 在該方法中,rgb 和 alpha 通道各自獨立發揮作用。它們可以在不互相影響的情...