Unity3d-Android 1s短暂黑屏(原因: 两次Creating OpenGL ES 2.0 context (渲染环境))

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.

 

 

 


你可能感兴趣的:(unity)