UUG 广州站 | 全面支持OpenHarmony,团结引擎共建游戏新生态

文摘   科技   2024-04-12 19:38   上海  

2024 年 3 月 31 日,在 Unity User Group 广州站上,Unity 中国高级技术经理刘伟贤进行了《全面支持 OpenHarmony,团结引擎共建游戏新生态》的内容分享,介绍了团结引擎在 OpenHarmony 上的最新进展。

本文为演讲全文记录,请点击文末阅读原文下载 PPT。

刘伟贤:大家下午好!我是来自 Unity 中国的刘伟贤,目前在 Unity 担任高级技术经理,今天带来的分享是我们的团结引擎最近在 OpenHarmony 上面的一些内容。

OpenHarmony 是一个由开放原子基金会进行管理的开源项目,开放原子基金会是由华为、阿里、腾讯、百度等等 10 多家互联网企业共同发起和组建的基金会。OpenHarmony 是华为捐赠的 HarmonyOS 系统基座能力,从 HarmonyOS2 开始,HarmonyOS 就是基于 OpenHarmony 做开发的、面向多种全场景智能设备的商用版本,因此 OpenHarmony 实际上是鸿蒙操作系统的一个基座。团结引擎也是专门为国内的开发者开发的引擎,所以我们也会加紧本地化的步伐,全面适配 OpenHarmony 的各项能力。除了 OpenHarmony 以外,我们也会适配更多国产的操作系统跟硬件,包括我负责国内车机相关平台。
这张图可能会更加清晰地表达出这几个系统的关系:我们支持 OpenHarmony 以后,很多开发者会直接拿着 HarmonyOS 的设备在团结引擎上面用,然后发现怎么都跑不起来,所以这里就是额外加了一页,表示 OpenHarmony 是一个鸿蒙底座的内核系统,它是开源的。HarmonyOS 是 OpenHarmony 加 AOSP 的集合体,它是一个商用版本,所以它不是开源的。即将到来的 Harmony OS NEXT,也就是网上所说的“纯血鸿蒙”的版本,它会把 AOSP 这部分去掉,然后完全基于 OpenHarmony 的这个基座打造一个商用版本。

看一看整个团结引擎适配 OpenHarmony 的时间轴,可以发现,我们在去年很早的时间节点就开始做适配工作。我们从 2023 年的 3 月份就开始做,7 月份的时候我们有一个 SDK 的 3.2 版本,到了 9 月份,我们就已经有一个 4.0 的 beta,到今年的 1 月 1 日,我们跟随着团结引擎创世版 1.0.0 的版本发布出去,OpenHarmony 这个平台的适配具备了整个系统的全能力。前两天,我们发布了团结引擎的首个技术大版本的更新 1.1.0,也是在 OpenHarmony 这个平台上持续迭代,跟进他们的 SDK 升级,修复了非常多的问题。

下面是一些客户的适配成果,目前已经在适配的客户远不止这四个。这些都是在手机上面实录的视频,从这个画面可以看得出来,整体的性能、画面都是跟安卓完全一致的。这里面有些是比较老的项目,比如说《倩女幽魂》、《诛仙》,有些是很新的项目,上线没多久。团结引擎在适配原有项目的兼容性上面是没有问题的,所以团结引擎可以快速帮大家拓展到 OpenHarmony 这个平台,以及未来的 OpenHarmonyNEXT 平台。

简单介绍一下 OpenHarmony 的适配流程,这张图看起来内容很多,但对于开发者来说,只有上面的部分需要做,因为不论是 SDK,还是引擎的适配,还是系统层,这些东西都会由我们来帮大家全面解决。大家需要做的就是把原有项目客户端的逻辑适配,还有一些第三方适配一下,如果是我们的原来客户,可能会有定制化引擎的,需要针对定制的部分做适配。SDK 的部分由游戏中心的相关同事提供,引擎部分由我们全面支持,引擎的适配部分已经把系统的适配层完全打通了。

