关于Unity启动时间过长(启动黑屏时间长)的问题

来源:互联网 发布:西门子s7200仿真软件 编辑:程序博客网 时间:2024/04/30 10:15

转自:   http://blog.csdn.net/u012169685/article/details/52068809



关闭
从创业到再就业,浅述对程序员职业生涯的看法      征文 | 你会为 AI 转型么?      赠书:7月大咖新书机器学习/Android/python
 

关于Unity启动时间过长(启动黑屏时间长)的问题

 2763人阅读 评论(2) 收藏 举报
 分类:

好吧,Unity启动确实比其他引擎生成的游戏包慢些。关键是你启动的时候还要等上一段时间才显示Splash那个logo图。

最近项目有个蛋疼得需求,需要在启动界面加进度帧动画。。我也是醉了。

刚开始的思路:用Unity单独做个启动场景,让Splash那张图用成纯黑。那么问题来了,除了Unity刚启动的黑屏+显示Splash的黑图,再到显示loading动画界面至游戏场景加载出来,这时间都在十多秒以上了,。项目要求游戏从启动到显示游戏场景不能超过5秒。。哎。。太难为我了。好长一段时间都没能解决这个问题。

中间还想到一个方案就是用Android做一个插件的启动Activity场景,然后把这个场景设置成启动场景,之后再到Unity的场景。但是这个问题是无法绕过Unity的启动Splash。。无奈放弃。

因为不熟悉Android开发,所以。。。

我分析了Unity生成android,对就是从Unity的UnityPlayerActivity入手。既然绕不过,那就不绕过,思路:

1、Unity生成的Android应用必然要从这个UnityPlayerActivity启动,那么他的启动Splash view必然显示在这个activity里面;

2、那么我可以继承UnityPlayerActivity,然后在onCreate方法里面在创建一个view来覆盖Splash,是的。这是可行的。激动。。。。。。

3、那这个启动界面上我们也同样可以做动画咯,O(∩_∩)O哈哈~现在的问题是当Unity Splash显示完毕之后,或者初始化完成之后怎么来隐藏我们所创建的View和动画。

4、现在我们要在Unity建一个空场景用来加载我们的第一个游戏场景,当加载完成之后通知我们的自定义Activity移除我们创建的界面和动画,是不是很完美呢?

现在不用看黑屏了,也绕过了Unity的Splash,只是加载的时间还是比其他引擎慢了,不过也能接受,因为很快的 就开到了我们的启动动画界面,等待加载到游戏场景。

最后贴点代码上来。。。。

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.u3d.plugins;  
  2.   
  3. import java.util.Locale;  
  4.   
  5. import android.annotation.SuppressLint;  
  6. import android.content.Context;  
  7. import android.graphics.drawable.AnimationDrawable;  
  8. import android.media.AudioManager;  
  9. import android.media.AudioManager.OnAudioFocusChangeListener;  
  10. import android.os.Bundle;  
  11. import android.os.Handler;  
  12. import android.os.Looper;  
  13. import android.util.DisplayMetrics;  
  14. import android.util.Log;  
  15. import android.view.LayoutInflater;  
  16. import android.view.View;  
  17. import android.widget.ImageView;  
  18.   
  19. import com.unity3d.player.UnityPlayerActivity;  
  20.   
  21. public class MainActivity extends UnityPlayerActivity   
  22. {  
  23.     static final String TAG = "com.u3d.plugins";  
  24.     private ImageView bgView = null;  
  25.     private View view = null;  
  26.     AnimationDrawable animationDrawable = null;  
  27.       
  28.     @SuppressLint("NewApi"@Override  
  29.     protected void onCreate(Bundle arg0)   
  30.     {  
  31.         super.onCreate(arg0);  
  32.                   
  33.         bgView=new ImageView(this);  
  34.         String lanStr=Locale.getDefault().getLanguage();  
  35.         String bgName="splash_bg_en";  
  36.         if(lanStr.equals("zh"))  
  37.         {  
  38.             bgName="splash_bg_zh";  
  39.         }  
  40.         Log.d(TAG, "System Lan:"+bgName);  
  41.         int splash_bg=getResources().getIdentifier(bgName, "drawable", getPackageName());  
  42.         bgView.setBackgroundResource(splash_bg);  
  43. //      this.addContentView(bgView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
  44.         mUnityPlayer.addView(bgView);  
  45.           
  46.         DisplayMetrics dm = new DisplayMetrics();  
  47.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  48.         float scaleX=dm.widthPixels/1024f;  
  49.         float scaleY=dm.heightPixels/600f;  
  50.         Log.d(TAG, "Screen Width:"+dm.widthPixels+";Screen Height:"+dm.heightPixels);  
  51.         LayoutInflater flater = LayoutInflater.from(this);   
  52.         int layoutID=getResources().getIdentifier("activity_splash""layout", getPackageName());  
  53.         view = flater.inflate(layoutID, null);  
  54.               
  55.         int frame_id=view.getResources().getIdentifier("splash_frame""id", getPackageName());  
  56.         ImageView frameView=(ImageView)view.findViewById(frame_id);//new ImageView(this);  
  57.         frameView.setBackgroundResource(R.anim.splash_gif);  
  58. //      this.addContentView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
  59.         mUnityPlayer.addView(view);  
  60.           
  61.         frameView.setScaleX(scaleX);  
  62.         frameView.setScaleY(scaleY);  
  63.           
  64. //      frameView=new ImageView(this);  
  65. //      frameView.setBackgroundResource(R.anim.splash_gif);  
  66. //        
  67. //      LinearLayout ll=new LinearLayout(this);  
  68. //      LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);  
  69. //      params.leftMargin=scaleX*620;  
  70. //      ll.setLayoutParams(params);  
  71. //      ll.addView(frameView);  
  72. //      mUnityPlayer.addView(ll);  
  73.           
  74.         animationDrawable = (AnimationDrawable) frameView.getBackground();  
  75.         animationDrawable.start();  
  76.     }  
  77.     public void HideSplash()  
  78.     {  
  79.         Log.d(TAG, "HideSplash");  
  80.         new Handler(Looper.getMainLooper()).post(new Runnable()  
  81.         {  
  82.             @Override  
  83.             public void run()  
  84.             {  
  85.                 Log.d(TAG, "HideSplash run");  
  86.                 animationDrawable.stop();  
  87.                 mUnityPlayer.removeView(bgView);  
  88.                 mUnityPlayer.removeView(view);  
  89. //              ((ViewGroup)bgView.getParent()).removeView(bgView);  
  90. //              ((ViewGroup)view.getParent()).removeView(view);  
  91.                 bgView=null;  
  92.                 view=null;  
  93.                 animationDrawable=null;  
  94.             }  
  95.         });  
  96.     }  
  97.     @Override  
  98.     protected void onRestart() {  
  99.         // TODO Auto-generated method stub  
  100.         super.onRestart();  
  101.         Log.d(TAG, "onRestart");  
  102.         new Handler(Looper.getMainLooper()).post(new Runnable()  
  103.         {  
  104.             @Override  
  105.             public void run()  
  106.             {  
  107.                 muteAudioFocus(MainActivity.this,true);  
  108.             }  
  109.         });  
  110.     }  
  111.     @Override  
  112.     protected void onResume() {  
  113.         // TODO Auto-generated method stub  
  114.  &
阅读全文
0 0
原创粉丝点击