SurfaceView在Android游戏开发中的研究
2014-09-16易国平
易国平
摘要:目前,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]. 华南理工大学.
(责编 张景贤)