Unity项目接入渠道SDK启动黑屏问题跟踪定位

问题描述:通过正版Unity发布,接入一些渠道SDK,启动后没有闪屏黑屏很久。
我遇到的是Oppo黑屏很久。华为渠道包出现进游戏后有些图片黑掉不渲染。

扩展:使用Unity5.4.3p3版本开发。
母包:就是不接入渠道SDK的单独游戏包。
渠道包:按照渠道要求接入了SDK的包。
对于Android重写UnityPlayerActivity不熟悉的可以参考:
https://blog.csdn.net/h5q8n2e7/article/details/50484458
对Android的Activity不清楚的参考:
https://blog.csdn.net/tangcheng_ok/article/details/6755194

Ps:想直接看解决的拉到底看言简意赅部分。

问题分析:
1、分析oppo包和其他正常启动的渠道包的启动日志,发现oppo包启动有如下报错:
call to opengl es api with no current context
Unity GLSL link failed, no info log provided.
说明在游戏启动渲染Unity闪屏之前,渲染线程就被阻塞了。导致黑屏啥玩意看不到……

2、先查找网上的一些解决方法,做出了一波尝试:
1) Player Settings 中的设置问题。据说 Use-32-bit Display Buffer 这个选项会有影响。(取消了但是并无卵用)
2) 添加一个空场景进行跳转。(外国一个大佬说的)我们目前项目就是这样处理的但还是黑屏。
3) android 调用线程的问题。 可能是SDK初始化化处理线程或者调用函数出现了阻塞。.(经测试母包不会出现启动黑屏问题,又因为是个别渠道包有问题,所以怀疑这个可能性最大! ! )

3、我们假设是由于渠道SDK的一些初始化,会造成线程的阻塞,导致闪屏渲染失败。那么我们就必须先明白Unity应用在Android环境下启动,在闪屏执行前经历哪些步骤,因为只有闪屏前的步骤会造成阻塞,所以我们重点看Unity Awake前有哪些步骤。
Unity项目接入渠道SDK启动黑屏问题跟踪定位_第1张图片
如图(画的相对简单),Android环境下Unity应用启动之前会依次经历Application类OnCreate,继承于UnityPlayerActivity的自定义MainActivity的OnCreate(UnityPlayerActivity继承于原生的Activity),MainActivity的OnStart,然后Unity开始进行启动初始化。也就是说能阻塞Unity Splash渲染线程的操作大概率是在:Application::OnCreate、MainActivity::OnCreate、MainActivity::OnStart三个其中之一。

看了下我们的MainActivity的java代码, 果然在OnCreate的时候进行了“”客服SDK“”初始化,”UniWebView网页插件”的初始化,”UniSDK”的初始化(一般情况下UniSDK会对渠道SDK进行初始化)。
母包没有问题所以排除其他两个,猜测UniSDK初始化就是阻塞原因。在注释掉SDK初始化的测试包里果然有效果,华为的渠道包游戏启动有闪屏,正常了,但是oppo的依旧不行。

先说华为的,既然确定华为的渠道SDK初始化会造成线程阻塞,我们就需要延迟他的初始化位置,改为Unity Awake之后等待0.2秒进行,完美解决了黑屏问题。撒花。

4、oppo的还是黑,继续检查我们的MainActivity的OnCreate和OnStart,我们将所有代码全部注释,甚至将Unity Awake之0.2秒之后的SDK初始化都注释掉,可依旧是大黑屏。
显然,问题只能出在Application的OnCreate,oppoSDK给出的接入文档中要求在Application的OnCreate方法中对oppo的渠道资源进行init,而这个初始化会造成Unity的渲染阻塞导致黑屏。好吧……将这个初始化推迟到MainActivity的OnCreate中,问题解决。(这里如果还是不行可以将这个初始化移到Unity Awake阶段,保证渠道的初始化顺序和渠道要求的一样即可)。

5、后续优化,Unity启动之前仍然可能会有短暂的黑屏,原因是在Unity Awake之前在Android的OnCreate阶段的初始化占用了一些时间,解决方法可以在MainActivity的OnCreate里通过原生方法绘制一张加载图片,这个可以参考:http://www.manew.com/thread-98428-1-1.html

言简意赅:Unity启动黑屏解决1、检查日志是否有“GLSL link failed, no info log provided” 2、检查自己继承UnityPlayerActivity的OnCreate里的一些初始化方法是否是阻塞元凶,可以将初始化延后到Unity Awake阶段用过渡场景来做。3、如果还是黑屏则检查Application OnCreate里是否有初始化,有的话可以尝试延后到MainActivity的OnCreate甚至Unity Awake以后。

最后发现出现这种问题的渠道包,大多有个用户中心悬浮球啥的……

有问题欢迎大家指出谢谢。

你可能感兴趣的:(unity,Android,黑屏,渠道SDK)