unity版本 4.3.1
为了减少发热量,我们游戏对分辨率进行的缩减,但在缩小的那一祯可以明显看到闪烁。
参考了一些文章,了解了下闪烁的原因:
1、在unity启动时默认是使用上层layout的width/height,游戏基本上都是全屏,所以上来就是全屏显示。
2、在unity中使用Screen.SetResolution,可以调整分辨率,反编译unity android层代码可以看到是调用了surface.setFixedSize,就是这里的原因,在调整期间会闪屏。
既然默认使用的是上层layout的width/height,我们直接修改上层的layout不就OK了?噢,不行,layout是指实际显示的分辨大小,我们的目标是指渲染的界面要小,然后通过缩放进行全屏显示。
所以只能使用surface.setFixedSize方法,那这样只需要在调整分辨前在main acitivity.onCreate方法中设置上就OK了。
查看了unityplayer.surcefaceview,发现是私有的。私有的也难不倒我们,直接使用反射取出私有变量。
需要同时在onCreate和onConfigurationChanged中修改。
修改完后发现触点和unity中的对应不上了,检查一下问题:
1、发现unity中触点是设置的缩小分辨率后对应的,但如果将竖屏和横屏切换一下,即可正确对应上,应该是在oncreate调整分辨率后还需要调整触点。
上述错误。经过很辛苦的查找,终于查找到原来是unity中提供的classes.jar有bug。反编译后,发现:
protected void triggerResizeCall() { Log.i("hack unity", "triggerResizeCall v:" + v + " w:" + w + " v:" + v + " w:" + w); this.nativeResize(this.v, this.w, this.v, this.w); }
这里第三个参数和第四个参数应该使用屏幕的大小,而不应该是使用分辨率的大小。坑啊。
找到原因就好处理了,hack掉unityplayer,重新提供一个triggerResizeCall,完美解决闪屏问题。
实际上调整分辨率闪屏还有很多更便捷的解决方法,比如unity的splash image设置为全黑,然后在第一个场景加载时,调用分辨率玩家就看不到闪屏了,反正都是黑的,在第一个场景调整完分辨后,再伪造显示一个splash image,哈哈。
附github:
unity classes.jar 反编译后的源码:https://github.com/zhukunqian/unity_java_4_3_1/tree/master
demo 代码:https://github.com/zhukunqian/unity_scale_resolution
参考文章:
1) http://stackoverflow.com/questions/7185644/android-opengl-crazy-aspect-ratio-after-sleep
2)http://android-developers.blogspot.it/2013/09/using-hardware-scaler-for-performance.html
0 条评论。