有關flutter外接紋理的優化(AndroidView和unity在鴻蒙系統上的不相容問題)

語言: CN / TW / HK

接上篇《Flutter整合unity踩坑之旅》

當前公司的3D專案已經基本完成alpha版本,將要就行內部測試,從完成第一個版本,到現在的內測版本,中間也踩了一些坑,具體如下。

問題1:

上篇文章提到unity頁面退出時的處理,當時的解決辦法是在需要退出unity頁面的時候,解除安裝掉場景資源,然後暫停unity播放器,這樣做得話可以儘量的減少app的記憶體佔用,但減少的記憶體也有限。

解決過程:

之前用的flutter_unity_widge外掛,此外掛的實現方式是通過PlatformView將unity檢視紋理外接到flutter層。之前想的方法是基於這個外掛的,拋開這個外掛,問題可以更好的解決。

解決方案:

自己製作外掛。讓unity釋放所有資源的最好方法,就是unity端呼叫quit()方法來結束程序,所以我們在開啟unity介面的時候,只要開啟一個新的程序,就可以在退出的時候直接結束這個程序而不影響當前的flutter程序。

具體的實現方法就是,建立一個外掛,在Android工程中建立一個Activity,繼承UnityPlayerActivity(此Activity中包含一些unity頁面相關的基本方法),在開啟unity頁面的時候,通過新的程序啟動我們建立的這個Activity

image.png 如此可在新程序中執行unity。

因為unity程序與flutter不在同一程序,所以通訊的話,可能需要做一套跨程序通訊。當前我們專案不涉及頻繁通訊,暫時沒做,之後做得話會繼續更新。

問題2:

公司的flutter工程使用了阿里雲的開源播放器AliPlayer,完成第一個版本的開發之後,測試發現在華為的鴻蒙系統上AliPlayer播放異常。

解決過程:

開始時從unity方面入手排查問題,通過修改unity相關的打包配置來解決,經過多次嘗試之後,發現此路不通。

之後在Aliplayer方面排查問題,發現是原生層的影片紋理外接到flutter層的這一步有問題,拉下來AliPlayer的原始碼檢視,發現Aliplayer原生與flutter層的紋理是通過AndroidView承接,所以想到的解決辦法是避開AndroidView,通過其他的方式將原生層的紋理外接到flutter。

解決方案:

使用Hybrid Composition 來實現原生紋理外接到flutter,具體的實現方式,這篇文章

flutter專案中使用的webview外掛,高德地圖外掛,一些其他用到AndroidView的外掛,都可以通過次方法解決在鴻蒙系統上的使用異常問題。

之後會更新IOS打包問題的解決辦法,敬請期待。