有关flutter外接纹理的优化(AndroidView和unity在鸿蒙系统上的不兼容问题)

1,321 阅读2分钟

接上篇《Flutter集成unity踩坑之旅》

当前公司的3D项目已经基本完成alpha版本,将要就行内部测试,从完成第一个版本,到现在的内测版本,中间也踩了一些坑,具体如下。

问题1:

上篇文章提到unity页面退出时的处理,当时的解决办法是在需要退出unity页面的时候,卸载掉场景资源,然后暂停unity播放器,这样做得话可以尽量的减少app的内存占用,但减少的内存也有限。

解决过程:

之前用的flutter_unity_widge插件,此插件的实现方式是通过PlatformView将unity视图纹理外接到flutter层。自己制作插件,通过在新进程中启动一个activity(android)的方式,可以在想要退出unity页面时直接结束新进程。

解决方案:

让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打包问题的解决办法,敬请期待。