OpenHarmony 平台支持发布以后,我们收到最多的问题,第一个就是环境配置问题。首先 OpenHarmony 的 SDK 下载可以去这个链接,在文档底下就可以找到 SDK 的下载。下载 SDK 以后,直接配到 AIK 里面就好。
除了这个网站以外,DevecoStudio 也提供了 SDK 下载,目前团结引擎的 1.1.0 版本是支持 API 的,所以大家如果再去下载 SDK 的时候,一定不要下载 9,一定要下载 10,而且不要下载 11,因为 11 应该还没有正式 release。大家如果下了 DevecoStutio 的话,在它们的 SDK manager 里面也能下到 API 10。
接下来就是在团结引擎 Editor 里面的配置,对于 OpenHarmony 这个平台来讲,最主要配置有三个部分,第一个部分就是 OpenHarmony SDK,也就是我们怎么在它们的网站里面下载,或者说是通过它们的 DevecoStutio 去下载。第二个就是 LoadGS 的环境,最后一个就是很熟悉的,安卓平台都会用到的一个 JDK。这里面可能有一个红线,在配置 OpenHarmonySDK 的时候一定要配置到 10 这一层目录,这样团结引擎才能把 API LEVEL 读出来。它可能还不能在 SDK 里面直接读取 API LEVEL,所以目前都必须要通过这条路径来提取当前它到底是 API LEVEL 几。接下来就是在团结引擎Editor里面的配置,对于OpenHarmony这个平台来讲,最主要配置有三个部分,第一个部分就是OpenHarmony SDK,也就是我们怎么在它们的网站里面下载,或者说是通过它们的DevecoStutio去下载。第二个就是LoadGS的环境,最后一个就是很熟悉的,安卓平台都会用到的一个JDK。这里面可能有一个红线,在配置OpenHarmonySDK的时候一定要配置到10这一层目录,这样团结引擎才能把API LEVEL读出来。它可能还不能在SDK里面直接读取API LEVEL,所以目前都必须要通过这条路径来提取当前它到底是API LEVEL几。接下来就是在团结引擎Editor里面的配置,对于OpenHarmony这个平台来讲,最主要配置有三个部分,第一个部分就是OpenHarmony SDK,也就是我们怎么在它们的网站里面下载,或者说是通过它们的DevecoStutio去下载。第二个就是LoadGS的环境,最后一个就是很熟悉的,安卓平台都会用到的一个JDK。这里面可能有一个红线,在配置OpenHarmonySDK的时候一定要配置到10这一层目录,这样团结引擎才能把API LEVEL读出来。它可能还不能在SDK里面直接读取API LEVEL,所以目前都必须要通过这条路径来提取当前它到底是API LEVEL几。接下来就是在团结引擎Editor里面的配置,对于OpenHarmony这个平台来讲,最主要配置有三个部分,第一个部分就是OpenHarmony SDK,也就是我们怎么在它们的网站里面下载,或者说是通过它们的DevecoStutio去下载。第二个就是LoadGS的环境,最后一个就是很熟悉的,安卓平台都会用到的一个JDK。这里面可能有一个红线,在配置OpenHarmonySDK的时候一定要配置到10这一层目录,这样团结引擎才能把API LEVEL读出来。它可能还不能在SDK里面直接读取API LEVEL,所以目前都必须要通过这条路径来提取当前它到底是API LEVEL几。

Editor 的环境配置好了以后,就可以开展我们的 OpenHarmony 适配工作,整个 Editor 的工作流跟原来比较接近,我们只是在这个界面多出来一个 build target,叫做 OpenHarmony。跟原来的工作流是完全一致的,你只要用团结 hub 打开团结引擎,然后打开原有的项目,进去以后切换平台,然后你就可以切换到 OpenHarmony平台。

跟安卓一样,它也支持导出原生的工程,这里导出的是 DevecoStutio 的 Ability Project。除了这种导出到原生的平台去做开发以外,它也支持一键打包出 HAP,这个 HAP 就相当于安卓平台的 APK。同时我们也支持设备直连的方式,都是极大方便了大家去做开发的。

除了这些以外,针对 OpenHarmony 平台也有一些专有的配置项,包括 Graphics、Quality 等等,这些都跟原来是一模一样的,里面的选项也是和安卓的基本相同。

这张图是我们在团结 Editor 里面,一个 Project 大概的样子,以及用他们的原生工具 DevecoStutio 打开的样子。大家可以去关注一下这个图里面的东西,可能大家都会很熟悉,有一个叫团结 Ability,都是一一对应的。这里面的 Resource 等等,都是原有的资源。我们的内部也放在这里面。当然它里面的这些代码,可以看到它是以 ts 后缀的,所以它肯定不是 Java 代码,这些也是比较大的差异,但是从整体的目录的结构来看,还是跟原来的安卓非常接近的。

如果做过安卓开发肯定会知道,离不开的一个东西叫 ADB,在 OpenHarmony 上面也有一个类似 ADB 的东西,叫 HDC。这里面的这些命令看上去就跟 ADB 很像,不一样的只有 file send 跟 file recv,就是我们去发文件跟拉文件。如果再去做 OpenHarmony 平台开发的时候,这个工具可能大家都离不开。这里面就帮大家列举出来,让大家快速上手。

接下来介绍一下团结引擎在 OpenHarmony 上面的能力。整体的架构还是跟安卓比较接近,我们的引擎线程跟 UI 线程是分离的,这里可能会跟安卓不大一样,安卓是在 java 程序创建一个线程,我们现在是在 ts 创建 worker.ThreadWorker,把线程给创建起来。还有我们的引擎 Loop,在安卓上,这个 Loop 是在 Java 驱动的,然后从 Java take 进去。在 OpenHarmony 上面,是通过 libuv 事件驱动,在 native 层自己去 take 的,也会有一些细节上的差异。当然,它们都支持单线程渲染跟多线程渲染。

