新聞中心
目前編寫一款簡單的手機應用APP一般用什么編程語言?
編寫手機App,用什么語言?
創(chuàng)新互聯(lián)建站主要從事成都網站建設、網站制作、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務東興,10余年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792
從簡單到復雜,可以分三級:
簡單方案:HTML5
其實就是把網頁封裝成App。編程語言就是網頁三件套:HTML+CSS+Javascript
有多種工具和框架,如Cordova, uni等等。
這種方式實現(xiàn)“App”最容易,且跨平臺,對于iOS和Android做一套就行了。代價是功能弱,性能低,換句話說就是“卡”。
中等方案:原生跨平臺框架
這類方案在iOS和Android之上自行實現(xiàn)一套原生框架。通用的Flutter, ReactNative都是流行的原生跨平臺框架。適用于 游戲 的Cocos2D,Corona SDK也可以算在這一級里。
這類方案實現(xiàn)App難度中等,因為跨平臺,一次開發(fā),iOS和Android都能運行。功能和性能也是中等,比不上原生App,但比HTML5的又好很多。
復雜方案:原生開發(fā)
直接在iOS和Android上各自開發(fā)一套原生App。
iOS可以使用Objective C或Swift。
Android可以使用Java或Kotlin。
還是來一個圖表吧,雖然簡單,卻很明了:
推薦用Flutter,簡單。
以前自己用android原生寫過7天酒店簽到程序,不過當時的安卓還是比較難寫的,不像現(xiàn)在越來越容易上手。
Flutter
Flutter是一個由谷歌開發(fā)的開源移動應用軟件開發(fā)工具包,用于為Android、iOS、 Windows、Mac、Linux、Google Fuchsia開發(fā)應用。
Flutter應用是使用Dart語言編寫的,雖然是新的一種語言,但是難度不算大,上網搜下相關教程學習下,應該就能很快上手。
Flutter效果
這里是我上個月仿照教程弄的一個簡單APP,效果圖如下:
點擊"Next"就切換下一張,點擊"Pre"就切換前一張,點擊“Reset”就全部滑落下來。
我女兒最喜歡中間的Reset效果,哈哈。
希望這個答案能幫到你。
現(xiàn)在Flutter正式版已經出來了,原生性能,安卓iOS多平臺支持,谷歌大廠背書,大家可以比較放心的學習。編程語言用的是Dart,可以看做是加了語法糖版本的Java,學習起來也比較容易,如果想做手機app,可以考慮使用它。
如果只是自己做著玩的話推薦用H5開發(fā),開發(fā)工具HBuilder或者HBuilderX。
先科普下什么是IOS和Android吧。
IOS只是操作系統(tǒng)而已,是蘋果的操作系統(tǒng)。
開發(fā)IOS上運行的APP的話,現(xiàn)在流行的語言是Object-C和Swift。
Android也是操作系統(tǒng),是谷歌基于Linux內核開發(fā)出來的手機操作系統(tǒng)。
開發(fā)Android上運行的APP的話,現(xiàn)在流行的語言我覺得仍然還是JAVA。
如果想要真的做一款APP的話,不僅僅會一門語言就夠了,涉及的東西比較多,如下是我給你的學習推薦路線。
學習路線:
1:先學習js,然后學習下html 、css。
學習這些可以上菜鳥教程或者W3School網站學習。
開發(fā)工具使用vscode或者Notepad++都可以的。
2:了解Mui常用組件(官網:),
熟悉常用API(官網:)。
3:服務端的開發(fā),要么用java開發(fā),要么用.net webapi開發(fā),推薦理由,java目前是主流,.net webapi簡單容易。
java 開發(fā)工具IntelliJ IDEA,.net 開發(fā)工具 vs。
4:數(shù)據(jù)存儲使用mysql。
補充說明:如果是想做專業(yè)開發(fā)APP的話還是建議用java開發(fā)客戶端,ios APP則用swift開發(fā)。
當然現(xiàn)在為了一套代碼多個平臺,使用H5開發(fā)專業(yè)APP的也有。
會了就可以正式擼代碼實現(xiàn)自己簡單的APP了。
回答完畢,謝謝。我是只說代碼的大餅。
那當然首選是h5套殼了。關于語言方面,我建議還是用PHP吧。隨著進一步學習,可以學習uinapp一鍵多端。H5、小程序、App、小程序支持多個平臺上架、微信抖音支付寶百度,希望可以幫助你
目前有三種app開發(fā)方式:原生app、混合app、webapp。
原生app:安卓需要java語言,ios需要 objec t-c,wp需要的.net語言。這種app用戶體驗最好,性能也是最好的,開發(fā)成本高,開發(fā)周期長,一款app需要開發(fā)多個語言版本;
混合app:需要h5,javascript,了解每個混合框架,比如appcan、hbulider、phonegap等等,以及封裝的中間件。這種開發(fā)方式的用戶體驗、性能沒有原生的好,但是他的開發(fā)周期短,開發(fā)成本低,對開發(fā)人員技能掌握比較高,開發(fā)一套程序可以兼容到多個設備上;
webapp:需要h5、javascript語言,不能調用底層設備,用戶體驗效果次之,開發(fā)簡單,開發(fā)成本低,開發(fā)周期短,可以兼容多個設備。
綜上所述三種開發(fā)各有優(yōu)缺點,要根據(jù)具體的項目需求來選擇適合自己的開發(fā)語言和開發(fā)場景。
uniapp了解下,多端應用。app的話要考慮安卓和蘋果,但學了二種學習成本比較高。用uniapp就解決了。
現(xiàn)在中小型企業(yè)都在逐漸采用跨平臺開發(fā)的模式 效率高 成本低 作為個人更是開發(fā)不二的選擇 你問的iOS和安卓是原生開發(fā) 需要不同的開發(fā)語言和框架 學習成本也很高 既然你說你是小白 如果采用原生開發(fā) 可能得大概花一年半載才能開始上手
采用跨平臺開發(fā) 只需要學習一下html css JavaScript 然后選擇跨平臺開發(fā)框架 比如react flutter uniapp 都可以 跨平臺就是指你這一套代碼編寫的app可以到不同平臺運行 比如iOS安卓都OK 但其實很多還可以編譯到各類小程序平臺運行 所以很方便
我這里推薦uniapp 一個基于vue的跨端開發(fā)框架 我自己也用這個開發(fā)了很多項目 確實很快 也提供了原生渲染能力 不做 游戲 等軟件 基本沒啥問題 社區(qū)插件市場也很熱鬧 基本有問題可以很快解決 希望可以幫到你。
按照開發(fā)方式可分為原生開發(fā)、混合開發(fā)、webapp開發(fā),不同的開發(fā)方式學習的編程語言不一樣,下面我們來一個一個分析一下:
一、原生開發(fā)
原生開發(fā)的編程語言主要為針對IOS運行環(huán)境的為編程語言為Swift或Object c,安卓環(huán)境為Java或Kotlin,WP環(huán)境為NET。原生開發(fā)的運行效率最高,用戶體驗最好,但是需要學習不同平臺的編程語言,學習門檻較高。
二、混合開發(fā)(偽原生開發(fā))
混合開發(fā)技術主要采用一套特別的渲染引擎來渲染UI界面和交互,按照渲染引擎可分為html與dart,其編程語言主要是Javascript或Typescript、Dart。
目前基于html渲染的開發(fā)框架有react native、weex、uniapp,基于dart的開發(fā)框架只有flutter。
混合開發(fā)由于調用了原生的控件來渲染UI,所以加載和體驗與原生差不多,學習成本比較低,只要會js,選擇一個框架開發(fā)就行了,或者學習dart語言,進行flutter開發(fā)。
三、webapp開發(fā)
webapp開發(fā)主要利用原生環(huán)境中的瀏覽器控件來裝載服務器上的html頁面,實際這個app就是一個自定義的瀏覽器app,所以只要會html,就會開發(fā)webapp,由于app內部加載的是遠程的網頁,所以加載速度和體驗最差。
以上是我個人的總結,有不對的歡迎指出,謝謝。
本人用c#,除了單片機用c,cad CATIA,多媒體主要Adobe,它干完所有,不需要性能的視圖混合dom代碼。
跨平臺桌面開發(fā),Electron還是WebView2 (中篇)
這一周繼續(xù)聊跨平臺桌面開發(fā)這個事情。
在這篇文章中,我暫時會放下Electron與WebView2的一個對比,而聊一聊跨平臺這個對于程序員群體來說不陌生的詞。
一個趨勢是:跨平臺開發(fā)幾乎是在各個技術方向都會持續(xù)發(fā)展的
跨平臺這個詞,對于程序員來說,應該是不陌生的。因為這個概念不只在某一端存在,后端,前端,移動端,桌面端幾乎所有方向都對跨平臺有需求。
在后端,Java是跨平臺的,當你用Java來編寫后端服務時,并不需要考慮操作系統(tǒng),因為它幾乎支持主流的操作系統(tǒng)?,F(xiàn)在,編寫一個后端服務,選用Java仍是主流。雖然可能它的跨平臺特性已經不是程序員最在意的點了。
而在移動端,類似React Native,F(xiàn)lutter也是非常有名的跨平臺移動開發(fā),它們與移動原生開發(fā)方式之間一直是競爭與共存。
而前端因為依托于瀏覽器,天然就是跨平臺的。事實上,很多應用或服務早期紛紛選擇從原生應用遷移至前端WEB方式的一個非常重要的原因就在于它是跨平臺的。
桌面操作系統(tǒng)很長一段時間一直是Windows一家獨大,所以桌面開發(fā)一直是Windows獨占,直至現(xiàn)在為止,很多專業(yè)級的軟件仍然是Windows獨占的。
而Linux桌面操作系統(tǒng)與MacOS桌面操作系統(tǒng),早些年幾乎可以忽略不計,壓根不需要考慮這兩種系統(tǒng)。但隨著近些年它們的慢慢流行,特別是蘋果的MacOS的以其杰出的工藝,流暢的體驗,疊加蘋果手機的流行,其市場份額增長非常之快,在特定的諸如編程,設計等行業(yè)人群中使用范圍較廣,這使得開發(fā)支持MacOS系統(tǒng)這個點變得越來越重要。
所以,在桌面開發(fā)領域,跨平臺的需求也越來越高。
這也是Electron及早期的NW.js能迅速發(fā)展起來并得到非常廣應用的原因所在。
無論是哪一端,跨平臺技術之所以頻繁出現(xiàn)與不斷發(fā)展,其根本原因就在于編程的一個重要痛點在于:
為了讓同一個服務能在所有設備上運行,程序員不得不編寫與維護非常多不同版本的程序
每一個程序或軟件后面的服務,都有一個非常迫切的需求,就是期望它的用戶無論何時,無論何地,無論使用任何設備,都能方便友好的使用這個服務。
也是因為這個原因,Web發(fā)展起來了,因為Web的優(yōu)勢就在這,只要你的設備上有瀏覽器,就能訪問。
但Web畢竟性能有限,且瀏覽器這種形式并不利于用戶忠誠度的培養(yǎng),它存在天然的弱點。一些簡單的操作服務使用Web并無問題,但稍微有點要求的,Web可能就并不是非常適合。
所以,一種趨勢不可避免地流行起來:
對不同設備或系統(tǒng)進行抽象,基于某一種特定的編程語言,編寫出能與原生程序相媲美的,又能跨平臺的技術便層出不窮了
對吧,Java是使用JVM來抽象不同的操作系統(tǒng),React Native則是使用虛擬DOM以及轉換成原生控件的方式來實現(xiàn)跨平臺,而Electron則是通過性能較好的Chrome內核+NodeJS原生調用能力的搭配來實現(xiàn)跨平臺桌面開發(fā)。
總而言之,這種跨平臺的技術不會消亡,只會有新的技術層出不窮,而它們與原生開發(fā)一定是相互競爭,配合與共存的。相互之間無法取代。
那再回到跨平臺技術上來說,一個良好的跨平臺開發(fā)的技術或框架,重點是什么。
或者換種方式說,哪些特性使得它更易于流行起來?
我個人認為有以下的幾個點:
跨平臺開發(fā)技術能不能流行起來的一個非常重要的點就在于,使用了什么樣的編程語言。
以移動端跨平臺開發(fā)技術來說明,一個React Native,一個Flutter,這兩個是比較知名主流的跨平臺移動開發(fā)技術。React Native使用的是前端React技術,而Flutter則是Google的D語言。
顯而易見的是,雖然Flutter是使用skia引擎在底層重繪一套UI,其性能相比React Native這種模式更佳,但React Native更易于被接受。
在流行度上,React Native始終比Flutter更流行,一個最重要的原因也在于:
使用已熟知的前端編程語言,比起重新學習一個D語言更易于被接受,維護成本更可控。
這個問題在跨平臺桌面開發(fā)中也是類似,跨平臺桌面開發(fā)技術也不是Electron最開始出現(xiàn),比如著名的QT很早就有了,但比起Electron這種使用前端編程技術來說,顯然在編程語言的門檻上和程序員群體上都存在困難,這也是Electron能后來居上的原因所在。
因為,大多數(shù)程序員群體,相比較另外學習一門什么語言去做什么,使用自己熟悉的語言來做什么是更容易,意愿也更高。
而從公司或團隊的考量上看,選擇偏門的小眾語言存在成本上的顧慮,比如人員招聘是否容易?
跨平臺技術在嘗試解決不同平臺不一致,它或多或少會損耗性能。這也決定了幾乎沒有任何一個跨平臺技術能取代原生開發(fā)。
這是一個取舍的問題,對于一個程序來說,究竟性能有多重要。對于比較看重性能的程序來說,原生開發(fā)可能是最優(yōu)選擇。
但跨平臺的性能損耗也有高低之分,并不在同一水平線上。
其實,無論是Electron,或是WebView2,都是基于瀏覽器內核+前端技術的跨平臺桌面解決方案,這也是為什么要把它們放在一起聊的原因。
Electron是先行者(當然,嚴格說來,NW.js出現(xiàn)的更早,但今天它的流行度已遠遠落后于Electron了),而WebView2則是后來者。
那做為后來者的WebView2究竟做了哪些改進?它又有多大的能力來挑戰(zhàn)Electron呢?
下一篇,繼續(xù)聊。
跨平臺技術;H5和Flutter誰是未來?
前言
為什么跨平臺是發(fā)展趨勢?
同一個應用,各個“端”獨立開發(fā),不僅開發(fā)周期長,而且人員成本高。同時,作為技術人員,也不應該滿足于這種重復、低能的工作狀態(tài)。在這樣的形勢下,跨平臺的技術方案也受到越來越多人和企業(yè)的關注。
本篇文章我將從原理、優(yōu)缺點等方面為大家分享跨平臺技術
一. H5
說到跨平臺,沒人不知道H5。不管是在Mac、Windows、Linux、iOS、Android還是其他平臺,只要給一個瀏覽器,連“月球”上它都能跑。
1.瀏覽器架構
下面,我們來看看讓H5如此橫行霸道的瀏覽器的架構:
瀏覽器由以上7個部分組成,而“渲染引擎”是性能優(yōu)化的重中之重,一起了解其中的渲染原理。
2.渲染引擎原理
不同的瀏覽器內核不同,渲染過程會不太一樣,但主要流程還是一致的。
分為下面6步驟:
從以上6步,我們可以總結渲染優(yōu)化的要點:
以上就是瀏覽器端的內容。但H5作為跨平臺技術的載體,是如何與不同平臺的App進行交互的呢?這時候JSBridge就該出場了。
3.JSBridge原理
JSBridge,顧名思義,是JS和Native之間的橋梁,用來進行JS和Native之間的通信。
通信分為以下兩個維度:
那么App內加載H5的過程是什么樣的呢?
4.App打開H5過程
打開H5分為4個階段:
這四步,對應的過程如上圖所以,我們可以針對性的做性能優(yōu)化。
5.優(yōu)缺點分析
下面,我們進行H5的優(yōu)缺點分析:
優(yōu)點
缺點
雖然H5目前還存在不足,但隨著PWA、WebAssembly等技術的進步,相信H5在未來能夠得到越來也好的發(fā)展。
二.小程序
2018年是微信小程序飛速發(fā)展的一年,19年,各大廠商快速跟進,已經有了很大的影響力。下面,我們以微信小程序為例,分析小程序的技術架構。
小程序跟H5一樣,也是基于Webview實現(xiàn)。但它包含View視圖層、App Service邏輯層兩部分,分別獨立運行在各自的WebView線程中。
1.View
可以理解為h5的頁面,提供UI渲染。由WAWebview.js來提供底層的功能,具體如下:
每個窗口都有一個獨立的WebView進程,因此微信限制不能打開超過5個層級的頁面來保障用戶體驗。
2. App Service
提供邏輯處理、數(shù)據(jù)請求、接口調用。由WAService.js來提供底層的功能,具體如下:
運行環(huán)境:
僅有一個WebView進程
3.View App Service通信
視圖層和邏輯層通過系統(tǒng)層的JSBridage進行通信,邏輯層把數(shù)據(jù)變化通知到視圖層,觸發(fā)視圖層頁面更新,視圖層將觸發(fā)的事件通知到邏輯層進行業(yè)務處理。
4. 優(yōu)缺點分析
優(yōu)點
缺點
既然WebView性能不佳,那有沒有更好的方案呢?下面我們看看React Native。
三.React Native
RN的理念是在不同平臺上編寫基于React的代碼,實現(xiàn)Learn once, write anywhere。
Virtual DOM在內存中,可以通過不同的渲染引擎生成不同平臺下的UI,JS和Native之間通過Bridge通信
1.React Native 工作原理
在 React 框架中,JSX 源碼通過 React 框架最終渲染到了瀏覽器的真實 DOM 中,而在 React Native 框架中,JSX 源碼通過 React Native 框架編譯后,與Native原生的UI組件進行映射,用原生代替DOM元素來渲染,在UI渲染上非常接近Native App。
2.React Native 與Native平臺通信
3.優(yōu)缺點分析
優(yōu)點
缺點
4.RN展望
雖然RN還存在不足,但RN新版本已經做了如下改進,并且RN團隊也在積極準備大版本重構,能否成為開發(fā)者們所信賴的跨平臺方案,讓我們拭目以待。
既然React Native在渲染方面還擺脫不了原生,那有沒有一種方案是直接操控GPU,自制引擎渲染呢,我們終于迎來了Flutter!
四.Flutter
Flutter是Google開發(fā)的一套全新的跨平臺、開源UI框架,支持iOS、Android系統(tǒng)開發(fā),并且是未來新操作系統(tǒng)Fuchsia的默認開發(fā)套件。渲染引擎依靠跨平臺的Skia圖形庫來實現(xiàn),依賴系統(tǒng)的只有圖形繪制相關的接口,可以在最大程度上保證不同平臺、不同設備的體驗一致性,邏輯處理使用支持AOT的Dart語言,執(zhí)行效率也比JavaScript高得多。
1.Flutter架構原理
2.Dart優(yōu)勢
很多人會好奇,為什么Flutter要用Dart,而不是用JavaScript開發(fā),這里列下Dart的優(yōu)勢
3.優(yōu)缺點分析
優(yōu)點
缺點
web前端未來將會有什么樣的發(fā)展趨勢?
趨勢一:更加移動優(yōu)先
響應式設計顯然是目前Web前端開發(fā)領域的主要趨勢之一,并且這一趨勢在未來還將持續(xù)一段時間。雖然現(xiàn)在的響應式設計大部分還是以PC版優(yōu)先,然而如果有一天我們把PC版放到比移動版次要的位置上,也沒有什么好奇怪的。因為,目前許多Web前端開發(fā)者已經開始轉向以移動優(yōu)先方案來做他們的響應式設計和開發(fā),這就象征著一個重大轉變,值得我們跟進的。
趨勢二:更多使用快速原型開發(fā)工具
眾多Web前端開發(fā)者從2016年開始嘗試使用快速原型開發(fā)工具,而在2018年將是這種技術真正爆發(fā)的一年?!癠Xpin、Webflow、Invision以及其它許多快速原型開發(fā)工具,讓設計師不用寫一行代碼,就能為網站和服務快速創(chuàng)建低保真和高保真原型,便于設計師衡量它們的可用性和美觀性?!?Web設計師Jamie Leeson says如是說,“許多工具也允許你在瀏覽器中設計原型并從工具里真正啟動網站自身?!?/p>
不管未來前端發(fā)展方向如何,可以肯定的是未來前端人才需求依舊很大。想學前端開發(fā)專業(yè)的機構也很多,你可以去線下試聽課程了解一下,例如北大青鳥、南京中博軟件學院、南京課工場等等都有試聽課程的!
2022 年將成為主導的頂級編程語言
編程語言是程序員(開發(fā)人員)用來與計算機進行通信的計算機語言。它是用任何特定語言(C、C++、Java、Python)編寫的一組指令,用于執(zhí)行特定任務。編程語言主要用于開發(fā)桌面應用程序、網站和移動應用程序。以下是 2022 年最流行的頂級語言。
Python
Python 是由 Guido van Rossum 于 1980 年代后期在荷蘭構建的。Python 最初是作為 Java 在行業(yè)中的競爭對手而構建的,后來逐漸流行起來。目前,Python 在研究人員和開發(fā)人員社區(qū)中都非常受歡迎。Python 在 IEEE Spectrum 的語言排名中名列前茅,得分為滿分 100。此外,Python 也很受尊重,支持率高達 44.1%。
Python 幾乎適用于任何事物。Django 和 Flask 可用于 Web 開發(fā),而 Jupyter 和 Spyder 等科學工具則用于分析和研究目的。如果您喜歡自動化,Selenium 可以幫助您!該語言的靈活性使 Python 幾乎可以在任何地方使用。到目前為止,這些是 Python 中比較流行的產品。Python 的巨大支持基礎(僅次于 JavaScript)產生了大量使用該語言的包、框架,甚至是成熟的開源軟件。
總的來說,Python 可能對數(shù)據(jù)科學和機器學習有最大的支持。雖然還有其他語言(如 R 和 MATLAB)提供競爭,但 Python 是數(shù)據(jù)科學領域的嚴格統(tǒng)治者。機器學習中使用的大多數(shù)框架和庫都僅用 Python 編寫,如果想要學習機器學習(或一般的數(shù)據(jù)科學),它可能是最好的語言。
JavaScript
JavaScript 在這一點上幾乎是行業(yè)領導者。JavaScript 最初于 1994 年作為 Netscape Navigator(當時最好的瀏覽器之一)的腳本語言而構建,它迅速崛起。直到 2008 年,Google 才在為 Google Chrome 構建 V8 引擎時設計了現(xiàn)代 JavaScript。最初由 Netscape 構建為 Java 的競爭對手,JavaScript 現(xiàn)在在開發(fā)領域擁有自己的空間。JavaScript 因其流行而被廣泛認為是“互聯(lián)網語言”。JavaScript 在開發(fā)者社區(qū)中的支持率最高——高達 67.7%。一般來說,JavaScript 適用于任何類型的開發(fā)活動,如移動應用程序開發(fā)、Web 開發(fā)、桌面應用程序開發(fā)等。
JavaScript 有各種各樣的庫和框架,可以在開發(fā)過程中使用。有用于前端開發(fā)的 Angular、Vue 和 React,而 Node.js 是一種用于后端開發(fā)的非常靈活的語言。Jest 和 Mocha 是兩個靈活的工具,可幫助設置單元測試以檢查功能是否按預期工作。當然,如果您對其中任何一個都不太滿意,您可以在前端使用普通的 HTML、CSS 和 JavaScript——就這么簡單!由于來自世界各地開發(fā)人員的巨大支持,JavaScript 擁有任何語言都可以夸耀的最多數(shù)量的支持包。盡管如此,人們繼續(xù)構建越來越多的包,以增加使用該語言的便利性。
Java
Java 由 James Gosling、Mike Sheridan 和 Patrick Naughton 于 1991 年構建為“Oak”語言,是第一種在全球產生重大影響的語言。雖然新的編程語言使用與 C/C++ 相同的格式,但它融入了某些新思想,使其對更多人更具吸引力。Java 運行的原則是“一次編寫,隨處運行”——這意味著具有不同硬件和操作系統(tǒng)配置的系統(tǒng)可以輕松運行 Java 程序。
Java 也有各種各樣的庫和框架,它們在底層使用 Java。Java 用于通過 Spring 和 Hibernate 進行應用程序開發(fā)。JUnit 幫助我們?yōu)?Java 項目設置單元測試。最重要的是,Java 被用于開發(fā)原生 Android 應用程序(Android SDK 本身由 Java 開發(fā)工具包或 JDK 提供支持)。Java 可能是大多數(shù)人在大學或學校的計算機編程入門課程中被介紹的語言。Java 是用于向大眾教授面向對象編程的語言。
Java 在分析和研究領域也備受推崇。Java 唯一的問題是目前該語言的支持包和項目很少。很少有社區(qū)參與——這是大多數(shù)主流語言都有的。盡管如此,Java 是一種非常容易掌握和學習的語言——這在一定程度上解釋了該語言的吸引力。但是,要掌握某種形式的語言確實需要一些時間。
C++
也許人們在本文中可以期待的最令人震驚的答案之一是 C++。盡管是大多數(shù)人用來學習數(shù)據(jù)結構和算法概念的語言,但該語言本身在實際世界中卻很少使用。C++ 最初由 Bjarne Stroustrup 于 1982 年創(chuàng)建,作為 C 編程語言的擴展,在接下來的幾年中繼續(xù)聲名鵲起。
C++ 可用于分析、研究以及 游戲 內開發(fā)。流行的 游戲 開發(fā)引擎——虛幻引擎——使用 C++ 作為腳本語言,用于構建 游戲 時可以定義的所有功能。C++ 在軟件開發(fā)中也有廣泛的用途。介于面向對象方法和面向方法方法之間,C++ 可以靈活地使用它生成的軟件的性質。在 TIOBE 指數(shù)中排名第 4 意味著 C++ 至今仍具有吸引力。C++也廣泛用于系統(tǒng)軟件開發(fā),比其他語言更容易理解。在操作系統(tǒng)等敏感領域使用 C++ 的主要原因是 C++ 程序的編譯時間非常短。
C++ 可能擁有所有語言中最大的學習社區(qū)。大多數(shù)學生會開始他們的算法課程,用 C++ 構建樹、鏈表、堆棧、隊列和許多其他數(shù)據(jù)結構。當然,只要注意細節(jié),它就很容易上手和學習,也很容易掌握。
Typescript
TypeScript 是 JavaScript 的超集,具有與 JavaScript 幾乎相同的應用程序。TypeScript 可用于 Web 開發(fā)、移動應用程序開發(fā)、桌面應用程序開發(fā)等。在 StackOverflow 的最受歡迎語言列表中,TypeScript 是第二受歡迎的語言,受到 67.1% 的開發(fā)人員的喜愛(僅次于 Rust)。
TypeScript 主要是一種用于開發(fā)的語言,因此它對科學界沒有太大吸引力。但是,由于 TypeScript 的新功能,可以預期它可能會激發(fā)更大程度的研究興趣。該語言的技能上限比 JavaScript 低得多——并且 JavaScript 的許多“難以理解”的行為已在 TypeScript 中得到簡化。換句話說,您將頭撞到墻上的機會略小。
Golang
新語言正在迅速崛起,新的競爭者即將挑戰(zhàn) JavaScript 和 Python 擁有的寶座。由谷歌(兩者的名字中都有“Go”?。┲饕菫榱送七M函數(shù)式編程的事業(yè),Golang 在短時間內建立了大量的追隨者。Golang 已經成為 StackOverflow 第五大最適合學習的語言,受到 62.3% 的開發(fā)人員的喜愛。
Golang 用于多個領域,用于開發(fā)強大的軟件以及用于 Web 和移動應用程序的后端。目前,Golang 甚至支持一些基本的 Web 開發(fā)。雖然它仍處于取代 JavaScript 作為網絡語言的階段,但它正在迅速成為支持下一階段網絡的語言。
Golang 比此列表中的其他語言更難學習。此外,Golang 是一種開源語言,每次重大更新都會頻繁更改,因此保持更新是必要的。
Dart
Dart 是工業(yè)領域發(fā)展最快的語言之一。谷歌在語言領域的貢獻顯著增加,以與微軟的 TypeScript 日益流行的競爭相抗衡。Dart 因其簡單性而受到世界各地程序員的高度喜愛。
Dart 用于多平臺應用程序開發(fā)。與 JavaScript 一樣,Dart 用于構建任何人都可以使用電子設備運行的軟件。目前 Dart 最著名的用途是 Flutter 框架,F(xiàn)lutter 是一種用于移動應用程序開發(fā)的語言。最近的谷歌趨勢表明,F(xiàn)lutter 盡管是一個較新的框架,但比 React Native 更受歡迎,后者是業(yè)界已經建立的移動應用程序開發(fā)框架。
Dart 比 JavaScript 更容易學習,并且能夠很好地簡化甚至難以理解的案例。隨著市場上的 TypeScript 和 Dart 的出現(xiàn),程序員在選擇一種他們真正想要學習的語言時會面臨多種選擇。
Flutter浪潮下的音視頻研發(fā)探索
文/陳爐軍
整理/LiveVideoStack
大家好,我是阿里巴巴閑魚事業(yè)部的陳爐軍,本次分享的主題是Flutter浪潮下的音視頻研發(fā)探索,主要內容是針對閑魚APP在當下流行的跨平臺框架Flutter的大規(guī)模實踐,介紹其在音視頻領域碰到的一些困難以及解決方案。
分享內容主要分為四個方面,首先會對Flutter有一個簡單介紹以及選擇Flutter作為跨平臺框架的原因,其次會介紹Flutter中與音視頻關系非常大的外接紋理概念,以及對它做出的一些優(yōu)化。之后會對閑魚在音視頻實踐過程中碰到的一些Flutter問題提出了一些解決方案——TPM音視頻框架。最后是閑魚Flutter多媒體開源組件的介紹。
Flutter
Flutter是一個跨平臺框架,以往的做法是將音頻、視頻和網絡這些模塊都下沉到C++層或者ARM層,在其上封裝成一個音視頻的SDK,供UI層的PC、iOS和Android調用。
而Flutter做為一個UI層的跨平臺框架,顧名思義就是在UI層也實現(xiàn)了一個跨平臺開發(fā)。可以預想的是未Flutter發(fā)展的好的話,會逐漸變?yōu)橐粋€從底層到UI層的一個全鏈路的跨平臺開發(fā),技術人員分別負責SDK和UI層的開發(fā)。
在Flutter之前已經有很多跨平臺UI解決方案,那為什么選擇Flutter呢?
我們主要考慮性能和跨平臺的能力。
以往的跨平臺方案比如Weex,ReactNative,Cordova等等因為架構的原因無法滿足性能要求,尤其是在音視頻這種性能要求幾乎苛刻的場景。
而諸如Xamarin等,雖然性能可以和原生App一致,但是大部分邏輯還是需要分平臺實現(xiàn)。
我們可以看一下,為什么Flutter可以實現(xiàn)高性能:
原生的native組件渲染以IOS為例,蘋果的UIKit通過調用平臺自己的繪制框架QuaztCore來實現(xiàn)UI的繪制,圖形繪制也是調用底層的API,比如OpenGL、Metal等。
而Flutter也是和原生API邏輯一致,也是通過調用底層的繪制框架層SKIA實現(xiàn)UI層。這樣相當于Flutter他自己實現(xiàn)了一套UI框架,提供了一種性能超越原生API的跨平臺可能性。
但是我們說一個框架最終性能怎樣,其實取決于設計者和開發(fā)者。至于現(xiàn)在到底是一個什么狀況:
在閑魚的實踐中,我們發(fā)現(xiàn)在正常的開發(fā)沒有特意的去優(yōu)化UI代碼的情況下,在一些低端機上,F(xiàn)lutter界面的流暢性是比Native界面要好的。
雖然現(xiàn)在閑魚某些場景下會有卡頓閃退等情況,但是這是一個新事物發(fā)展過程中的必然問題,我們相信未來性能肯定不會成為限制Flutter發(fā)展的瓶頸的。
在閑魚實踐Flutter的過程中,混合棧和音視頻是其中比較難解決的兩個問題,混合棧是指一個APP在Flutter過程中不可能一口氣將所有業(yè)務全部重寫為Flutter,所以這是一個逐步迭代的過程,這期間原生native界面與Flutter界面共存的狀態(tài)就稱之為混合棧。閑魚在混合棧上也有一些比較好的輸出,例如FlutterBoost。
外接紋理
在講音視頻之前需要簡要介紹一下外接紋理的概念,我們將它稱之為是Flutter和Frame之間的橋梁。
Flutter渲染一幀屏幕數(shù)據(jù)首先要做的是,GPU發(fā)出的VC信號在Flutter的UI線程,通過AOT編譯的機器碼結合當前Dart Runtime,生成Layer Tree UI樹,Layer Tree上每一個葉子節(jié)點都代表了當前屏幕上所需要渲染的每一個元素,包含了這些元素渲染所需要的內容。將Layer Tree拋給GPU線程,在GPU線程內調用Skia去完成整個UI的渲染過程。Layer Tree中有PictureLayer和TextureLayer兩個比較重要的節(jié)點。PictureLayer主要負責屏幕圖片的渲染,F(xiàn)lutter內部實現(xiàn)了一套圖片解碼邏輯,在IO線程將圖片讀取或者從網絡上拉取之后,通過解碼能夠在IO線程上加載出紋理,交給GPU線程將圖片渲染到屏幕上。但是由于音視頻場景下系統(tǒng)API太過繁多,業(yè)務場景過于復雜。Flutter沒有一套邏輯去實現(xiàn)跨平臺的音視頻組件,所以說Flutter提出了一種讓第三方開發(fā)者來實現(xiàn)音視頻組件的方式,而這些音視頻組件的視頻渲染出口,就是TextureLayer。
在整個Layer Tree渲染的過程中,TextureLayer的數(shù)據(jù)紋理需要由外部第三方開發(fā)者來指定,可以把視頻數(shù)據(jù)和播放器數(shù)據(jù)送到TextureLayer里,由Flutter將這些數(shù)據(jù)渲染出來。
TextureLayer渲染過程:首先判斷Layer是否已經初始化,如果沒有就創(chuàng)建一個Texture,然后將Texture Attach到一個SufaceTexture上。
這個SufaceTexture是音視頻的native代碼可以獲取到的對象,通過這個對象創(chuàng)建的Suface,我們可以將視頻數(shù)據(jù)、攝像頭數(shù)據(jù)解碼放到Suface中,然后Flutter端通過監(jiān)聽SufaceTexture的數(shù)據(jù)更新就可以順利把剛才創(chuàng)建的數(shù)據(jù)更新到它的紋理中,然后再將紋理交給SKIA渲染到屏幕上。
然而我們如果需要用Flutter實現(xiàn)美顏,濾鏡,人臉貼圖等等功能,就需要將視頻數(shù)據(jù)讀取出來,更新到紋理中,再將GPU紋理經過美顏濾鏡處理后生成一個處理后的紋理。按Flutter提供的現(xiàn)有能力,必須先將紋理中的數(shù)據(jù)從GPU讀出到CPU中,生成Bitmap后再寫入Surface中,這樣在Flutter中才能順利的更新到視頻數(shù)據(jù),這樣做對系統(tǒng)性能的消耗很大。
通過對Flutter渲染過程分析,我們知道Flutter底層需要渲染的數(shù)據(jù)就是GPU紋理,而我們經過美顏濾鏡處理完成以后的結果也是GPU紋理,如果可以將它直接交給Flutter渲染,那就可以避免GPU-CPU-GPU這樣的無用循環(huán)。這樣的方法是可行的,但是需要一個條件,就是OpenGL上下文共享。
OpenGL
在說上下文之前,得提到一個和上線文息息相關的概念:線程。
Flutter引擎啟動后會啟動四個線程:
第一個線程是UI線程,這是Flutter自己定義的UI線程,主要負責GPU發(fā)出的VSync信號時候用當前Dart編譯的機器碼和當前運行環(huán)境創(chuàng)建出Layer Tree。
還有就是IO線程和GPU線程。和大部分OpenGL處理解決方案中一樣,F(xiàn)lutter也采取一個線程責資源加載,一部分負責資源渲染這種思路。
兩個線程之間紋理共享有兩種方式。一種是EGLImage(IOS是 CVOpenGLESTextureCache)。一種是OpenGL Share Context。Flutter通過Share Context來實現(xiàn)紋理共享,將IO線程的Context和GPU線程的Context進行Share,放到同一個Share Group下面,這樣兩個線程下資源是互相可見可以共享的。
Platform線程是主線程,F(xiàn)lutter中有一個很奇怪的設定,GPU線程和主線程共用一個Context。并且在主線程也有很多OpenGL 操作。
這樣的設計會給音視頻開發(fā)帶來很多問題,后面會詳細說。
音視頻端美顏處理完成的OpenGL紋理能夠讓Flutter直接使用的條件就是Flutter的上下文需要和平臺音視頻相關的OpenGL上下文處在一個Share Group下面。
由于Flutter主線程的Context就是GPU的Context,所以在音視頻端主線程中有一些OpenGL操作的話,很有可能使Flutter整個OpenGL被破壞掉。所以需要將所有的OpenGL操作都限制在子線程中。
通過上述這兩個條件的處理,我們就可以在沒有增加GPU消耗的前提下實現(xiàn)美顏和濾鏡等等功能。
TPM
在經過demo驗證之后,我們將這個方案應用到閑魚音視頻組件中,但改造過程中發(fā)現(xiàn)了一些問題。
上圖是攝像頭采集數(shù)據(jù)轉換為紋理的一段代碼,其中有兩個操作:首先是切進程,將后面的OpenGL操作都切到cameraQueue中。然后是設置一次上下文。然后這種限制條件或者說是潛規(guī)則往往在開發(fā)過程中容易被忽略的。而這個條件一旦忽略后果就是出現(xiàn)一些莫名其妙的詭異問題極難排查。因此我們就希望能抽象出一套框架,由框架本身實現(xiàn)線程的切換、上下文和模塊生命周期等的管理,開發(fā)者接入框架以后只需要安心實現(xiàn)自己的算法,而不需要關心這些潛規(guī)則還有其他一些重復的邏輯操作。
在引入Flutter之前閑魚的音視頻架構與大部分音視頻邏輯一樣采用分層架構:
1:底層是一些獨立模塊
2:SDK層是對底層模塊的封裝
3:最上層是UI層。
引入Flutter之后,通過分析各個模塊的使用場景,我們可以得出一個假設或者說是抽象:音視頻應用在終端上可以歸納為視頻幀解碼之后視頻數(shù)據(jù)幀在各個模塊之間流動的過程,基于這種假設去做Flutter音視頻框架的抽象。
咸魚Flutter多媒體開源組件
整個Flutter音視頻框架抽象分為管線和數(shù)據(jù)的抽象、模塊的抽象、線程統(tǒng)一管理和上下文同一管理四部分。
管線,其實就是視頻幀流動的管道。數(shù)據(jù),音視頻中涉及到的數(shù)據(jù)包括紋理、Bit Map以及時間戳等。結合現(xiàn)有的應用場景我們定義了管線流通數(shù)據(jù)以Texture為主數(shù)據(jù),同時可以選擇性的添加Bit Map等作為輔助數(shù)據(jù)。這樣的數(shù)據(jù)定義方式,避免重復的創(chuàng)建和銷毀紋理帶來的性能開銷以及多線程訪問紋理帶來的一些問題。也滿足一些特殊模塊對特殊數(shù)據(jù)的需求。同時也設計了紋理池來管理管線中的紋理數(shù)據(jù)。
模塊:如果把管線和數(shù)據(jù)比喻成血管和血液,那框架音視頻的場景就可以比喻成器官,我們根據(jù)模塊所在管線的位置抽象出采集、處理和輸出三個基類。這三個基類里實現(xiàn)了剛才說的線程切換,上下文切換,格式轉換等等共同邏輯,各個功能模塊通過集成自這些基類,可以避免很多重復勞動。
線程:每一個模塊初始化的時候,初始化函數(shù)就會去線程管理的模塊去獲取自己的線程,線程管理模塊可以決定給初始化函數(shù)分配新的線程或者已經分配過其他模塊的線程。
這樣有三個好處:
一是可以根據(jù)需要去決定一個線程可以掛載多少模塊,做到線程間的負載均衡。第二,多線程并發(fā)式能夠保證模塊內的OpenGL操作是在當前線程內而不會跑到主線程去,徹底避免Flutter的OpenGL 環(huán)境被破壞。第三,多線程并行可以充分利用CPU多核架構,提升處理速度。
從Flutter端修改Flutter引擎將Context取出后,根據(jù)Context創(chuàng)建上下文的統(tǒng)一管理模塊,每一個模塊在初始化的時候會獲取它的線程,獲取之后會調用上下文管理模塊獲取自己的上下文。這樣可以保證每一個模塊的上下文都是與Flutter的上下文進行Share的,每個模塊之間資源都是共享可見的,F(xiàn)lutter和音視頻native之間也是互相共享可見的。
基于上述框架如果要實現(xiàn)一個簡單的場景,比如畫面實時預覽和濾鏡處理功能,
1:需要選擇功能模塊,功能模塊包括攝像頭模塊、濾鏡處理模塊和Flutter畫面渲染模塊,
2:需要配置模塊參數(shù),比如采集分辨率、濾鏡參數(shù)和前后攝像頭設置等,
3:在創(chuàng)建視頻管線后使用已配置的參數(shù)創(chuàng)建模塊
4:最后管線搭載模塊,開啟管線就可以實現(xiàn)這樣簡單的功能。
上圖為整個功能實現(xiàn)的代碼和結構圖。
結合上述音視頻框架,閑魚實現(xiàn)了Flutter多媒體開源組件。
組要包含四個基本組件分別是:
1:視頻圖像拍攝組件
2:播放器組件
3:視頻圖像編輯組件
4:相冊選擇組件
現(xiàn)在這些組件正在走內部開源流程。預計9月份,相冊和播放器會實現(xiàn)開源。
后續(xù)展望和規(guī)劃
1:實現(xiàn)開頭所說的從底層SDK到UI的全鏈路的跨端開發(fā)。目前底層框架層和模塊層都是各個平臺各自實現(xiàn),反而是Flutter的UI端進行了跨平臺的統(tǒng)一,所以后續(xù)會將底層也按照音視頻常用做法把邏輯下沉到C++層,盡可能的實現(xiàn)全鏈路跨平臺。
2:第二部分內容為開源共建,閑魚開源的內容不僅包括拍攝、編輯組件,還包括了很多底層模塊,希望有開發(fā)者在基于Flutter開發(fā)音視頻應用時可以充分利用閑魚開源出的音視頻模塊能力,搭建APP框架,開發(fā)者只要去負責實現(xiàn)特殊需求模塊就可以,盡可能的減少重復勞動。
當前名稱:flutter流行程度,flutterflies
文章鏈接:http://www.dlmjj.cn/article/dsephhi.html