Flutter在iOS上採用Metal驅動GPU

沒有年薪的碼農發表於2020-05-07

前言

Flutter1.17正式釋出

關於1.17正式版

應用效能和包大小優化

此版本的主要重點是在效能和記憶體改進方面繼續進行全面優化工作。只需將應用程式升級到此版本,使用者就會看到更快的動畫,更小的應用程式和更低的記憶體佔用率。在此版本中,預設導航情況(不透明導航欄)的速度將提高20%-37%。對於簡單的iOS動畫,最多減少40%的CPU / GPU使用率,具體降低多少取決於硬體(在PR 14104和PR 13976中進行了詳細介紹)。

此版本還提供了一個較大的應用程式大小的改善,是由於幾處問題修復導致包增大的結果。例如,Android的FlutterGallery示例在2019年底為9.6MB,現在為8.1MB,減少了18.5%。

對於記憶體使用,此版本將快速滾動瀏覽大影像減少了70%的記憶體,這也間接使應用效能提高,具體取決於裝置的記憶體量。

Flutter在iOS上採用Metal驅動GPU

Metal支援可將iOS的效能提高50%

蘋果公司在iOS上對Metal的支援幾乎可以直接訪問底層GPU,並且是蘋果公司推薦的圖形API。在完全支援Metal的iOS裝置上,Flutter目前在預設情況下會優先使用它,這使您的Flutter應用程式大多數情況下執行得更快,平均將渲染速度提高了約50%(取決於渲染的工作量)。

Flutter在iOS上採用Metal驅動GPU

對於不完全支援Metal的裝置(A7處理器之前的版本或執行10之前的iOS版本的裝置),Flutter會像過去一樣使用OpenGL,從而為較舊的裝置提供本地渲染速度。

新增Widgets:NavigationRail,DatePicker等

在此版本中,Flutter新增NavigationRail了一個新的小部件,該小部件提供了響應式應用程式導航。它是由Google Material Design團隊設計和開發的。該NavigationRail是優秀的,因為它很容易切換應用程式BottomNavigato,從另一個途徑將應用程式的可見螢幕尺寸的增大。

其它部件請參考頂部連結深入瞭解;

Material文字比例:使Flutter文字主題現代化

在此版本中,Flutter團隊完成了2018 Material Design規範的Type Scale部分的實現,同時沒有破壞現有的Flutter應用程式。2018年10月的PR 22330中增加了對新配置的選擇加入支援,但不對新名稱提供支援。現有的文字樣式名稱未更改,因為這樣做是一個重大的API更改,可能會影響大多數應用程式。此版本更新了TextThemeAPI以匹配當前的Material規範,但保留了舊名稱,以使您的程式碼不會中斷。但是,舊名稱已被棄用,因此您在使用的時候將收到警告,以提醒您在開發時採用新名稱.

Google字型用於Flutter

文字和字型齊頭並進,因此,如果您對新的Material Text Scale實現有興趣,那麼您可能也會對新的Flutter v1.0版Google字型有同樣的興趣。

Google字型允許開發人員在其應用中輕鬆地嘗試和使用fonts.google.com中的任何字型。當應用程式準備釋出時,開發人員將決定使用者是否通過從API下載字型來接收字型,或者它與應用程式包預先捆綁在一起。

可訪問性和國際化

在此發行版中,我們已完成了全部工作,包括滾動,文字 字型和其他輸入小部件的可訪問性修復程式等。您將在GitHub的該版本中看到有關可訪問性問題的完整列表。我們推薦您測試自己的應用程式的可訪問性,並且還通過一些推薦的最佳實踐更新了此版本中的文件。

工具:Dart DevTools移植到Flutter,Android快速入門等

此版本使我們將Dart DevTools的當前版本換成新的Flutter版本。如果您想嘗試一下,請啟動DevTools並單擊DevTools右上角的“燒杯”圖示。

Flutter在iOS上採用Metal驅動GPU

Devtools還有其它很多有趣的更新等待你的發掘。

詳細請參考連結文章進行實踐;實踐會讓你看到比任何文章更好的介紹;

1.17中 Flutter 和 Metal

此處是文章重點翻譯內容

Flutter引擎在iOS上將遷移到使用Metal渲染API,而不是使用OpenGL;

為什麼使用Metal ?

一個Flutter使用者介面通過使用加速圖形API訪問平臺上的GPU顯示在螢幕上。這個API是iOS上OpenGL ES的一個版本。隨著iOS 12的引入,OpenGL ES和相關的api在2018年被蘋果正式否決。Metal現在是iOS和Mac上低階別、低開銷渲染的推薦API。雖然OpenGL的跨平臺方面確實很有用,但Flutter團隊也很看好Metal方案。OpenGL ES的不受歡迎似乎也導致了iOS上的OpenGL驅動程式維護得不太好。iOS特有的OpenGL問題出現了上升趨勢,這些問題越來越難除錯,而且不太可能得到修復。基於這些原因,在iOS上向Metal遷移勢在必行。