在渲染能力上,目前我们支持内置渲染管线及 URP,然后支持 OpenGLES3.X,Vulkan 我们已经适配完成,但是我们还在做更多的兼容性相关测试,相信很快Vulkan 的支持应该也会推出。纹理压缩格式基本也是跟安卓一致的。

文件系统跟安卓比较接近,但是里面的细节还是有点不同。跟安卓一样,文件也是分成包内文件和包外文件。比如安卓一个 APK 装到手机里面叫 base.apk,你要从里面读取一些文件,写到外部目录,它是放在外部目录的。在 OpenHarmony 上面也是一个压缩包,它叫 hap,安装完以后,文件都是是以一个压缩包的方式放在系统里面的,它并没有把这个压缩包里面的所有文件提取出来,所以它的文件读写是跟安卓一样的,没有办法直接去读写包内的文件,如果要读写包内的文件就必须要通过 WWW、UnityWebRequest 等等这些接口去读取,当你读取到这些文件后,写到外部目录去,比如写到 SD 卡的目录区,或者说写到外部存储目录区以后,API 就可以按之前的使用方式正常使用。
这里面 OpenHarmony 在适配的过程中,已经把 Application 底下的这些路径变量全部都映射成了 OpenHarmony 底下的一个应用的沙箱。
音视频能力,音频目前已经使用的 ts,后面在 API 11 以后,系统会提出来一个叫 Audio,是他们对标安卓的 Audio 原生实现,未来也会跟进这个 Audio 的适配。音频相关的如 Wwise,或原生的插件,目前是需要重新编译的,如果你的音频本身不是使用团结引擎默认的音频系统,是自己使用的外部第三方插件的话,这一部分可能需要用 OpenHarmony SDK 重新去编译第三方库。
视频的支持有两种方式,一种是原生的ts的接口以及这种硬解码,ts 层类似于 video player,这个组件跟 java 一样,它提供的是原生的 ts 结构去播放视频,通常用于全屏画面的视频播放,比如在引擎启动的时候通过 video player 播一个开屏视频。native 层是对 video player 进行硬解码,然后获得视频画面,可以放到 3D 世界里面进行渲染。同样的,如果你使用的是第三方插件也是需要自己重新编译的。

关于脚本能力,刚刚我们提到了它的脚本语言不是 java,它是 ts,所以我们为 OpenHarmony 这个平台重新设计了一套 C# 与 ts 交互的代码,从 C# 层到 native 层是通过 .Napi 支持的。

我们也做了很多的差异化的地方,比如由于 ts 没有像 java 那样有反射的作用,所以它目前只能通过一个导出行为来告诉引擎到底导出了哪些对象,C# 端可以怎么去使用。就会需要有一个 ts 内部的文件,导出对象给 C# 使用,比如说我有一个文件叫 TestClass.tslib,底下就必须有一个方法叫 RegisterTestClass,跟它的文件名是一一对应的,这么一个函数,函数里面就是一个 Dictionary,可以把要导出到 C# 的一些对象给它,剩下的就可以通过 key 的字符串,从 C# 里面拉到这个对象去使用,这里跟安卓有一个比较大的差异。

比如,C# 提供了 OpenHarmonyJSClass,用来直接调用 Static Function,也是跟安卓 JavaClass 有点相似,并且也提供了一个 OpenHarmonyJSObject,用于 ts 导出对象的表示。

面这张图就是一个导出的对象,这里面的这两块代码就是 C# 的代码,我们通过 key,比如 StaticClassTest,就可以获取导出的对象,然后去 Call 它的 Function,这个就是一些比较简单的例子。

这个 C# 导出的对象还可以直接调用系统 API,比如一个导出的对象,是一个 sensor,这个 sensor 的对象实际上是从系统侧拉过来的,我们在 C# 里面就可以利用 OpenHarmonyJSObject 把这个 key 拉进去,然后就可以 Call 它的 Function,这个 Call 也是个系统的 Function。

同时,我们在 C# 侧提供了一个 OpenHarmonyJSCallback 用于支持异步接口回调,所以我们可以在 C# 里面利用 OpenHarmonyJSCallback,把一个 Callback 丢进去,然后再调用它的系统的方法,这时候就可以把 sensor 相关的一些数据通过这个回调拿回来,去获取数据,看起来也是比较简单的串一个字符串。

