各個(gè)框架的特點(diǎn)
@姚冬 先生已經(jīng)說的非常清楚了。我補(bǔ)充一點(diǎn)自己的體會(huì),也供大家參考。
08
年的時(shí)候,我剛聽說微軟出了 WPF,非常興奮。那時(shí)候的我寫的最多的是 WinForms 的應(yīng)用程序,但我對(duì) WinForms
程序有諸多不滿,主要原因是 WinForms 的設(shè)計(jì)僅僅是對(duì)系統(tǒng)的 Win32 API 做了一層薄薄的封裝,UI
設(shè)計(jì)方面束縛依然比較大——老老實(shí)實(shí)套用內(nèi)置控件倒還好,一旦要做些許“創(chuàng)新”,開發(fā)復(fù)雜度就陡然增大。
于是當(dāng)年我就趕緊買下了 Charles Petzold 老爺子寫的《Windows Presentation Foundation 程序設(shè)計(jì)指南》,如獲至寶的學(xué)起來。這期間逐漸感受到 WPF 的強(qiáng)大,靈活,并憧憬著用它開發(fā)出更加酷炫的應(yīng)用程序。
然
而現(xiàn)實(shí)是殘酷的,一個(gè)棘手的問題是 WPF
性能比預(yù)期差很多。當(dāng)你為一個(gè)控件添加下拉陰影特效(DropShadowEffect)后,再讓其參與到動(dòng)畫事件中,性能會(huì)急劇下降。起先我以為是我使
用方法不正確,但最終發(fā)現(xiàn)這是一個(gè)普遍問題。歸根結(jié)底,DropShadowEffect 在當(dāng)時(shí)是用 CPU
完成計(jì)算的,當(dāng)存在動(dòng)畫時(shí),為了保證渲染正確,需要逐幀重新計(jì)算,導(dǎo)致 CPU 占用率暴漲,性能自然受到拖累。
盡管我們可以嘗試一些
“優(yōu)化”手段,例如預(yù)先計(jì)算出一次 DropShadowEffect
后將其緩存,后續(xù)僅以位圖方式重繪,這一方案自然能快很多,卻也存在這樣或那樣的弊端,例如需要考慮緩存結(jié)果是否能與背景正確匹配的問題。另一種辦法,我
們還可以在純色背景上預(yù)先計(jì)算出 DropShadowEffect
后,再將半透明化,這樣既能保證性能,又能保證與背景正確匹配。但還是略有瑕疵??傊椒m多,但需要具體情況具體設(shè)計(jì),非常不方便。說到底這個(gè)問題還是
應(yīng)當(dāng)由微軟解決,而不是推給框架的使用者。
作為 UI 框架新貴,WPF 存在些許缺陷不足為奇。但有趣的是,下拉陰影導(dǎo)致性能下降的問題在同期的瀏覽器(如 Firefox)中卻并不存在,你可以為任何元素添加下拉陰影,然后讓它們動(dòng)起來,瀏覽器依然順暢如初。
這一個(gè)細(xì)節(jié)讓當(dāng)年輕視 Web 開發(fā)的我逐漸的意識(shí)到,瀏覽器作為一個(gè)渲染引擎,其性能經(jīng)過了精心的優(yōu)化,是一個(gè)優(yōu)秀的 UI 容器。受
此啟發(fā),在近兩三年里,我便很少再用 WPF 開發(fā)了。后續(xù)的項(xiàng)目都采用基于內(nèi)嵌瀏覽器內(nèi)核(例如XULRunner、CEF)的方式。這樣一來 UI
都用 Web 來做,就擁有極大的靈活性,例如可以使用 ExtJS、Bootstrap、Semantic UI 框架等等,而應(yīng)用程序的能力則依然是
Native 的,可以完成任何之前的程序所能做到的事(調(diào)用 Win32 API?很容易)
我們交付的許多項(xiàng)目都是這樣實(shí)現(xiàn)的。開發(fā)成本大大下降,而且跨平臺(tái)也不再是問題。關(guān)鍵是可以享受到 Web 開發(fā)后續(xù)發(fā)展的所有紅利,例如模板引擎,響應(yīng)式界面,React UI 等等。
近
來,node.js 的出現(xiàn)也再一次降低了這方面的開發(fā)成本,特別是 node-webkit (近來改名為 nw.js),electron
之類的程序,更是將這方面的開發(fā)門檻急劇降低——之前你如果不熟悉底層開發(fā),你可能就不知道應(yīng)當(dāng)如何將 CEF
之類的控件嵌入到你的程序界面里,另外還需要解決 Web 界面與底層庫的通信問題。但是使用 node-webkit(或 electron)
根本無需考慮這方面的問題。對(duì)于需要調(diào)用底層 API 的時(shí)候,直接給 node.js 增加 C++ Addon,在界面里就可以通過
JavaScript 調(diào)用。非常方便快捷。而且還有大量的 package 可用。不能更強(qiáng)了。
但是底層開發(fā)人員在向 Web
技術(shù)拓展的時(shí)候,常常遇到的最大的問題是在于固有思維定勢(shì)帶來的偏見。其中最常見的問題就是,覺得 Web 很糟糕,沒有 Control
的概念,缺乏封裝。因此用起來總覺得不好用。起初我也是這樣認(rèn)為的,但后來我發(fā)現(xiàn)并非如此。這其實(shí)是一個(gè)設(shè)計(jì)理念的差異。慢慢會(huì)發(fā)現(xiàn)各有利弊。Web
基于 Document 的設(shè)計(jì)也有頗多精彩之處。
總而言之,我總希望大家在傳統(tǒng) Native 框架的基礎(chǔ)上,多試試基于 Web 的方案。你一定會(huì)因此變得更加強(qiáng)大,并找到更多樂趣的。
(關(guān)于 WPF 現(xiàn)在我了解的已經(jīng)很少了,如果有錯(cuò)誤,還請(qǐng)諒解)