SurfaceView在Android游戏开发中的研究

2014-09-16 01:52易国平
学周刊·下旬刊 2014年6期

易国平

摘要:目前,Android平台的市场份额已经跃居全球第一,其平台的开发性让越来越多的人加入Android平台的游戏开发。在游戏开发,程序运行的元素越来越多,要让程序员自己控制刷新屏幕,就需用到类库SurfaceView。因此SurfaceView在游戏开发中尤为重要,本文就SurfaceView在开发中用到的相关属性和方法做详细说明,以帮助大家对SurfaceView快速的了解。

关键词:Android SurfaceView 游戏开发

近年来,Android平台越来越火爆,其市场份额已占全球第一。随着科技水平的进步和android平台的领先,Android的游戏开发是程序员的新的发展方向。Android普通程序开发的UI线程更新画面,是由程序后台控制,这是被动更新画面。简单的棋牌类游戏开发可以,但是实时互动的游戏就需要自我掌控屏幕的刷新。而SurfaceView类就是在这种情况产生的,它在一个新启动的线程中重新绘制画面,主动更新画面。

一、SurfaceView简介

说到SurfaceView类,就需要先介绍下它的父类View,View一般在onDraw方法里面绘图,onDraw在UI主线程执行。onDraw默认只在View初始化的时候调用一遍,所以View不会自动刷新画面,一般要调用invalidate或者postInvalidate来重新执行onDraw里面的代码进行刷新画面。SurfaceView也可以在onDraw方法里面绘图,即直接在UI主线程绘图并渲染,因为SurfaceView是View的子类。上面已经介绍,绘图完毕后只能在UI主线程内渲染到屏幕上。为了不阻塞主线程,我们可以考虑采取这样的方案:在后台线程执行繁重的绘图任务,把所绘制的东西缓存起来;绘图完毕后,再回到UI主线程,一次性把所绘制的东西渲染到屏幕上。(本质就是后台线程绘图,UI主线程渲染)只使用View的onDraw方法是无法实现这种方案的,而SurfaceView可以实现这种方案。

先看看SurfaceView的工作原理图:

首先,SurfaceView使用Canvas对象进行绘图;由图可以看出,Canvas在后台线程绘制的东西先缓存到Surface中。其次,让Surface回到UI主线程渲染到屏幕上。因此,要有Surface对象存在,才能够在屏幕上显示图案。

二、SurfaceView在代码中各成员解释

(一)Surface与SurfaceHolder对象

Surface是SurfaceView里面的一个成员变量,它的创建和销毁过程都是自动的。Surface的主要作用是缓存Canvas绘制的东西,并渲染到屏幕上。SurfaceHolder对象通过类SurfaceView的getHolder()函数获得。

(二)后台绘图线程的开启与销毁

在Surface被创建的时候,开启绘图线程。在Surface被销毁的时候,销毁绘图线程。因为没有Surface,绘制再多的东西也无法渲染到屏幕上。既然要在创建Surface时开启绘图线程,在销毁Surface时销毁绘图线程。那就需要监听Surface的生命周期,使用SurfaceHolder对象的addCallback()来添加Surface的生命周期监听器——SurfaceHolder.Callback

(三)Callback的成员函数

1.Surface的大小发生改变时调用surfaceChanged

2.Surface创建时调用,一般在这里开启绘图线程surfaceCreated

3.Surface销毁时调用,一般在这里销毁绘图线程surfaceDestroyed

三、实例的具体实现步骤及代码实现

(一)1SurfaceView使用步骤

1.新建一个继承SurfaceView的类——GameView

2.得到SurfaceHolder对象,并监听Surface的生命周期

3.开启绘图线程、销毁绘图线程

4.在run方法中尝试进行绘图

5.动态刷新屏幕

(二)具体代码实现:

1.MainActivity,主要Activity

class MainActivity extends Activity {

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(new MyView(this));

2.MySurfaceView

class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

SurfaceHolder holder;

public MyView(Context context) {

super(context);

holder = this.getHolder();//获取holder

holder.addCallback(this);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }

@Override

public void surfaceCreated(SurfaceHolder holder) {

new Thread(new MyThread()).start();

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) { }

}

3.MyThread

class MyThread implements Runnable{

@Override

public void run() {

Canvas canvas = holder.lockCanvas(null);//

获取画布

Paint mPaint = new Paint();

mPaint.setColor(Color.BLUE);

canvas.drawRect(new RectF(40,60,80,80), mPaint);

holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像

}

}

本文对Android系统的游戏开中的SurfaceView类进行了分析,对于SurfaceView在游戏开发中与View的区别做了简单说明,最后给出一个简单的例子作为学习的样例,为能够给游戏开发人员提供一点启示。

参考文献:

[1](美)Shane Conder(美)Lauren Darcey .Android移动应用开发入门到精通人民邮电出版社,2010.

[2]胡必波.基于Android系统的手机游戏设计与实现[D]. 华南理工大学.

(责编 张景贤)