在什麼版本上flutter會使用Metal?

Flutter的Metal渲染將用於蘋果A7裝置或執行iOS10或更高版本的裝置。當不能使用Metal時,會降級使用OpenGL。

為什麼Flutter不能在所有iOS機型使用Metal?

Flutter目前支援在iOS 8及以上版本上執行。這包括Metal本身不可用的裝置。具體來說,Metal只在蘋果A7或更高版本的iOS裝置上可用。這將排除像iPhone 5C這樣可以升級到iOS 10但只有Apple A6 SOC的裝置。一項要求在任何地方都使用Metal的政策意味著我們將不得不放棄一些機型。這不是Flutter現在準備考慮的適配問題。

還有些問題是少數支援8到10之間iOS版本的裝置,這些裝置具有Apple A7 SOC(或更高版本),但尚未更新到最新的iOS版本。Flutter在技術上也可以在這些裝置上使用Metal,但目前還沒有。這是因為早期版本的iOS上的Metal API對於Flutter所需的特性(特別是Flutter所使用的Skia渲染庫)的表現力不夠。這需要為雙源混合等情況建立解決方案或備用方案。為了減少實現和測試負擔,決定選擇iOS 10作為基準。如有必要,可以修改這項決定。(也就意味著只要是A7以上,理論上來說是都可以使用Metal進行渲染)

這是否改變了Flutter支援的iOS的最低版本?

不。Flutter將在較新的裝置和iOS版本上使用Metal,但OpenGL後端保持原樣。當Metal不可用時使用,是一個替代方案。

作為一個Flutter開發者,我需要做些什麼來遷移到iOS上使用Metal呢?

除了您的應用程式在引擎下使用OpenGL對Flutter做出假設的可能性非常小的處理情況之外,一般不需要開發者進行特意的適配。更新的Flutter引擎不需要對Flutter應用程式或其嵌入方式進行任何更改。

是否因為新增了Metal支援而對二進位制大小產生影響?

對。未壓縮的Flutter引擎二進位制檔案的大小將增加約250KB。將繼續對這個大小進行增量縮減,但要進行顯著縮減,需要刪除OpenGL後端。目前Flutter團隊還沒有考慮這個問題。

攝像頭預覽、視訊播放、webview、地圖等外掛是否能繼續工作?

對。這些外掛不需要更新,它們將繼續按預期工作。Flutter plugins repo中的所有外掛都已經過測試,可以與Metal後端協同工作。

如何判斷我的應用程式是否在引擎下使用OpenGL對Flutter進行了修改?

Flutter使用的渲染API是Flutter引擎的一個實現細節。然而,Flutter確實為底層平臺提供了在Flutter層次中為內聯合成提供紋理的能力。開發人員(或外掛)通過在他們的應用程式中使用一個紋理小部件並編寫一些特定於平臺的程式碼來提供和更新這些紋理。如果操作提供給Flutter引擎的紋理的平臺特定程式碼沒有指定紋理可以與Metal API互操作,則這些紋理的內聯組合可能會失敗。有關確保紋理可與金屬互操作的指導,請遵循有關如何“建立可互操作紋理”的文件。具體來說,在建立描述紋理的畫素緩衝區時,除了kcppixelbufferopenglcompatibilitykey鍵之外,還必須指定kcppixelbuffermetalcompatibilitykey鍵。

如果應用程式不使用紋理小部件,則無需執行任何操作。如果是這樣,則必須檢查提供給Flutter的紋理,以確保它們可以與Metal互操作。

這是一個非常獨特的用例,Flutter plugins repo中沒有使用這種機制的外掛。

如果我的應用程式使用OpenGL為Flutter應用程式中的內聯合成提供紋理,這是否適用於Metal後端?

對。如前所述,只要提供給Flutter的紋理可以與Metal互操作,就可以繼續使用OpenGL更新紋理,Flutter將使用Metal合成相同的紋理。

如何在執行時判斷Flutter應用程式是否使用Metal而不是OpenGL進行渲染?

fluttViewControllers檢視將有一個camertalayer類。Flutter將使用Metal或OpenGL。也就是說,在一個過程中,不可能有一些Flutter應用例項同時使用Metal和OpenGL。

Flutter會在iOS模擬器上使用金屬嗎?

不,目前沒有。Flutter將一如既往地繼續在iOS模擬器上使用軟體後端。

相關文章