PPT下載地址:https://u3d.sharepoint.cn/:b:/s/UnityChinaResources/EaZmiWfAAdFFmuyd6c-7_3ABhvZoaM69g4Uo2RrSzT3tZQ?e=2h7RaL
在2025年4月12日的Unity User Group杭州站中,Unity中國OpenHarmony技術負責人劉偉賢帶來演講《團結引擎1.5.0 OpenHarmony新Feature介紹》。
今天帶來關于我們在OpenHarmony平臺上的一些更新,我會著重介紹團結引擎從1.4.X到1.5.0,在OpenHarmony上做了哪些東西。
OpenHarmony平臺基本介紹
首先用一張圖簡單地表達OpenHarmony、HarmonyOS以及HarmonyOS NEXT的關系。
其實從很早期開始,OpenHarmonyOS就已經是基于OpenHarmony系統內核打造的,當然它本身還與一部分AOSP(安卓)捆綁在一起,這是以前的鴻蒙系統。
OpenHarmony是鴻蒙系統的底座和內核,在新的HarmonyOS NEXT版本里把安卓部分剔除了。我們從2023年就已經開始在適配OpenHarmony系統,到今天為止已經經過了一年多的開發。我們基本上把系統的能力已經全面適配,而且也一直持續地跟進OpenHarmony SDK的適配。
同時,我們在無縫遷移方面做了很多努力,希望能夠讓很多原有項目快速觸達到這個新平臺。
我們在OpenHarmony平臺上支持直接讀取安卓平臺的AssetBundle,同時在切換平臺時,我們的OpenHarmony平臺會無縫將貼圖壓縮格式讀取過來。所以大家如果已經有針對安卓和iOS的成熟項目,現在要切到OpenHarmony的話,只要打開團結引擎這個項目,再切換一下平臺去構建,就能直接遷移到這個平臺上了。而且,我們還提供了特有的Package的支持。
目前,我們已經有30多款多個品類的游戲移植到了開源鴻蒙平臺。不管是MMO、RPG,還是三國殺、捕魚、跑酷這類輕量級、中重度,或大型游戲,都能夠通過團結引擎無縫遷移到開源鴻蒙平臺。
因為這一平臺的發展速度實在太快了,它的SDK更新迭代也非常快,所以開發者通常都會問我,到底選用哪個團結引擎的版本,或者選用哪個SDK的版本,能夠更好地適配這個平臺?
我簡單地通過這一張圖展示了我們整個SDK的對應關系。
從1.0.0開始,我們每一個大版本都在更新SDK。1.5.0版本支持最新的SDK 5.0.2,也就是API 14版本。如果你準備進入或者馬上要有項目進入這個平臺,推薦大家都選用我們最新的版本,因為這適配了最新的SDK。
從1.4.X到1.5.0
在SDK 5.0之前的版本,可以像安卓一樣直接點build得到一個API,并且裝在任意一臺手機上。但在最新的SDK中,在沒有任何證書的情況下,沒有辦法直接把它build and run到這個設備上。
這就意味著在OpenHarmony平臺上,整體發展趨勢會越來越趨向于iOS,系統的開放程度可能會與蘋果更相近。在這次SDK版本中,大家如果想要把構建后的應用裝到手機上,必須要先申請證書,在Editor里我們也提供了這樣的配置項,與安卓基本上是一樣的keystore的配置界面,大家把從網站上申請的證書配置到這個界面里,就可以直接一鍵build出安裝包,然后裝到你的設備上。
在新SDK版本中還有很多變更,一個最重要的變更是它會要求更多地使用ETS。
之前在OpenHarmony上主要的膠水代碼語言與安卓不一樣,安卓是Java,但在OpenHarmony上是TypeScript(TS)。TS是一種動態語言,它為了提升性能和安全性推出了ETS,ETS做的是把一些動態語言的特性進行了改進,例如把它改成強類型,把很多動態語言本來很靈活的特性固化,通過編譯器的優化達到更好的性能。
所以在新的SDK版本里,OpenHarmony會要求膠水層的代碼盡可能全部用ETS。上圖左邊是之前老的適配平臺的膠水代碼,都是“.ts”后綴,但新的版本里已經從“.ts”后綴全部切換成“.ets”后綴,更加安全,運行效率更加高。
另外還有一點是,OpenHarmony SDK 5.0.2的SDK本身可能有一些問題,導致現在無法直接Build And Run。這個問題我們也已經反饋給廠商,他們會在后續版本快速修復。同時,大家可以在這個新版本里使用Commnadline Tools里的SDK來避免這個問題。
這都是SDK5.0.2之后變更的影響,接下來我們介紹團結引擎在這些部分的主要更新。
第一,貼圖壓縮格式繼承。在老項目遷移時有很多問題,例如從安卓平臺切換到OpenHarmony平臺,原來在安卓平臺里所有的setting到OpenHarmony里都變成了default setting。
這不利于我們將一個老的安卓應用快速遷移到新平臺,所以我們做了改進,在導入這些老項目的時候,當你切換OpenHarmony平臺,它會自動把安卓平臺這些texture settings全部寫到OpenHarmony平臺上。
其次,在這個版本里我們還做了很多系統接口的調用優化。因為在OpenHarmony早期版本里,很多系統接口并沒有在Native層開放,更多在TS層。跨語言調用一直以來都是一個性能開銷的大頭,在后面的這些版本里,OpenHarmony的SDK開放了更多Native接口,所以我們的引擎可以直接在C++層直接調用到它的Native接口。
這里列舉了其中的一些例子,例如DisplayInfo、Sensor、DeviceInfo等,頻繁地獲取一些與設備、系統交互的接口,然后從TS接口轉到原生接口,能夠大大地提升整體的調用效率。
最后,我們為了方便大家在打包項目的時候進行配置或者自定義,我們在這個版本中推出自定義支持Ability文件,這個ability就相當于安卓層面的activity。
以前如果你要去改一個UnityPlayerActivity,可能只能export project到安卓studio里改。但現在如果你已經有一個自己寫好的UnityPlayerActivity或者團結PlayerActivity,可以直接通過我們的Editor工具進行替換。
我們也支持了Module.json5,Module.json5也是OpenHarmony的一個配置文件,類似于安卓的Manifest,但是它沒有配置文件與配置文件中的合并功能,我們在Editor里把這部分功能進行了完善。大家可以通過我們的Editor方便地自定義這些平臺相關模板。
最后,我們在這個版本里也做了一個原來沒有的功能,就是支持命令行的傳參。
在這個版本里,我們可以通過hdc的命令,去hdc shell,然后aa start。這個命令行與安卓有點像,但hdc就像安卓的adb,命令其實都一樣。如果通過他們的DevEco Studio,即IDE工具,大家可以通過配置面板將這個啟動的命令行參數配置進去。
另外,在這個版本里,我們還針對VSync做了優化。
在早期的系統版里,VSync的支持比較弱,而引擎幀與幀之間的計算基本上還是依賴引擎,根據系統獲取的時間進行幀之間的時間運算。在新系統版本里,他們開放了更多VSync接口回調,我們把這一部分系統能力對接到了引擎里。所以我們能夠非常好地對齊系統的VSync信號。
這樣游戲在OpenHarmony平臺上幀率會更加平滑。從這張圖可以看到,30幀的時候,基本上每隔一個VSync就可以對應一個引擎的上頻。
此外,在之前的版本里,我們的游戲最多支持60幀,但是在1.5.0的版本上已經支持高刷了。
我們在新的版本里,可以支持高達90FPS或120FPS。開啟自定義繪制幀率很簡單,只要關閉垂直同步,設置targetFrameRate為90或者120,就能達到高刷幀率。如果targetFrameRate<0的話,它將使用跟安卓一樣的設置,默認是30FPS。
除此以外,我們在OpenHarmony平臺上對new input system進行了更加完善的支持,補全了之前部分缺失邏輯,特別在平板或者其他設備的輸入上。
最后,我們還有一個非常重要的更新,在OpenHarmony平臺上支持像安卓一樣的UAAL的模式,也就是Used As A Library。
這對于所有的應用開發者都是非常重要的功能,意味著我們可以很容易把一個3D引擎通過模塊化放到一些原生的應用上。
在OpenHarmony底下左邊有一個開發的tad視圖,右邊是一個編譯后的包視圖。我們在早期適配時,更多是直接粗暴地把我們所有代碼塞到一個Entry Module里,它基本上和所有的應用業務或邏輯都是混淆在一起的,這不利于原生應用的直接接入。
所以在1.5.0版本里,我們把這一塊單獨全部拎出來做了一個新的Module,叫TuanjieLib。
可以看到左邊是原有的結構,它基本上在entry module下,把所有東西都塞在里面。但現在我們除了entry module外,還有一個TuanjieLib module。有了這個Module,我們就可以直接把這一整塊Module拷到其他一些原生的3D應用里面去。
而且,我們已經把所有的控件都做了封裝和改進。對于所有的開發者來講,只需要把Module拷到原生的ability project里,并且在這個配置文件里把這個依賴加上,就可以在頁面index的ETS上直接把TuanjiePlayer View加上。這樣你就完成了一個3D player的接入,就能夠讓原生應用得到一個3D的能力。
最后,我們對ETS膠水代碼做了大量的重構,提供了更加便利的Module注冊方式。我們也有了更加統一的C#/ETS的跨語言調用。特別是我們在做ETS時,需要關注線程間的調用能力,因為我們的引擎是跑在另一條線程上的,它本身的UI又在一條UI線程上。從UI線程到我們引擎的主線程,中間會有非常多線程間的調用能力。
我們提供了一個叫POST_MESSAGE_TO_HOST和POST_MESSAGE_TO_WORKER。POST_MESSAGE_TO_HOST就是send message to host,host就是我們的UI或者main線程,指應用本身的主線程;send message to worker,這個worker就是我們的tuanjie main的線程。
接下來再介紹一下OpenHarmony專有的兩個Package。
第一個Package叫OpenHarmony SDK Kit Package,早期的SDK Kit的Package基本上只涵蓋登錄和游戲服務,涵蓋了API和推送。在最新版本的SDK Kit Package里,我們把包括消息通知、ADS的能力都完整地放到了SDK Kit Package里。所以大家如果想到這個平臺,但是TS、ETS對大家來講有一定的學習成本,可以下載這個Package,里面有我們封裝好的一系列C# API,也有一些內置的Demo Scene,可以通過這個Demo Scene快速完成這個平臺SDK的接入工作。
下面我們可以通過一個視頻來看一下,這是真機實錄的視頻。
看到的這些demo和樣例,都可以通過SDK Kit Package來提供,所以把SDK Kit Package裝到你的項目里,就可以把這些Demo Scene build出來,看到里面怎么樣使用C#接口,完成平臺的賬號登錄、內購、廣告、推送、消息提示等等能力。
另外一個專有的Package叫OpenHarmony Hilog Package。這個Package更多是針對開發者的,能夠通過Editor直連真機,在真機里面實時看log。
另外,如果出現閃退,我們可以提供一個工具幫你還原堆棧,同時還支持顯示實時內存占用,還可以抓取ArkUI的Dump。這個工具可以把整個應用UI的Layout都Dump下來,然后看到里面的Layout層級到底是什么樣的。
白色的都是我們最早的版本提供的能力,在新的版本里面,我們提供了Native Performance Tools的支持。我們把一系列這個平臺特有的真機profiling工具都集成在Editor里,可以拿到真實CPU的用量、電池的用量、GPU的用量等數據。
下面我們通過兩個視頻,來看一下OpenHarmony Hilog Package能做的事情。
第一個是直接連接真機,查看log,還支持篩選Bug level,支持自定義查詢。這里還有Stacktrace Utility,可以快速把一個閃退的堆棧進行還原,最后還有一個實時內存占用的工具,查看這一部分的內存狀況,而這些都是基于真機獲取的一些信息。
最后,這里面是dump出來的ArkUI的一個Dump,可以看到整個layout到底是怎么樣的。
下面一個視頻,展示了Hilog Package里面關于Native Performance的一些功能,它也需要連接真機,可以拿到Device name、電量、溫度、網絡等信息。同時還新增了一個Performance界面,可以將GPU Usage、GPU Frequency這些信息都抓取到,這意味著大家不用使用原生工具,就可以獲得同樣的體驗,而這些東西都在這個Package里可以使用。包括一些特定時刻的詳細數據,都能夠很詳細地展開。大家只需要在Package Manager里面搜索Hilog,即可下載體驗。
你們的聲音都很重要
對于OpenHarmony這個新平臺而言,或者說對于團結引擎而言,你們的聲音都非常重要,我們非常需要聽到你們的反饋。有了開發者的反饋,我們才能把我們的引擎、我們的工具做得更好。
所以這里我也把反饋的渠道告訴大家。
首先在官方社區里可以直接提問,上圖有網址鏈接,只要貼上OpenHarmony的標簽,我本人都會親自去看。
https://developer.unity.cn/plate/tuanjie-engine
另外,在團結的Editor里面選擇Help - Report a Bug也可以進行反饋。通過Report a Bug,可以把大家遇到的任何關于團結引擎的問題提給我們,我們會有相關的Q&A同學嘗試復現Bug。一旦能復現,我們就會在未來版本上快速把這些BUG修復掉。
我今天關于OpenHarmony平臺的分享就到這里,謝謝大家!