除了刚刚提到的 OpenHarmonyJSClass,OpenHarmonyJSObject,OpenHarmonyJSCallback 以外,针对一些特殊的数据格式也做了支持。比如 OpenHarmonyJSArrayBuffer,我们提供这个 JSArrayBuffer 是方便大家可以在 C# 里面进行操作。这里有一个简单的例子,它调用了一个系统接口去 open,fs 是它的系统导出的一个对象,然后 OpenFlie 是它们系统的一个方法,就是把 C# 里面的内容直接写过去。

针对 Profiler 这一块,目前的内置 Profiler 也是跟原来一样的,这些都支持 OpenHarmony 并且真机可用。除了这些以外,也提供了一些平台相关的 Profiler 以及抓帧工具,他们的工具叫 SmartPerf,可能要去申请才能得到这个工具,如果在 OpenHarmony 上面出现了一些性能问题,或者说画面渲染问题,都可以通过这个工具去抓,它是多合一的集合。

SmartPerf 里面有一个东西叫 hitrace,熟悉安卓的也知道 hitrace 是一样的。这里也会把我们的 Profiler tag 全部输出到 SmartPerf 里面,所以如果想要用以前的 trace,去抓各个线程的状况,只需要在团结里面打开,重新出个包,然后就用他们的工具去抓就可以了。


除此以外,比如说权限相关的部分,现在这里面展示的只是一个代码,包括我们是怎么去 request 这些 User Permission,之后的一些 callback 到底是怎么样的,包括我们现在支持的 Permission 是哪些。当然这里面只是展示了一个部分,详细内容可以上团结的 manual 里面看,指引大家先把一些权限配置好,然后再从代码里面提取。


系统服务的部分,除了刚才提到的权限,还有一些位置服务、sensor 等等,包括大家比较常用的屏幕息屏这些接口,Url 等等这些都已经完全支持了。

最后,针对 OpenHarmony 我们会深入去讲他们这个平台特有的技术细节。这张图是一个应用模型,在团结引擎去适配 OpenHarmony 的时候,我们采取的是 Staging 的模型。整个团结引擎里面在适配过程中打交道最多的就是 UIAbitity,它就相当于安卓的 Activity,这中间会提供一些应用的事件回调,简单来说就是告知引擎是否在前后台,是否退出这些回调。

这里面会有一个叫 ArkUI 和 XComponent,ArkUI 是方舟开发框架,为OpenHarmony 应用的 UI 提供了一个基础设施,通过比较简洁的语法就可以写一些简单的 UI。XComponent 用来存着 Tuanjie Player,底下还会有一个团结Webview,还有 video player,它就是一层一层的声明式 UI。
可以看到在 Ability 里面最关键的就是上面那个 XComponent,它是用来做 EGL 或者是 OpenGLES 的媒体数据写入的,并且用来作为一个载体,显示在它上面。XComponent 的类型分成三种,一种叫 Service,一种叫 Component,还有一种叫 Texture,这里的 XComponent 可以理解为安卓的 Texture view 或是 surface view 的集合体。

文件系统,出于一些安全考虑,他们有一个文件沙箱,文件沙箱会有一个路径的映射,就是它的真实物理路径跟你获取到的应用路径有一定的对应关系,你没有办法真正去获取得到一个真实的物理路径,只能获取到它应用沙箱里面的路径。如果通过 HDC 的工具进到手机去查文件,有可能写文件的时候写的是一个应用的路径,但是查文件的时候要查一个实际的物理路径。这里面有一些不同就是加密类型,放的一些文件也不太一样。

最后,在适配过程中比较关键的点就是 Napi。Napi 是作为代码连接的非常重要的桥梁,因为引擎本身是用 C++ 来写的,但是外面的很多都是 ts 的代码,所以 ts 跟 native 的交互基本上就是通过 Napi 进行的。如果想要去看这些内容,导出一个 project,然后可以看里面的 ts 代码,就可以看到有很多类似 import 一个内容,然后调入到 C++ 里面去。
最后介绍一下我们在 OpenHarmony 上面的 Roadmap,首先我们会计划升级 API 11,如果遇到的话,可以先暂时忽略这个问题,比如文件系统会更改,目前超过 2G 的文件可能在他们的系统上卡死,所以如果打目录里面的资源,一定要注意单个文件有没有超过 2G。
当然这里面没有提到 vulkan,因为 vulkan 适配工作已经做完了,我们一直在试它的兼容性和稳定性,vulkan 支持性已经放出了,但是现在标记的是一个预览版,我们并没有把它作为一个正式版在团结里面放出去,未来应该很快就可以把它丢出去了。

长按关注

Unity 官方开发者服务平台

第一时间了解 Unity 社区动向,学习开发技巧


 点击“阅读原文”,下载演讲 PPT 


Unity官方开发者服务平台
Unity引擎官方开发者服务平台,分享技术干货、学习课程、产品信息、前沿案例、活动资讯、直播信息等内容。
 最新文章