在网上看到的一些解释:
SurfaceView:基于View进行拓展的视图类,是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕上绘图。这样可以避免绘图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等尽量在Canvas画布中画出。
GLSurfaceView:基于SurfaceView再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,Open GL专用。
View:必须在UI主线程中更新,用于被动更新视图。
SurfaceView:在UI主线程和子线程中都可以更新,用于主动更新重绘视图。
在主UI线程中更新画面可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你更新操作阻塞,那么程序将无法响应按键,触屏等消息。
使用SurfaceView由于是在新的线程中更新画面,所以不会阻塞你的主UI线程。但这也带来了另外一个问题,就是事件同步,涉及到线程同步。
所以基于以上特征,根据应用场景,一般分成两种情况:
1、被动更新画面的。比如棋牌类游戏,这种使用View就可以了。因为画面的更新是依赖于 onTouch事件来更新的,可以直接调用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch间隔的时间会长些,不会产生影响。
2、主动更新画面的。比如一个人一直在跑动,这就需要一个单独的Thread不停的重绘地人的状态,避免阻塞main UI thread。所以,使用View显然是不合适的,需要使用SurfaceView来重绘。