邪修之冷启动优化
最近换了新的工作,遇到一个关于Unity 3D应用冷启动优化的问题,发现还有这种邪修的方式。
这是一个车载项目,客户提出问题,一个U3D的应用首次启动时间要5秒才能看到内容,客户忍不了,要求优化。
- 仅首次冷启动时间过长,一旦U3D的内容加载完成,再次启动无延迟。
- U3D方提出,我们已经优化的很完善了,我们在手机上测试冷启动只要2秒。
- 受限于车机性能,在车机上App什么都不做,启动后仅加载U3D内容,仍然需要5秒。
- 项目设定,APP进程开机自启动,但U3D仅通过应用的Activity内集成显示,即只有Activity启动后才会开始加载U3D的内容。
基于以上设定,关于App的冷启动优化似乎没什么常规方式好用了,也尝试了开机后将Activity修改成1像素窗口启动,也不好用。
后来从别的项目借鉴到了堪称邪修的方式:开机自启后创建虚拟屏,将U3D的Activity投射到虚拟屏上,当用户启动应用时,U3D的内容已经加载完毕了。
创建的虚拟屏是用户看不见也摸不到的,之前没接触过虚拟屏,我是第一次了解到虚拟屏还能这么用。后来在这工作了一段时间,发现车载项目虚拟屏很是常用。
当时还是遇到了一些问题,App自己创建的虚拟屏,无法加载U3D的内容,只有FW创建的才可以。 后来经过我调查发现,App创建的虚拟屏获取不到焦点,不会走onWindowFocusChanged回调, 而U3D只有在有焦点的时候才会开始加载。
后来定下来的方案便是App自己创建虚拟屏投射,并在虚拟屏上时主动调用一次不会走onWindowFocusChanged加载U3D内容,反正在虚拟屏上时也不真正的需要焦点。
这个问题就这么解决了。
再后来我又接触到了其他项目,发现U3D可以做到将内容提前投射的Surface上,然后Activity启动时再加载这个Surface上的内容。
之前也不了解原来U3D还可以这么做,不需要非得绑定Activity的View。真的是我见识少,好久每接触过车载项目了,对我来说这两个方法真算得上邪修。