SurfaceView-View-GLSurfaceView

来源:互联网 发布:linux安装eclipse jdk 编辑:程序博客网 时间:2024/06/01 08:02

View、SurfaceView与GLSurfaceView的关系

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用

View与SurfaceView

SurfaceView的介绍

老罗的博客:
http://blog.csdn.net/luoshengyang/article/details/8661317/ 对SurfaceView的实现原理进行了详细的介绍。需要对SurfaceView进行深入研究的可以看看。

这里仅仅对SurfaceView进行简单的介绍

SurfaceView的API介绍---对应的中文翻译如下SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内的surface部分内容才可见,可见区域外的部分不可见。

注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。你可以通SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。

surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:① 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。② 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。

关于SurfaceView的详细介绍请参考:

http://www.360doc.com/content/13/0103/14/7724936_257842268.shtmlhttp://www.cnblogs.com/technology-fans/archive/2012/02/29/2373928.html

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来控制。
其他区别:
surfaceView自身实现了双缓冲(双缓冲是为了防止动画闪烁而实现的一种多线程应用,通俗的说:不用画布,直接在窗口上进行绘图叫做无缓冲绘图。用了一个画布,将所有内容都先画到画布上,在整体绘制到窗口上,就该叫做单缓冲绘图,那个画布就是一个缓冲区。用了两个画布,一个进行临时的绘图,一个进行最终的绘图,这样就叫做双缓冲绘图。),而View没有。其实view你也可以自己实现,但是实现的结构不如surfaceView好。

博客:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328002.html

SurfaceView的双缓冲问题的深入探讨参见:

http://blog.csdn.net/helixiuqqq/article/details/6932693http://www.oschina.net/code/snippet_54100_1422

关于SurfaceView 和GLSurfaceView

GLSurfaceView从Android 1.5(API level 3)开始加入,作为SurfaceView的补充。它可以看作是SurfaceView的一种典型使用模式。在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程。另外它定义了用户需要实现的Render接口,提供了用Strategy pattern更改具体Render行为的灵活GLSurfaceView的Client,只需要将实现了渲染函数的Renderer的实现类设置给GLSurfaceView即可。如:public class TriangleActivity extends Activity {protected void onCreate(Bundle savedInstanceState) {    mGLView = new GLSurfaceView(this);    mGLView.setRenderer(new RendererImpl(this));相关类图如下。其中SurfaceView中的SurfaceHolder主要是提供了一坨操作Surface的接口。GLSurfaceView中的EglHelper和GLThread分别实现了上面提到的管理EGL环境和渲染线程的工作。GLSurfaceView的使用者需要实现Renderer接口。

0 0
原创粉丝点击