2024 年 3 月 31 日,在 Unity User Group 广州站上,Unity 中国高级技术经理刘伟贤进行了《全面支持 OpenHarmony,团结引擎共建游戏新生态》的内容分享,介绍了团结引擎在 OpenHarmony 上的最新进展。
本文为演讲全文记录,请点击文末阅读原文下载 PPT。
刘伟贤:大家下午好!我是来自 Unity 中国的刘伟贤,目前在 Unity 担任高级技术经理,今天带来的分享是我们的团结引擎最近在 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 的部分由游戏中心的相关同事提供,引擎部分由我们全面支持,引擎的适配部分已经把系统的适配层完全打通了。
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 的支持应该也会推出。纹理压缩格式基本也是跟安卓一致的。
关于脚本能力,刚刚我们提到了它的脚本语言不是 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,这中间会提供一些应用的事件回调,简单来说就是告知引擎是否在前后台,是否退出这些回调。
文件系统,出于一些安全考虑,他们有一个文件沙箱,文件沙箱会有一个路径的映射,就是它的真实物理路径跟你获取到的应用路径有一定的对应关系,你没有办法真正去获取得到一个真实的物理路径,只能获取到它应用沙箱里面的路径。如果通过 HDC 的工具进到手机去查文件,有可能写文件的时候写的是一个应用的路径,但是查文件的时候要查一个实际的物理路径。这里面有一些不同就是加密类型,放的一些文件也不太一样。
长按关注
第一时间了解 Unity 社区动向,学习开发技巧
点击“阅读原文”,下载演讲 PPT