文档章节

【Android游戏开发之二】剖析游戏开发用view还是surfaceView ?!

迷途d书童
 迷途d书童
发布于 2012/03/19 18:52
字数 1110
阅读 177
收藏 4


 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/295.html

很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块;请点击下面联系进入阅读:

【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!

 

     在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://blog.csdn.net/xiaominghimi/article/details/6089594

本文转载自:http://blog.csdn.net/xiaominghimi/article/details/6089594

迷途d书童

迷途d书童

粉丝 1019
博文 144
码字总数 14138
作品 0
深圳
高级程序员
私信 提问
剖析游戏开发用view还是surfaceView ?!

在Android游戏当中充当主要的除了控制类外就是显示类,在J2ME中我们用Display和Canvas来实现这些,而Google Android中涉及到显示的为view类,Android游戏开发中比较重要和复杂的就是显示和游...

无鸯
2011/09/29
910
0
【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/331.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童
2012/03/19
0
0
Android SurfaceView简例

Android SurfaceView简例 Android中各的SurfaceView和View有很大的不同,两者应用场景不同。大多数View能做的事情SurfaceView也可以,但是SurfaceView效率更高。Android的View绘制过程由And...

开开心心过
2017/09/13
0
0
【Android游戏开发二十六】追加简述SurfaceView 与 GLSurfaceView效率!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/388.html 今天在这里大概说下现在为什么游戏引擎都趋向与openGL进行的...

迷途d书童
2012/03/19
0
0
【Android】View类详解 (游戏开发必备)

Android游戏开发中比较重要和复杂的就是显示和游戏逻辑的处理。 这里我们说下android.view.View 和 android.view.SurfaceView。 SurfaceView是从View基类中派生出来的显示类,直接子类有GLS...

晨曦之光
2012/03/01
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Linq两表联查结果集处理

全局定义一个同结果集类型的变量: var strQuery =(new int[] { 1 }).Select(x => new { DispLevel = "empty", Separator ="empty", GrpShortCut......

南风末
7分钟前
1
0
AJAX跨域调用相关知识-CORS和JSONP(引)

AJAX跨域调用相关知识-CORS和JSONP 1、什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议、域名、端口)的内容。 但是我们项目开发过程中,经...

辉煌霸猪
12分钟前
0
0
Http协议详解

1.简介 HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP基于TCP/IP通信协议来传递数据。 ...

榴莲黑芝麻糊
17分钟前
2
0
Windows Terminal 设置背景图片

效果见文末,三步即可 一、打开配置文件位置 %LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\RoamingState 二、将要设置的图片放入本目录(RoamingState) 三、修改配置文...

DAOYUAN0626
17分钟前
2
0
Linux系统发现新恶意软件

安全研究人员发现了一种新的Linux恶意软件,它似乎是由中国黑客创建的,并被用作远程控制受感染系统的手段。 这个恶意软件命名为HiddenWasp,由用户模式rootkit,木马和初始部署脚本组成。该...

Linux就该这么学
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部