Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。
原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/10/6127578.aspx
先上一段代码大家来看一下:
代码很清晰呵呵,主要就是备注2的地方:
一: 前言:
各位童鞋肯定都知道在模拟器中,我们的鼠标当点击一次模拟器屏幕然后释放,先触发 ACTION_DOWN 然后 ACTION_UP ;如果是在屏幕上移动那么才会触发ACTION_MOVE 的动作;OK,很对。但是你要知道,这只是模拟器!!!!!
二:真机与模拟器的区别:
当我们的小用户(说到用户我就想起“我叫MT”中的暗夜男那句经典台词:亲爱的客户,我是嫩爹!)咳咳,回到话题;当我们的用户在玩我们的游戏的时候,尤其是RPG这种类型的,用户肯定需要会长时间的去触屏按我们的虚拟按键,比如我们会在屏幕上画上一个虚拟方向盘类似这样子~那么其实ACTION_MOVE 这个事件会被Android一直在响应!!
三: 为什么会一直响应ACTION_MOVE 这个动作呢? 如果用户没有移动手指而是静止不动也会一直响应?
原因有两点:第一点是因为,Android 对于触屏事件很敏感!第二点:虽然我们的手指感觉是静止没有移动,其实事实不是如此!当我们的手指触摸到手机屏幕上之后,感觉静止没动,其实手指在不停的微颤抖震动。不信你试试静止下手指,是不是微微动?嘿嘿~
so~ 我们就要分析了,如果ACTION_MOVE此时间一直被Android os 一直不停的响应并处理,无疑对我们游戏的性能增加了不少的负担!
比如我们游戏线程绘图时间每次用了100ms,那么当手指触摸屏幕,这短暂的0.1秒内大概会产生10个左右的MotionEvent ,并且系统会尽可能快的把这些event发给监听线程, 这样的话在这一段时间内cpu就会忙于处理onTouchEvent从而杯具点的话会造成画面一卡一卡的。
那么我们其实根本用不着按键响应这么多次,而是需要在我们每次绘图后,或者绘图前接受一次用户按键就OK了,这样能让帧率不至于下降的太厉害不是么?!so~我们要控制这个时间,让他慢下来,随着我们的绘图时间一起来合作~这样就能减不少系统线程的负担。
备注2:
可能有的童鞋会问为什么不用sleep()的方法,其实如果我们只是想让线程休眠指定时间的话可以用sleep()函数,但是这个没有资源锁的限制。而Object的wait,notify方法通常用在时间不定的条件限制等待,并且必须写在同步代码块中。so~
还有童鞋会问,为什么不用当前类的object来使用:this.wait(),而是new 一个object来:
synchronized 中的Object 表示Object调用wait必须拥有该对象的监视锁,当前我们有了object的锁,就要用object调用wait~
备注1:
这里的变量大家都知道其实是我们设置的休眠的时间,那么这里我想拿出来跟大家说下关于这个时间的定值,在上文我也有说过我们的游戏中只要按键跟我们的绘图线程的时间一样即可,当然这里是个我们的理想时间!如果我们游戏中有人物的帧,那么我们可以来根据人物帧数来当成设定这个睡眠时间也是相当合适的,毕竟人物一帧说明逻辑执行了一遍了呵呵~这个还是根据大家游戏的情况而定吧~
注意:Object.wait(long timeout)这个方法也需要慎用!
原因是因为测试发现:这个睡眠的时间其实比你规定的时间要略微的长一些,不过我们合理控制好时间还是没问题的。
补充:
1.看到有童鞋问//备注2这里能不能用this,也就是当前的object,答案是可以的,但是要注意最好不要这样用,原因是如果当其他地方也需要与当前的Object进行同步的话有可能出现死锁情况!用一个新的object的原因也就是可以让代码中该干什么就干什么,互不影响,
2.//备注2这里其实我们可以对其优化,毕竟一个Object比较浪费,我们其实只需要一个字节就足够了,so~我们可以这样定义一个:byte[] lock = new byte[0]; 这样可以算是最优了~
分享到:
相关推荐
这篇笔记将深入探讨Android界面开发的相关知识点,帮助开发者构建美观且功能强大的用户界面。 首先,Android界面设计主要基于XML布局文件,这些文件通常位于项目的res/layout目录下。XML布局文件定义了屏幕上的各个...
Android基础学习笔记主要涵盖了一系列关于Android开发的基本概念和关键组件,以下是这些知识点的详细解析: 1. **Activity**: 是Android应用程序的基本单元,它代表用户在屏幕上看到的一个界面。每个Activity都必须...
在Android平台上,实现类似有道云笔记的原笔迹手写功能是一项技术挑战,涉及到图形绘制、触摸事件处理以及手势识别等多个方面的知识。这个例子源码的目标是为用户提供一个能够实时绘制、保存和回放手写笔迹的应用,...
11. **触摸事件处理**:Android系统通过MotionEvent对象传递触摸事件,开发者可以覆盖`onTouchEvent()`方法来处理滑动、点击等手势。 12. **控件的状态选择器(State List Drawables)**:状态选择器允许根据控件的...
在文件"zhujin_view"中,可能包含了关于这些概念的详细代码示例和实践讲解,如自定义View的实现过程、事件处理机制的运用以及性能优化技巧。通过深入研究这些笔记,开发者可以更好地掌握Android视图系统,从而设计出...
- **触摸事件**:通过监听`onTouchEvent`方法来处理触摸屏幕的操作。 - **按键事件**:处理物理按键的操作。 - **轨迹球事件**:处理轨迹球的移动操作。 #### 总结 本章详细介绍了Android高级编程中的几个关键知识...
- 在Android中,我们可以利用MotionEvent事件来捕捉用户的触摸屏幕动作。通过在onTouchEvent()方法中处理ACTION_DOWN、ACTION_MOVE和ACTION_UP等事件,可以获取到用户手指在屏幕上的移动轨迹。 - 每次ACTION_MOVE...
3. **触摸事件处理**:Android的`MotionEvent`类用于处理触摸屏事件,包括ACTION_DOWN(按下)、ACTION_MOVE(移动)和ACTION_UP(抬起)。开发者需要监听这些事件,获取手指的坐标,并在`onTouchEvent()`方法中更新...
在Android开发中,实现"双击屏幕"的功能是一项常见的需求,比如用来切换应用状态或执行特定操作。这个功能的关键在于监听用户的触摸事件,并通过算法判断是单击还是双击。以下将详细介绍如何在Android中实现这个功能...
在Android开发中,"android笔画回放"是一个有趣且实用的功能,它允许用户在屏幕上进行书写或绘画,然后系统能够记录并回放这些笔画的动作。这一特性常见于绘图应用、教育软件或者笔记应用中,为用户提供了一种交互式...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求扩展或修改系统提供的标准控件,以实现独特且富有创意的用户界面。《Android群英传》这本书深入浅出地介绍了如何进行自定义View的操作,特别是...
在Android开发中,创建一个画板应用是相当常见的需求,比如儿童教育应用、手写笔记应用等。`DrawBoardDemo`就是一个很好的实例,它展示了如何实现在Android上进行绘图和清除基本操作。这个项目主要涉及到以下几个...
在Android应用开发中,创建一个可以写字画画并生成图片的功能是一项常见的需求,这通常涉及到自定义视图(Custom View)和图像处理技术。本篇将深入探讨如何利用Android的画板控件实现这一功能。 首先,`Android...
在Android平台上,开发一款画图工具是一个常见的需求,它可以用于创建手绘应用、绘图笔记或者儿童教育软件等。这份"Android 画图工具源码.rar"提供的正是一个实现此类功能的源代码示例。通过分析这个源码,我们可以...
在Android平台上,手写功能是许多应用程序不可或缺的一部分,尤其在教育、绘画、笔记类应用中。这个名为"Android高级应用源码-android的手写功能.zip"的压缩包包含了一个名为"CancasDemo"的示例项目,它展示了如何在...
在Android开发中,为了提供丰富的用户体验,开发者常常需要模仿知名应用的设计,比如QQ的界面和交互效果。本篇文章将深入探讨如何实现“Android高仿QQ5.0侧滑菜单效果”,这一特性是通过自定义控件来达成的,旨在...
在Android平台上,手写和涂鸦功能是许多应用中常用且有趣的特性,它们可以用于笔记、绘图或者增强用户交互体验。"Android源码——访米聊手写和涂鸦源码.zip"提供了实现此类功能的源代码示例,帮助开发者深入理解其...
实现滑动切换的主要代码都在onFling()方法中,用户按下触摸屏,快速移动后松开,就会触发这个事件。在这段代码示例中,对手指滑动的距离进行了计算,如果滑动距离大于120像素,就做切换动作,否则不做任何切换动作。...