Android游戏开发用View还是SurfaceView?

 

Android游戏开发用View还是SurfaceView?

 

在游戏开发过程中经常用到两种显示类:一种是View,另一种则是SurfaceView。在这里我们来讨论在Android游戏开发中应该用哪种比较合适!一下我们来分析这两种显示类的异同和用法。

SurfaceView是从View基类派生出来的显示类,它的直接子类有GLSurfaceView和ViideoView等,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView,那么SurfaceView到底有哪些优势呢?

在一般的情况下,应用程序的View都是在相同的GUI线程中绘制的。这个主应用程序线程同时也用来处理所有的用户交互(例如,按钮单击或者文本输入)。当需要快速地更新View的UI,或者当渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。SurfaceView封装了一个Surface对象,而不是Canvas。这一点很重要,因为Surface可以使用后台线程绘制。对于那些资源敏感的操作,或者那些要求快速更新或者高帧率的地方,例如,使用3D图形,创建游戏,或者实时预览摄像头,这一点特别有用。

SurfaceView和View最本质的区别在于:surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。 那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。 当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步

所以基于以上,根据游戏特点,一般分成两类: 1 被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。 2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。

Android中的SurfaceView类就是双缓冲机制。因此,开发游戏时尽量使用SurfaceView而不要使用View,这样的话效率较高,而且SurfaceView的功能也更加完善。而然,独立于GUI线程进行绘图的代价是额外的内存消耗,所以,虽然它是创建定制的View的有效方式---有时甚至是必须的,但是使用SurfaceView的时候仍然要保持谨慎。

你可能感兴趣的:(thread,游戏,UI,android,图形)