Unity-Android,游戏运行之后,总是在Pawered byUnity splash之后,先闪一下黑屏,再出现第一个加载的场景View。在logcat中看信息,发现,第一次开启的时候要创建一个openggl 的view,Creating OpenGL ES 2.0 context (RGB16 565 24/8),然后再做别的。闪黑屏的原因是在创建了OpenGL rendering context之后,直接就onDetachedFromWindow,然后自己又创建了一个OpenGL rendering context,Creating OpenGL ES2.0 context (RGB16 565 24/8 AAX2).闪黑屏就是因为context先被销毁,又创建了新的,之后都是在新的renderingcontext上做
的。
OpenGL知识:
要知道,在opengl es2.0中,opengl对窗口进行渲染之前,需要先创建一个rendering context(渲染环境)并且有且只能有一个。之后所有的东西都是应该在这个rendering context下渲染的。这个渲染环境定义好了opengl的环境配置,比如双缓冲还是单缓冲,有没有深度缓冲等。rendering context已经创建,再想改变环境配置值的时候,只能是销毁renderingcontext,再创建一个。
分析结论:
知道了这些之后,那么出现创建两次rendering context的原因肯定是Unity3d系统创建好了rendering context之后运行
脚本,但是在脚本中又动态修改了rendering context的环境配置值,导致系统只能先销毁旧的renderingcontext,再
重新创建新的rendering context。
在Unity3d中能够修改renderingcontext值的,一个是PlayerSettings,但是PlayerSettings要求只能是在Unity Editor下
运行。不要怀疑你自己的判断,肯定不是PlayerSettings的问题。另外一个是QualitySettings,没想到吧?因
为QualitySettings可以设置游戏的运行质量,也就是改变了opengl 渲染的初始设置以及其他渲染的规则,而且没有
说是非得在UnityEditor才能用。
在查找代码中的QualitySettings中,果然发现QualitySettings.SetQualityLevel赫然出现在代码中!!于是新建工程,
在script 的 Start()中加入QualitySettings.SetQualityLevel,发布新的android工程,查看log信息,果然出现了创建两
次 OpenGL ES 2.0 context 的现象!!!
后来,经过“全排列”测试,A包正常,B包创建两次 OpenGLES 2.0 context ,并且:
先安 后安 结果
A包 B包 创建两次
B包 A包 创建两次
所以,QualitySettings.SetQualityLevel此行代码影响重大。
(在原来的项目中是动态来设置QualityLevel的,现在需要改改了~~~~~~~)
最后,附上QualitySettings.SetQualityLevel的Unity官方文档
Note that changing the quality level can be an expensive operation if the newlevel has different anti-aliasing setting. It's fine to change the level whenapplying in-game quality options, but if you want to dynamically adjustqualitylevel at runtime, pass false to applyExpensiveChanges so that expensive changesare not always applied.
When building a player quality levels that are notused for that platform are stripped. You should not expect a given qualitysetting to be at a given index. It's best to query the available qualitysettings and use the returned index.