目前,最優的選擇有四個:
成都創新互聯公司專注于呼中網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供呼中營銷型網站建設,呼中網站制作、呼中網頁設計、呼中網站官網定制、微信小程序開發服務,打造呼中網絡公司原創品牌,更為您提供呼中網站排名全網營銷落地服務。
1.如果只在win下使用,.net form是不二選擇,可謂是又快又好,企業應用或定制開發都是相當好的,初學者也可以入手。
2.electron,跨平臺。需要會前端,必須熟悉js、css和html。屬于前端人員大殺器,如果是初學者,需要一下子學三樣東西,再加上electron的進程間通信,可能會被搞懵。
3. qt5,可以使用qml(js語法)進行UI編程,但是需要懂c艸,但是寫軟件相當快,還可以寫安卓、ios、Linux、嵌入式中的應用。
4.flutter,剛剛正式支持win平臺的軟件開發。谷歌出的這個東西,適合沒有基礎的初學者,因為是一個全新的體系,全新的語言,寫ios、安卓非常高效,之后還會兼容h5。如果是初學者可以跟著走,值得嘗試。但是新東西總有一些坑。
正式項目跨平臺建議electron或qt,只用win平臺強烈建議微軟自己的net。個人技術嘗試建議flutter。
桌面端開發跨平臺的,如果你是輕量級的項目,那么我推薦你用electron, 目前使用Electron來開發的桌面應用非常多,我們最熟悉的比如Atom,VScode等等。
而且在github上也能找到許多應用使用了electron。
electron是Node,Chromium,html,css,js的結合框架,這就需要你有一定的前端基礎。其實只需要了解一下electron的API就行了,其他的就像你在做web是一樣的。
這種方式最大的缺點就是性能,還有透明窗口也有問題。所以在做需要性能方面占有很大成分的項目時,并不推薦使用這個方式。
那么其他的,就是最近幾年使用比較多的windows directui框架,但它不是跨平臺的。
那么就引出了qt,作為c++跨平臺的界面框架,這個上手的話,我覺得對一般人是有難度的,因為首先需要扎實的c++功底,其次你要熟悉控件的制作原理,因為有時候你需要定制自己的UI控件。它現在在嵌入式,軍工領域非常受歡迎。但是整個庫非常臃腫龐大,而且開發界面的效率也非常低。如果來做互聯網項目,迭代更新的速度根本就跟不上。
目前都只有大公司會采用,像maya這種生產力型的應用很多是qt做的。
還有一種是直接使用Cef加js,比如網易云音樂,就是這么搞的,但是很多和系統平臺的交互接口你需要重寫,等于是需要自己造輪子。工作量大,目前沒有適合的框架給你套用,也需要扎實的c++功底。
其實pc端的應用基本也就windows會火一些,再加一個macos,那么選擇qt應該會很好一點,畢竟你自己造一個跨平臺的框架,太費時。總之,做跨平臺就意味著,不可能做到既有效率又完美的實現各種功能,許多都要自己摸索。
win桌面端直接上visual studio啊!然后你熟悉什么語言?vb.net,c#,c++都有相應的win桌面工具。直接用就好了,非常好用
編程語言這種東西無所謂,只要能用啥都可以。 主要看你老板需要和你會用什么語言。
比如 我用AS編安卓程序,當然用JAVA。不過我后臺最開始用ASP和ASP.NET來做,現在換PHP了。桌面端用QT或者VB做。 涉及單片機部分控制也用C。
現在做跨平臺的了 開始以QT為主了。
只要能達到目的啥都可以。
學會1-2種 換其他的也不是很難。
對初學者來建議學C起步吧。
精通一門,重新學個語言入門也就1個月的事。
PC桌面程序,如果簡單一點的,用pyqt5+python的開發難度和周期都比較現實一點
會C++ 用Qt5 非常不錯 寫代碼效率很高
會js 用atom使用的那個框架
會Python用PyQt 寫代碼很快
會java用JavaFX
看語言咯
還可以用delphi,其firemonkey框架發布8年時間,支持跨平臺:win,安卓,ios,macos,linux,后續支持webassembly,界面是控件拖拽布局所見即所得,開發效率較高。編譯生成的是機器碼,編譯速度快,調試方便,其生成機器碼運行效率較高,支持x86,arm的32位64位處理器。支持跨平臺3D界面,藍牙通訊,定位,重力,攝像等,支持多種SQL,NoSQL數據庫。單個開發工具實現前后端開發,跨平臺開發。適合個人和小公司用一套工具實現大部分開發需求。
主要有以下幾種技術
### Duilib
#### 簡述
Duilib是在Windows平臺上使用最廣泛的類庫,使用C++和XML混合編程,國內很多計算機企業都喜歡使用這個類庫,可能是由于他的技術許可比較寬泛的原因。
適合于界面比較簡單的軟件,視覺特效豐富,局限于Windows的平臺。例子:360電腦管家。
#### 優勢
#### 劣勢
### Gtk、Qt或WxWidget:
#### 簡述
三種基本可以做到跨平臺的技術,使用C/C++開發,使用者廣泛。其中WxWidget使用了API嫁接方式,Qt和Gtk(包括各種綁定技術)使用自繪技術。
結構嚴謹,軟件可以做的很大很復雜。例子:WPS和Maya。
#### 優勢
#### 劣勢
### Electron:
#### 簡介
使用Web技術開發桌面軟件,基于Chromium(Chrome)引擎,使用JS編程語言,絕大多數使用者都是原來的網頁開發者。
絕大多數都是愛好者使用,處于“勉強可用”的地步。
適合大面積靜態展示型軟件使用。例子:網易云音樂。
#### 優勢
#### 劣勢
### QtQuick(QML)
#### 簡述
Qt公司開發的一款基于OpenGL的圖形類庫,有顯卡加速,類似于Duilib。采用了C++與QML混合編程。QML類似于JavaScript語言。
QtQuick下一個版本在Qt 6上更加強大,業界期待已久。
#### 優勢
#### 劣勢
### Atk、Swing或JavaFX
使用Java語言開發軟件,有JDK加持業界積累的眾多Java類庫支持。有不輸于VS的IDEA加持,本應該更棒,只是現在已經式微了。
絕大多數使用者都是企業開發(不追求界面美觀)、愛好者(開發順手)。
### WinForm、WPF或Xamarin:
使用C#開發,WinForm和WPF局限于Windows平臺。有VisualStudio加持使用很爽。
### Flutter:
使用Dart語言,新類庫,bug可能會很多。
### SwiftUI或Cocoa:
蘋果平臺原生界面技術,macOS平臺內建支持,不是macOS專用軟件不推薦。
### Win32:
經典Windows 平臺API,絕大多數只有一些老軟件還在使用,不是維護老軟件不推薦。
winform,不二選擇
webview2,作為一個瀏覽器控件嵌入在桌面應用中,支持.net core和.net framework
??最近在學習Flutter開發,在一次配置環境的過程中遇到了一個比較尷尬的坑,不過最終還是把這個坑給填掉了,再此進行一些分享,希望后來者遇到同樣的問題時可以輕松的解決。
??從下圖中可以看出,前面幾條 flutter doctor 命令執行的時候總是未響應,通過各種方式執行都是一樣的結果,但是dart命令是能夠正常執行。起初還以為是環境變量配置的有問題,但是后來把環境變量改了又改,并且把flutter包換了又換,但是現象一直未得到解決。
??遇到這種難題第一時間想到的便是百度,但是各種關鍵詞搜索了一番之后,竟然沒有找到一篇關于這種現象的解決方案,大部分都是flutter命令使用教程,如用 flutter doctor 去查看環境是否配置完成,或者通過 flutter doctor --android-licenses 命令去接受Android SDK的一些協議許可。
??后來,又嘗試了必應和Google搜索,也無果之后,放棄了通過網絡尋求幫助解決的方法。
??由于只有flutter的命令執行的時候無響應,所以起初認為是程序包有問題。于是通過再次解壓程序壓縮包和配置環境變量之后,問題仍然存在。
??隨后,判斷了不是程序包的問題之后開始去監控應用進程的變化。
??到這里,可以猜到很可能是由于git導致的問題,但是先前安裝過flutter都沒有問題,這一次重裝系統之后就突然有問題了。所以就嘗試著把git軟件給刪除并重新安裝,然后奇跡的發現了 flutter doctor 命令可以正常執行了。
??于是又倒退回去復現了一下問題,發現是安裝git的時候選項選的有問題導致了和flutter沖突。
??如下圖,選擇了 Use Window's default console window 的選項來安裝git軟件之后,git bash是直接用的window的命令窗口來執行命令。正是因為選中了這個選項所以導致flutter命令無響應的問題。
??所以如果你出現了和我一樣的問題可以嘗試重新安裝git軟件,并在這一步選擇 Use MinTTY 的選項來安裝。
??經過不斷的試錯,終于將這個問題解決了,flutter命令也可以正常執行了。如圖,通過VSCode開發工具可以正常的執行 flutter create hello_flutter 創建新的flutter項目。
??遇到問題要大膽試錯,只要不斷的嘗試就會離問題的起因更近,最后找到解決問題的辦法。如果你的flutter遇到了相同的問題而又不是由于git導致的話,也可以通過類似的方式不斷試錯并找到最終的解決方案。也歡迎各位同行可以在評論里分享自己解決問題的方法。
??樂于分享,共同進步。
Uniapp目前比較成熟,而且用的是Vue語法,學習成本比較低,而且行業里面用的也比較廣泛,而Flutter的話,學習成本略高,因為要學習新的語言,還有就是目前生態不是特別完備,等他再發展發展吧。黑馬程序員官網有成套免費視頻哦,有什么不懂的可以直接過去學習。您的采納是對我成長的鞭策
文/陳爐軍
整理/LiveVideoStack
大家好,我是阿里巴巴閑魚事業部的陳爐軍,本次分享的主題是Flutter浪潮下的音視頻研發探索,主要內容是針對閑魚APP在當下流行的跨平臺框架Flutter的大規模實踐,介紹其在音視頻領域碰到的一些困難以及解決方案。
分享內容主要分為四個方面,首先會對Flutter有一個簡單介紹以及選擇Flutter作為跨平臺框架的原因,其次會介紹Flutter中與音視頻關系非常大的外接紋理概念,以及對它做出的一些優化。之后會對閑魚在音視頻實踐過程中碰到的一些Flutter問題提出了一些解決方案——TPM音視頻框架。最后是閑魚Flutter多媒體開源組件的介紹。
Flutter
Flutter是一個跨平臺框架,以往的做法是將音頻、視頻和網絡這些模塊都下沉到C++層或者ARM層,在其上封裝成一個音視頻的SDK,供UI層的PC、iOS和Android調用。
而Flutter做為一個UI層的跨平臺框架,顧名思義就是在UI層也實現了一個跨平臺開發。可以預想的是未Flutter發展的好的話,會逐漸變為一個從底層到UI層的一個全鏈路的跨平臺開發,技術人員分別負責SDK和UI層的開發。
在Flutter之前已經有很多跨平臺UI解決方案,那為什么選擇Flutter呢?
我們主要考慮性能和跨平臺的能力。
以往的跨平臺方案比如Weex,ReactNative,Cordova等等因為架構的原因無法滿足性能要求,尤其是在音視頻這種性能要求幾乎苛刻的場景。
而諸如Xamarin等,雖然性能可以和原生App一致,但是大部分邏輯還是需要分平臺實現。
我們可以看一下,為什么Flutter可以實現高性能:
原生的native組件渲染以IOS為例,蘋果的UIKit通過調用平臺自己的繪制框架QuaztCore來實現UI的繪制,圖形繪制也是調用底層的API,比如OpenGL、Metal等。
而Flutter也是和原生API邏輯一致,也是通過調用底層的繪制框架層SKIA實現UI層。這樣相當于Flutter他自己實現了一套UI框架,提供了一種性能超越原生API的跨平臺可能性。
但是我們說一個框架最終性能怎樣,其實取決于設計者和開發者。至于現在到底是一個什么狀況:
在閑魚的實踐中,我們發現在正常的開發沒有特意的去優化UI代碼的情況下,在一些低端機上,Flutter界面的流暢性是比Native界面要好的。
雖然現在閑魚某些場景下會有卡頓閃退等情況,但是這是一個新事物發展過程中的必然問題,我們相信未來性能肯定不會成為限制Flutter發展的瓶頸的。
在閑魚實踐Flutter的過程中,混合棧和音視頻是其中比較難解決的兩個問題,混合棧是指一個APP在Flutter過程中不可能一口氣將所有業務全部重寫為Flutter,所以這是一個逐步迭代的過程,這期間原生native界面與Flutter界面共存的狀態就稱之為混合棧。閑魚在混合棧上也有一些比較好的輸出,例如FlutterBoost。
外接紋理
在講音視頻之前需要簡要介紹一下外接紋理的概念,我們將它稱之為是Flutter和Frame之間的橋梁。
Flutter渲染一幀屏幕數據首先要做的是,GPU發出的VC信號在Flutter的UI線程,通過AOT編譯的機器碼結合當前Dart Runtime,生成Layer Tree UI樹,Layer Tree上每一個葉子節點都代表了當前屏幕上所需要渲染的每一個元素,包含了這些元素渲染所需要的內容。將Layer Tree拋給GPU線程,在GPU線程內調用Skia去完成整個UI的渲染過程。Layer Tree中有PictureLayer和TextureLayer兩個比較重要的節點。PictureLayer主要負責屏幕圖片的渲染,Flutter內部實現了一套圖片解碼邏輯,在IO線程將圖片讀取或者從網絡上拉取之后,通過解碼能夠在IO線程上加載出紋理,交給GPU線程將圖片渲染到屏幕上。但是由于音視頻場景下系統API太過繁多,業務場景過于復雜。Flutter沒有一套邏輯去實現跨平臺的音視頻組件,所以說Flutter提出了一種讓第三方開發者來實現音視頻組件的方式,而這些音視頻組件的視頻渲染出口,就是TextureLayer。
在整個Layer Tree渲染的過程中,TextureLayer的數據紋理需要由外部第三方開發者來指定,可以把視頻數據和播放器數據送到TextureLayer里,由Flutter將這些數據渲染出來。
TextureLayer渲染過程:首先判斷Layer是否已經初始化,如果沒有就創建一個Texture,然后將Texture Attach到一個SufaceTexture上。
這個SufaceTexture是音視頻的native代碼可以獲取到的對象,通過這個對象創建的Suface,我們可以將視頻數據、攝像頭數據解碼放到Suface中,然后Flutter端通過監聽SufaceTexture的數據更新就可以順利把剛才創建的數據更新到它的紋理中,然后再將紋理交給SKIA渲染到屏幕上。
然而我們如果需要用Flutter實現美顏,濾鏡,人臉貼圖等等功能,就需要將視頻數據讀取出來,更新到紋理中,再將GPU紋理經過美顏濾鏡處理后生成一個處理后的紋理。按Flutter提供的現有能力,必須先將紋理中的數據從GPU讀出到CPU中,生成Bitmap后再寫入Surface中,這樣在Flutter中才能順利的更新到視頻數據,這樣做對系統性能的消耗很大。
通過對Flutter渲染過程分析,我們知道Flutter底層需要渲染的數據就是GPU紋理,而我們經過美顏濾鏡處理完成以后的結果也是GPU紋理,如果可以將它直接交給Flutter渲染,那就可以避免GPU-CPU-GPU這樣的無用循環。這樣的方法是可行的,但是需要一個條件,就是OpenGL上下文共享。
OpenGL
在說上下文之前,得提到一個和上線文息息相關的概念:線程。
Flutter引擎啟動后會啟動四個線程:
第一個線程是UI線程,這是Flutter自己定義的UI線程,主要負責GPU發出的VSync信號時候用當前Dart編譯的機器碼和當前運行環境創建出Layer Tree。
還有就是IO線程和GPU線程。和大部分OpenGL處理解決方案中一樣,Flutter也采取一個線程責資源加載,一部分負責資源渲染這種思路。
兩個線程之間紋理共享有兩種方式。一種是EGLImage(IOS是 CVOpenGLESTextureCache)。一種是OpenGL Share Context。Flutter通過Share Context來實現紋理共享,將IO線程的Context和GPU線程的Context進行Share,放到同一個Share Group下面,這樣兩個線程下資源是互相可見可以共享的。
Platform線程是主線程,Flutter中有一個很奇怪的設定,GPU線程和主線程共用一個Context。并且在主線程也有很多OpenGL 操作。
這樣的設計會給音視頻開發帶來很多問題,后面會詳細說。
音視頻端美顏處理完成的OpenGL紋理能夠讓Flutter直接使用的條件就是Flutter的上下文需要和平臺音視頻相關的OpenGL上下文處在一個Share Group下面。
由于Flutter主線程的Context就是GPU的Context,所以在音視頻端主線程中有一些OpenGL操作的話,很有可能使Flutter整個OpenGL被破壞掉。所以需要將所有的OpenGL操作都限制在子線程中。
通過上述這兩個條件的處理,我們就可以在沒有增加GPU消耗的前提下實現美顏和濾鏡等等功能。
TPM
在經過demo驗證之后,我們將這個方案應用到閑魚音視頻組件中,但改造過程中發現了一些問題。
上圖是攝像頭采集數據轉換為紋理的一段代碼,其中有兩個操作:首先是切進程,將后面的OpenGL操作都切到cameraQueue中。然后是設置一次上下文。然后這種限制條件或者說是潛規則往往在開發過程中容易被忽略的。而這個條件一旦忽略后果就是出現一些莫名其妙的詭異問題極難排查。因此我們就希望能抽象出一套框架,由框架本身實現線程的切換、上下文和模塊生命周期等的管理,開發者接入框架以后只需要安心實現自己的算法,而不需要關心這些潛規則還有其他一些重復的邏輯操作。
在引入Flutter之前閑魚的音視頻架構與大部分音視頻邏輯一樣采用分層架構:
1:底層是一些獨立模塊
2:SDK層是對底層模塊的封裝
3:最上層是UI層。
引入Flutter之后,通過分析各個模塊的使用場景,我們可以得出一個假設或者說是抽象:音視頻應用在終端上可以歸納為視頻幀解碼之后視頻數據幀在各個模塊之間流動的過程,基于這種假設去做Flutter音視頻框架的抽象。
咸魚Flutter多媒體開源組件
整個Flutter音視頻框架抽象分為管線和數據的抽象、模塊的抽象、線程統一管理和上下文同一管理四部分。
管線,其實就是視頻幀流動的管道。數據,音視頻中涉及到的數據包括紋理、Bit Map以及時間戳等。結合現有的應用場景我們定義了管線流通數據以Texture為主數據,同時可以選擇性的添加Bit Map等作為輔助數據。這樣的數據定義方式,避免重復的創建和銷毀紋理帶來的性能開銷以及多線程訪問紋理帶來的一些問題。也滿足一些特殊模塊對特殊數據的需求。同時也設計了紋理池來管理管線中的紋理數據。
模塊:如果把管線和數據比喻成血管和血液,那框架音視頻的場景就可以比喻成器官,我們根據模塊所在管線的位置抽象出采集、處理和輸出三個基類。這三個基類里實現了剛才說的線程切換,上下文切換,格式轉換等等共同邏輯,各個功能模塊通過集成自這些基類,可以避免很多重復勞動。
線程:每一個模塊初始化的時候,初始化函數就會去線程管理的模塊去獲取自己的線程,線程管理模塊可以決定給初始化函數分配新的線程或者已經分配過其他模塊的線程。
這樣有三個好處:
一是可以根據需要去決定一個線程可以掛載多少模塊,做到線程間的負載均衡。第二,多線程并發式能夠保證模塊內的OpenGL操作是在當前線程內而不會跑到主線程去,徹底避免Flutter的OpenGL 環境被破壞。第三,多線程并行可以充分利用CPU多核架構,提升處理速度。
從Flutter端修改Flutter引擎將Context取出后,根據Context創建上下文的統一管理模塊,每一個模塊在初始化的時候會獲取它的線程,獲取之后會調用上下文管理模塊獲取自己的上下文。這樣可以保證每一個模塊的上下文都是與Flutter的上下文進行Share的,每個模塊之間資源都是共享可見的,Flutter和音視頻native之間也是互相共享可見的。
基于上述框架如果要實現一個簡單的場景,比如畫面實時預覽和濾鏡處理功能,
1:需要選擇功能模塊,功能模塊包括攝像頭模塊、濾鏡處理模塊和Flutter畫面渲染模塊,
2:需要配置模塊參數,比如采集分辨率、濾鏡參數和前后攝像頭設置等,
3:在創建視頻管線后使用已配置的參數創建模塊
4:最后管線搭載模塊,開啟管線就可以實現這樣簡單的功能。
上圖為整個功能實現的代碼和結構圖。
結合上述音視頻框架,閑魚實現了Flutter多媒體開源組件。
組要包含四個基本組件分別是:
1:視頻圖像拍攝組件
2:播放器組件
3:視頻圖像編輯組件
4:相冊選擇組件
現在這些組件正在走內部開源流程。預計9月份,相冊和播放器會實現開源。
后續展望和規劃
1:實現開頭所說的從底層SDK到UI的全鏈路的跨端開發。目前底層框架層和模塊層都是各個平臺各自實現,反而是Flutter的UI端進行了跨平臺的統一,所以后續會將底層也按照音視頻常用做法把邏輯下沉到C++層,盡可能的實現全鏈路跨平臺。
2:第二部分內容為開源共建,閑魚開源的內容不僅包括拍攝、編輯組件,還包括了很多底層模塊,希望有開發者在基于Flutter開發音視頻應用時可以充分利用閑魚開源出的音視頻模塊能力,搭建APP框架,開發者只要去負責實現特殊需求模塊就可以,盡可能的減少重復勞動。
網頁標題:flutter進程,flutter進程守護
文章分享:http://m.kartarina.com/article26/dseicjg.html
成都網站建設公司_創新互聯,為您提供品牌網站建設、App設計、軟件開發、云服務器、定制網站、ChatGPT
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