unity学习笔记-有关打包到安卓开机黑屏时间过长的心得

有关打包到安卓开机黑屏时间过长的心得

如题:在项目中发现打包到安卓机运行的时候,总是会有一段黑屏时间很长的等待,同事觉得这个体验很差,于是我们花了一个上午的时间基本解决了这个问题,也对unity有了更深的理解

解决方法

急的bro可以直接看这里,解决方法网上有很多,大家可参考他们的方法去进行优化,我们发现的解决方法可能和大家的不太一样

一句话就是,把加载的方法写在一个协程里面,然后放在mono生命周期里的start方法

过程

我们做了一些尝试
1比如优化resources里面的资源,优化到了只有几兆,但黑屏时间还是很长(也可能缩短了几毫秒吧,基本感觉不出来差别)
并且把这个项目的resources和之前的项目做了对比,发现上个项目有30多兆,但启动一点也不卡,于是基本可以诊断不是resources的问题

2然后我试着修改了代码逻辑,因为猜测可能是协程太多导致的卡顿,而且通过debug发现黑屏的时候协程的方法是有在执行的,但是加载的界面却一直不出现
之前加载下一场景和获取用户登录信息是通过两个协程分开执行的,如图在这里插入图片描述

后面我把获取用户登录信息的方法放在了加载下一场景的方法里面,如图
在这里插入图片描述

运行发现还是出现了漫长的等待时间

3紧接着我尝试了在不同的生命周期中放入加载下一场景的方法,一开始是放在awake中,后面尝试放在了start.发现这个方法快了很多(不同的机子差异比较大,我的高通870和同事的麒麟970差距在4~5s,而且是有时候很快,有时候还是会有一段等待时间)

4最后我尝试着把加载的方法放在协程里面,然后再在Start方法里执行,如图
在这里插入图片描述

这么一整发现基本没有了卡顿的现象,加载界面也能够正常的显示和运行,然后查看了一下unity的生命周期表
在这里插入图片描述
大概的猜想是awake方法是优先于一切的,并且加载界面的脚本是放在场景中的第一个物体,因此脚本里涉及到的物体都还没有加载完成,需要等待其他物体加载完(包括加载脚本里关联依赖的物体),然后才执行对应的方法
因此将方法放置在start中,黑屏的现象会得到一定的改善,但还是会时不时出现黑屏的现象
并且和同事讨论的时候还有一些问题不太确定,比如为什么在start方法里直接调用普通方法(普通方法里包含协程方法)打包安卓会出现黑屏,但用一个协程包住这个普通方法再打包黑屏的现象就没有了
个人的猜想是方法里协程的调用是引用了其他脚本的方法,也许黑屏的时间就是在加载这些脚本,这些脚本当通过被协程包住之后他就是单独的线程去进行加载,不会影响到场景界面的加载,并且在后面的主场景中也发现了这个问题(同事的意见是该脚本并不大,应该不至于出现黑屏,并且是6~7s的黑屏)
当然上面说的问题还没有确切的结论(本着解决问题为首,原因可不深究,问就是程序和我其中一个能跑就行),如果有大佬知道的话请务必在评论区写下你的回答

在这里插入图片描述

同天下午更新一下,和同事又讨论和尝试了一下(没错,我们不是在划水),发现关键的不是在外面包协程的问题,而是在加载场景的协程的方法里,需要在一开始就写上yeild return (这里null也行,new waitforsconds也行),给我的感觉就是在告诉程序,这里开始走协程,当然实际也是这样,但是我return的是null或者0s他都能够不出现长时间黑屏,所以yeild return感觉更多的像是一个标识符,而在这之前的协程里的方法和代码都还是得一步一步走,或者说在程序刚开始启动的时候协程的逻辑是混乱的,可能一开始都是同步的逻辑,后面有了yeild return才开始有了协程的逻辑,又或者说scenemanager.loadsceneasync这个方法是个假的异步,在加载下一场景的多少百分比之前都是同步的加载后面才开始真正的异步,这才导致的开机黑屏时间过长,因为除了在加载当前场景资源,也在同步加载下一场景资源
感觉没有更深了解的机会,官方文档对方法和类的说明太简单了,源码也不好深究.只能到这了.

猜你喜欢

转载自blog.csdn.net/pure81/article/details/126031947
今日推荐