目錄
NET Framework 4.6.2的最大亮點
為什么固守462不升級
WPF-開發體驗的巔峰
為什么對WPF動搖了
基于Islands+UWP的濾鏡嘗試
總結
NET Framework 4.6.2的最大亮點
安全性能大提升:
默認啟用TLS1.2協議,更安全,它為后續的版本提供了重要的安全支撐,是微軟在網絡安全方面的重要里程碑
一般現代的瀏覽器和服務器都優先使用TLS1.2,這也是嵌入webview2的重要基礎。
兼容性增強 :
更好的windows10支持(非常重要,對更好地使用win10的UI特性提供了可能)
為什么固守462不升級
多年的Windows窗口程序的開發經驗,使用的 .NET Framework版本 ,從2.0,到3.5,到4.0,到4.5.1,到4.6.2 ,雖然微軟一直在提倡 6.0,8.0,甚至9.0,現在已經推出了 10.0,它們擁有更好的特性和性能,但是我個人使用最多的其實是4.0~4.6,在大量的企業項目的實踐中,4.0表現出了絕對的兼容性和穩定性的優勢,尤其是在兼容性上。因為每次進行微小的框架升級后,都可能在某個特別的場景中遇到靈異事件,這種埋雷很讓人頭疼,所以在較長的周期來看,從依賴的硬件接口、對各類sdk的兼容、用戶的安裝環境 等各方面考慮,徘徊在新舊的框架之間,既想使用新的特性,又擔心穩定性和兼容性受到影響。綜合考慮,當前主要在使用4.6.2。
WPF-開發體驗的巔峰
接觸Winform/Asp.net/WPF/UWP/Winui3/HTML開發,在這些體驗中,WPF絕對是開發體驗最優,且難以被超越的一種前端框架,WPF可用的免費UI庫也非常豐富:
Modern UI 框架:
HelixToolkit.Wpf 框架:
XamlFlair 框架:
XAML可讀性極強,數據雙向綁定,豐富的矢量圖形支持、多種多樣的動畫系統、完全自定義的UI外觀(真的太自由了)、任意的ui元素(包括視頻)對外部著色器的支持也僅僅是簡單的幾句代碼就搞定、任意的UI元素可以以任意的路徑裁切展示(UWP和WinUI3實現相同功能極其復雜,甚至很難支持)且方式簡單、各種路徑形式的透明過渡使用起來也極其輕松(比如透明羽化,OpacityMask輕松解決,但是UWP甚至無法直接支持)、透明窗口的使用方式和兼容性也極強(幾乎沒看到過在哪里黑窗口的情況,但是WINUI3要繞一大圈才能實現,而且對不同的Windows系統版本的兼容性也不同),因此,當習慣了WPF開發以后, 再去適應其他的UI框架, 會感覺到處是坑。
為什么對WPF動搖了
這里提到的“動搖”是有條件的:如果對于偏功能性的企業級的應用,WPF 絕對是極佳的選擇, 但是當應用偏向于交互和展示的時候,希望給用戶以更好的UI操作體驗的時候,WPF的動畫幀率就嚴重的不能滿足視覺需求了.
?WPF 動畫效果:
UWP + CompositionApi 動畫效果:
(上面2個演示,為了極致的表現出2個動畫的差異,我使用了佳能相機對電腦屏幕以?60FPS 錄制了視頻, 視頻原文件在文末的附件中)
從上面的示例可以看到, 假設讓一張全屏的圖片 從右側 切入到主屏來顯示, WPF會有一種大步邁進的、咯噔咯噔的感覺(我覺得很像是汽車在過減速帶的感覺),這種感覺顯得很吃力、不優雅,無法表達出 “輕松拿捏的高級感”,這個時候,就會動搖:選擇WPF是否是一個正確的選擇呢? 可是如果升級更高的框架來適應其他的UI框架的話,有可能在硬件的對接、系統的兼容性上,在實施部署階段遇到問題的可能性極大,在這種條件下,采取了方案:保留了基于.NET Framework 4.6.2的業務處理, 以及部分功能性的管理頁面,而對于側重用戶交互的流程部分, 通過Islands嵌入的方式來使用 UWP的功能,類似于WindowsFormsHost嵌入Winform控件,這里通過XamlHost 嵌入UWP控件,通過這種方式 在進行 比較大量的圖片列表滾動的時候,視覺效果差異極大。
UWP在使用的時候幾乎不用去擔心內存管理,使用很隨心,并且極流暢,WPF 在進行對象管理的時候, 尤其是大量對象、大量圖片的管理上,極容易讓內存持續飆高,這對于即使有經驗的開發者來說,進行有效的管理也是一件不容易的事(這種場景下,我驗證多種方式來看,最輕松有效的方式是使用弱對象管理 WeakRefrense,根據使用效果看,目前基本沒有遇到弊端)。
基于Islands+UWP的濾鏡嘗試
WPF實現濾鏡是相當簡單的一件事,并且對任意UI元素有效,包括視頻:
但是當前Islands+UWP這種嵌入方式, 其實對UWP本身的功能進行了很多限制,而且UWP本身就是基于 沙盒機制,雖然很安全,但是很多效果無法使用,因此,當我們要實現一個多種多樣的濾鏡功能的時候,與WPF比起來, 是相當困難的一件事。
其實在采取 WPF+Islands+UWP 這個方案之前我嘗試過:
嘗試 1:.net6.0 +wpf+嵌入winui3 = >但是wpf本身基于directx9, 但是winui3基于directx11,12 , 它們可能有渲染上有資源競爭或沖突,導致嵌入后總是莫名其妙地突然崩潰退出;
嘗試 2:.net6.0 +winform+嵌入winui3 = >可行。Winform本身是gdi+的渲染機制, 與winui3的directx11,12不沖突 ,可以成功嵌入,但是沒有深入研究這種嵌入狀態的其他組件的健壯性, 該組合屬于不上不下的狀態。
嘗試 3:.net8.0+純winui3=>可行,而且配合ai很輕松地寫出了幾十種濾鏡,但是在 這種組合下,我去嘗試使用 透明窗口和 元素的異形裁切的時候,遇到了很多坑,遠沒有想象的順利。所以雖然這種方案具有極好的性能,但是它表現出來的問題,以及它復雜的使用方式,讓我對遷移到跨度這么大的框架,并沒有信心和把握。
嘗試 4:.net 4.6.2+webview2=>這與當前的框架選擇差異是比較大的, 它是偏web化的一種實現方式, Web具有非常好的開發生態, 而且這種組合表現出了良好的渲染性能 ;但是我在實際驗證的時候也遇到了一些問題,比如在對接工業相機的時候,對于實時幀的顯示,性能是極差的, 而且這個遷移的差異太大,工作量極大。但是它極強的 渲染能力和極佳的開發生態,對我有非常大的吸引力,我后續可能會考慮。
以上的 4 種嘗試,都讓我對框架的升級沒有信心,它們目前的穩定性或成熟度,也對我沒有足夠的吸引力,因此暫時先保留了當前的4.6.2+ Islands+UWP的使用方式。
UWP 的這種 Islands 嵌入的方式使我對著色器的使用并不能特別的自由,因此只能使用純cpu的 濾鏡算法,但是這不適合實時視頻幀的應用 :
上圖是我在另一篇文章中實現的濾鏡效果:
https://blog.csdn.net/LateFrames/article/details/150536630?spm=1001.2014.3001.5501
總結
如果想要安全的、具有極豐富的可擴展性、并且高效率的開發,那么 WPF 無疑是絕對的最佳的選擇 ;如果在舊項目 需要進行遷移, 但是考慮到綜合硬件原因, 不能對框架升級太多的時候,但是又對 UI?的體驗有進一步的要求, 這時候可以考慮嵌入?Islands 方式來使用 UWP 組件, 它就像在 WPF 中嵌入了一個 WinForm 組件? WindowsFormsHost?的感覺 ,但是這種方式的局限性也非常大, 很難使用著色器, 開發體驗也比較差, 這種嵌入的方式無法可視化編輯,這一點在效率上來說很低,?但是 UWP+CompositionApi 的動畫流暢性太棒了,這是 WPF 如何都無法達到的流暢幀率 。
WPF動畫與UWP動畫比對的相機錄制視頻的原文件,可以更清晰地看到視覺效果的差異,附件:
WPF:https://download.csdn.net/download/LateFrames/91949307
UWP:https://download.csdn.net/download/LateFrames/91949310