SurfaceView和View最本质的区别
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游戏当中充当主要的除了控制类外就是显示类,在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构建,同时Android123未来后面说到的OpenGL中的GLSurfaceView也是从该类实现。
SurfaceView和View最本质的区别相关推荐
- surfaceView和View区别
surfaceView和View最本质的区别在于: ------------------------------------------------------------------------- ...
- android安卓SurfaceView与view的区别是什么?
原贴: link 原贴: link surfaceView和View最本质的区别在于: surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面.那么在U ...
- SurfaceView和View的区别
前言:努力,离目标的五分之一又近了一步. 1.view view在api中的结构 java.lang.Object android.view.View 直接子类: AnalogClock, Ima ...
- SurfaceView和TextureView的使用以及区别
SurfaceView和TextureView的使用以及区别 一 . 什么时候使用SurfaceView 我们平时学习自定义view的过程中会发现自定义的View可以满足大部分的绘图需求,但是当我们需 ...
- [Redux/Mobx] redux-saga和redux-thunk有什么本质的区别?
[Redux/Mobx] redux-saga和redux-thunk有什么本质的区别? saga 自己基本上完全弄了一套 asyc 的事件监听机制.虽然好的一方面是将来可以扩展成 worker 相关 ...
- 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!
5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...
- Java传统的io和nio区别_Java中IO和NIO的本质和区别
简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...
- 博通高通迈威尔螃蟹全志南方硅谷WiFi本质的区别
之前写了 螃蟹wifi驱动在AP模式下存在挂死系统的问题_MengXP的博客-CSDN博客 后来我也做了很多实验,查阅了一些资料.做了一些思考,现在总结如下: 无线网卡芯片本身一定是包含一个PHY.D ...
- Java中IO和NIO的本质和区别
文章目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序 ...
最新文章
- 机器人动力学建模实例(二):三连杆机械臂
- 114. Flatten Binary Tree to Linked List 二叉树展开为链表
- C++ vector类详解
- zabbix监控特殊端口(8080,80,8009等)
- 单链表删除指定范围内的元素
- 支付宝要给全国人民发100亿,7月1日起!
- java 文件上传 大小_java 上传文件大小转换为 GB/MB/KB/B
- apple_Apple WWDC 2018主题总结
- zookeeper的zxid
- 【心电信号】基于matlab自适应滤波算法胎儿心电信号提取【含Matlab源码 953期】
- 微信多开软件苹果版_微信多开教程—Mac版amp;Win版
- Tuxedo中间件常用命令
- python移植到stm32f205_Micropython学习(二)STM32移植
- 一款支持语音搜索及语音Voip的浏览器
- Apache Jena配置
- python结巴库下载_python结巴怎么安装
- 猫哥教你写爬虫 041--模拟登录-cookie
- animation心形--表白
- 公司网络机房搭建,信息化目标,网络故障处理办法
- Fiddler教程系列—介绍【必看】