6. 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来绘制。 |
🚀🚀🚀🚀🚀🚀 |