android view SurfaceView GLSurfaceView的关系和区别

 Android游戏当中主要的除了控制类外就是显示类View。SurfaceView是从View基类中派生出来的显示类。android游戏开发中常用的三种视图是:

 viewSurfaceViewGLSurfaceView的区别如下:

 

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢

SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。

 

GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。

 

在2D游戏开发中,大致可以分为两种游戏框架,View和SurfaceView。

 View和SurfaceView区别:

    View:必须在UI的主线程中更新画面,用于被动更新画面

     surfaceView:UI线程和子线程中都可以。在一个新启动的线程中重新绘制画面,主动更新画面。

 

UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步,涉及到线程同步。

所以基于以上,根据游戏特点,一般分成两类。

1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。

2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制

 

下面是使用sufaceView一个基本的框架:

使用的SurfaceView的时候,一般情况下要对其进行创建,销毁,改变时的情况进行监视,这就要用到 SurfaceHolder.Callback
 

[java]  view plain copy print ?
  1. import android.app.Activity;    
  2. import android.content.Context;    
  3. import android.graphics.Canvas;    
  4. import android.graphics.Color;    
  5. import android.graphics.Paint;    
  6. import android.os.Bundle;    
  7. import android.view.SurfaceHolder;    
  8. import android.view.SurfaceView;    
  9.     
  10. public class TestSurfaceView extends Activity {    
  11.     /** Called when the activity is first created. */    
  12.     @Override    
  13.     public void onCreate(Bundle savedInstanceState) {    
  14.         super.onCreate(savedInstanceState);    
  15.         setContentView(new MyView(this));    
  16.     }    
  17.         
  18.     class MyView extends SurfaceView implements SurfaceHolder.Callback,Runnable{    
  19.         SurfaceHolder holder=null;    
  20.         Paint paint;    
  21.         public MyView(Context context) {    
  22.             super(context);    
  23.             // TODO Auto-generated constructor stub    
  24.             holder=getHolder();    
  25.             holder.addCallback(this);    
  26.             paint=new Paint(Paint.ANTI_ALIAS_FLAG);    
  27.             paint.setColor(Color.RED);    
  28.                 
  29.             this.setFocusable(true);    
  30.         }   
  31.   
  32.         /* 在surface的大小发生改变时激发 */  
  33.         @Override    
  34.         public void surfaceChanged(SurfaceHolder holder, int format, int width,    
  35.                 int height) {    
  36.             // TODO Auto-generated method stub    
  37.                 
  38.         }    
  39.     
  40.        /* 在创建时激发,一般在这里调用画图的线程 */  
  41.         @Override    
  42.         public void surfaceCreated(SurfaceHolder holder) {    
  43.             // TODO Auto-generated method stub    
  44.             Thread t=new Thread(this);    
  45.             t.start();    
  46.         }    
  47.     
  48.   
  49.       /* 销毁时激发,一般在这里将画图的线程停止、释放 */  
  50.         @Override    
  51.         public void surfaceDestroyed(SurfaceHolder holder) {    
  52.             // TODO Auto-generated method stub    
  53.             isRunning=false;    
  54.         }    
  55.     
  56.         @Override    
  57.         protected void onDraw(Canvas canvas) {    
  58.             // TODO Auto-generated method stub    
  59.             canvas=holder.lockCanvas();    
  60.             //刷屏      
  61.             canvas.drawColor(Color.BLACK);    
  62.                 
  63.             canvas.drawCircle(x, y, 10, paint);    
  64.                 
  65.             holder.unlockCanvasAndPost(canvas);    
  66.         }    
  67.         private void paint(Paint paint) {    
  68.             Canvas canvas=holder.lockCanvas();    
  69.             //刷屏      
  70.             canvas.drawColor(Color.BLACK);    
  71.                 
  72.             canvas.drawCircle(x, y, 10, paint);    
  73.                 
  74.             holder.unlockCanvasAndPost(canvas);    
  75.         }    
  76.             
  77.         boolean isRunning=true;    
  78.         @Override    
  79.         public void run() {    
  80.             // TODO Auto-generated method stub    
  81.             while (isRunning) {    
  82. //              onDraw(null);    
  83.                 paint(paint);    
  84.                 move();    
  85.                 try {    
  86.                     Thread.sleep(50);    
  87.                 } catch (InterruptedException e) {    
  88.                     // TODO Auto-generated catch block    
  89.                     e.printStackTrace();    
  90.                 }    
  91.                     
  92.             }    
  93.         }    
  94.             
  95.         private int x,y;    
  96.         private void move(){    
  97.             x+=2;    
  98.             y+=2;    
  99.         }    
  100.     }    
  101.         
  102. }  

你可能感兴趣的:(android view SurfaceView GLSurfaceView的关系和区别)