最近在做一个VR眼镜项目,台北那边反应App第一次启动有很长的黑屏时间,然后才跳转到Unity3D Splash画面,需要解决。
其实这个还是很奇怪的,我尝试了一下以前的Unity3D项目,发现启动直接就是Unity3D Splash画面。不知道是不是Unity3D更新版本后做了什么变动。
仔细查看了一下,现在Unity3D App第一次启动时,会首先在Android/Data/包名下面缓存Shader Cache,大概有80-90个文件。之后启动,将会很快到到Unity3D Splash画面。但如果手动将Shader Cache删除,则启动依然会有很长时间黑屏来写入Shader Cache。
这个应该就是黑屏时间长的原因了。虽然我在当前设备上测试第一次也就大概3秒左右,可台北反映有10秒以上...
大概是设备的差异,但问题还是要解决的。
这个问题需要我们写Android的插件,然后自己手动将Unity3D Splash覆盖掉。
代码如下:
public class MainActivity extends UnityPlayerActivity {
private ImageView bgView;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
try {
bgView = new ImageView(UnityPlayer.currentActivity);
bgView.setImageResource(R.drawable.loading);
bgView.setScaleType(ImageView.ScaleType.CENTER_CROP);
mUnityPlayer.addView(bgView, getRealWidth(), getRealHeight());
} catch (Exception e) {
e.printStackTrace();
}
}
public void hideSplash(){
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run()
{
mUnityPlayer.removeView(bgView);
bgView=null;
}
});
}
在这里我只是简单的增加了一个ImageView,将整个画面覆盖,我们需要在Unity3D的Scene中将这个ImageView移除掉,来显示我们的3D场景。当然,这个启动界面你可以显示Gif或者其他自定义内容,来让效果看的更好。
void Start () {
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic ("currentActivity");
jo.Call ("hideSplash");
}
这样就能勉强解决这个问题了。
希望Unity后续版本能够改进这个问题,不过当前Unity3D支持的Android最低版本已经变更为Android 4.1了,大概也在进行Android旧设备的淘汰了。
文章评论