接上篇《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
如此可在新进程中运行unity。
因为unity进程与flutter不在同一进程,所以通信的话,可能需要做一套跨进程通信。当前我们项目不涉及频繁通信,暂时没做,之后做得话会继续更新。
问题2:
公司的flutter工程使用了阿里云的开源播放器AliPlayer,完成第一个版本的开发之后,测试发现在华为的鸿蒙系统上AliPlayer播放异常。
解决过程:
开始时从unity方面入手排查问题,通过修改unity相关的打包配置来解决,经过多次尝试之后,发现此路不通。
之后在Aliplayer方面排查问题,发现是原生层的视频纹理外接到flutter层的这一步有问题,拉下来AliPlayer的源码查看,发现Aliplayer原生与flutter层的纹理是通过AndroidView承接,所以想到的解决办法是避开AndroidView,通过其他的方式将原生层的纹理外接到flutter。
解决方案:
使用Hybrid Composition 来实现原生纹理外接到flutter,具体的实现方式,这篇文章。
flutter项目中使用的webview插件,高德地图插件,一些其他用到AndroidView的插件,都可以通过次方法解决在鸿蒙系统上的使用异常问题。
之后会更新IOS打包问题的解决办法,敬请期待。