乐趣区

关于游戏开发:Android游戏开发之二剖析游戏开发用view还是surfaceView

在 Android 游戏当中充当次要的除了管制类外就是显示类,在 J2ME 中咱们用 Display 和 Canvas 来实现这些,而 Google Android 中波及到显示的为 view 类,Android 游戏开发中比拟重要和简单的就是显示和游戏逻辑的解决。

这里咱们说下 android.view.View 和 android.view.SurfaceView。SurfaceView 是从 View 基类中派生进去的显示类,间接子类有 GLSurfaceView 和 VideoView,能够看出 GL 和视频播放以及 Camera 摄像头个别均应用 SurfaceView,到底有哪些劣势呢? SurfaceView 能够管制外表的格局,比方大小,显示在屏幕中的地位,最要害是的提供了 SurfaceHolder 类,应用 getHolder 办法获取,相干的有 Canvas lockCanvas() 
Canvas lockCanvas(Rect dirty)、void removeCallback(SurfaceHolder.Callback callback)、void unlockCanvasAndPost(Canvas canvas) 管制图形以及绘制,而在 SurfaceHolder.Callback 接口回调中能够通过重写上面办法实现。

应用的 SurfaceView 的时候,个别状况下要对其进行创立,销毁,扭转时的状况进行监督,这就要用到 SurfaceHolder.Callback. 
class XxxView extends SurfaceView implements SurfaceHolder.Callback {

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){} 
// 看其名知其义,在 surface 的大小产生扭转时激发 
public void surfaceCreated(SurfaceHolder holder){} 
// 同上,在创立时激发,个别在这里调用画图的线程。
public void surfaceDestroyed(SurfaceHolder holder) {} 
// 同上,销毁时激发,个别在这里将画图的线程进行、开释。

对于 Surface 相干的,Android 底层还提供了 GPU 减速性能,所以个别实时性很强的利用中次要应用 SurfaceView 而不是间接从 View 构建,同时起初做 android 3d OpenGL 中的 GLSurfaceView 也是从该类实现。

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 来管制。

 

3.Android 中的 SurfaceView 类就是双缓冲机制。因而,开发游戏时尽量应用 SurfaceView 而不要应用 View,这样的话效率较高,而且 SurfaceView 的性能也更加欠缺。

 

 思考以上几点,所以我始终都选用 SurfaceView 来进行游戏开发。

那么在当前源码实例中,我都会以继承 surfaceView 框架来进行演示。下一章将具体分析 sarfaceview,以及附上自己写的游戏开发架构。
文章起源:http://www.laoshoucun.com/ 传奇

退出移动版