Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化

 

关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!

 原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/10/6127578.aspx

  先上一段代码大家来看一下:

  view plaincopy to clipboardprint?

  ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  package com.himi;

  import android.app.Activity;

  import android.os.Bundle;

  import android.util.Log;

  import android.view.MotionEvent;

  import android.view.Window;

  import android.view.WindowManager;

  /**

  * @author Himi

  */

  public class MainActivity extends Activity {

  private Object object;

  private final int TIME = 50;//备注1

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  this.requestWindowFeature(Window.FEATURE_NO_TITLE);

  setContentView(R.layout.main);

  object = new Object();

  }

  @Override

  public boolean onTouchEvent(MotionEvent event) {

  if (event.getAction() == MotionEvent.ACTION_DOWN) {

  Log.v("Himi", "ACTION_DOWN");

  } else if (event.getAction() == MotionEvent.ACTION_UP) {

  Log.v("Himi", "ACTION_UP");

  } else if (event.getAction() == MotionEvent.ACTION_MOVE) {

  Log.v("Himi", "ACTION_MOVE");

  }

  synchronized (object) {//备注2

  try {

  object.wait(TIME);} catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  return true;//这里一定要返回true!原因请看【Android2D游戏开发之九】

  }

  }

  代码很清晰呵呵,主要就是备注2的地方:

  一: 前言:

  各位童鞋肯定都知道在模拟器中,我们的鼠标当点击一次模拟器屏幕然后释放,先触发 ACTION_DOWN 然后 ACTION_UP ;如果是在屏幕上移动那么才会触发 ACTION_MOVE 的动作;OK,很对。但是你要知道,这只是模拟器!!!!!

  二:真机与模拟器的区别:

  当我们的小用户(说到用户我就想起“我叫MT”中的暗夜男那句经典台词:亲爱的客户,我是嫩爹!)咳咳,回到话题;当我们的用户在玩我们的游戏的时候,尤其是RPG这种类型的,用户肯定需要会长时间的去触屏按我们的虚拟按键,比如我们会在屏幕上画上一个虚拟方向盘类似这样子~那么其实 ACTION_MOVE 这个事件会被Android一直在响应!!

  三: 为什么会一直响应 ACTION_MOVE 这个动作呢? 如果用户没有移动手指而是静止不动也会一直响应?

  原因有两点:低一点是因为,Android 对于触屏事件很敏感!第二点:虽然我们的手指感觉是静止没有移动,其实事实不是如此!当我们的手指触摸到手机屏幕上之后,感觉静止没动,其实手指在不停的微颤抖震动。不信你试试静止下手指,是不是微微动?嘿嘿~

  so~ 我们就要分析了,如果ACTION_MOVE此时间一直被Android os 一直不停的响应并处理,无疑对我们游戏的性能增加了不少的负担!

  比如我们游戏线程绘图时间每次用了50ms,那么在这50ms里Android接收到的触屏事件其实已经响应了N遍了- -、那么我们其实根本用不着按键响应这么多次,而是需要在我们每次绘图后,或者绘图前接受一次用户按键就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)这个方法也需要慎用!

  原因是因为测试发现:这个睡眠的时间其实比你规定的时间要略微的长一些,不过我们合理控制好时间还是没问题的。

时间: 2024-09-05 23:32:37

Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化的相关文章

【ANDROID游戏开发十五】关于ANDROID 游戏开发中 ONTOUCHEVENT() 触屏事件的性能优化笔记!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/336.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

Android 游戏开发中绘制游戏触摸轨迹的曲线图_Android

       本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图.        我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是本篇文章的主旨内容.        Android Path类        Android提供了一个Path类 , 顾名思义这个类可以设置曲线路径轨迹.任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线.path类就 可以记录这两点之间的轨迹

【IOS-COCOS2D(2.X) 游戏开发之一】自定义CCSPRITE中-(ID) INIT 重写需注意& 2.X版本中注册触屏事件代码&简述COCOS2D/X/UNITY3D引擎使用感想!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d-v2/736.html 先说下技术相关问题: Himi有段时间没有折腾Cocos2d-iphone了,前几天下载最新的Cocos2d 2.x版本尝试使用,发现两个常用知识点则需要注意的地方,这里分享下: 1.  对于Cocos2d 2.x版中,当你(自定义精灵)自定义一个类并继承精灵CCSprite时,务必要注意

【ANDROID游戏开发十四】深入ANIMATION,在SURFACEVIEW中照样使用ANDROID—TWEEN ANIMATION!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/331.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

【ANDROID游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2ME的游戏类库与ANDROID游戏开发!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/361.html 由于写书的缘故,博文更新缓慢,大家体谅,今天针对群内常提出动画实现的问题来进行一个详细讲述: 此章节适合没有做过游戏开发的同学学习! 做过Android软件的童鞋们,在学习游戏开发的时候,思维总是被固定在了Android系统组件上!比如动画实现总想着利用BitmapDrawable.Animatio

【ANDROID游戏开发之二】剖析游戏开发用VIEW还是SURFACEVIEW ?!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/295.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

《Android 游戏开发大全(第二版)》——导读

目 录 第一篇 Android游戏开发核心技术 第1章 Android平台简介 第2章 Android游戏开发中的前台渲染 第3章 Android游戏开发中的交互式通信 第4章 Android游戏开发中的数据存储和传感器 第5章 Android游戏开发中的网络编程 第6章 不一样的游戏,一样的精彩应用 6.1 射击类游戏 6.2 竞速类游戏 6.3 益智类游戏 6.4 角色扮演游戏 6.5 闯关动作类游戏 6.6 冒险游戏 6.7 策略游戏 6.8 养成类游戏 6.9 经营类游戏 6.10 体育

[IOS]自定义长触屏事件

写一个Demo来自定义一个长触屏事件,自定义长按手势. 实现步骤: 1.创建一个自定义手势类,命名为LongPressGestureRecognizer,在创建的时候继承UIGestureRecognizer LongPressGestuRecognizer.h: #import <UIKit/UIKit.h> @interface LongPressGestureRecognizer : UIGestureRecognizer @end LongPressGestuRecognizer.m:

【ANDROID游戏开发之九】(细节处理)触屏事件中的BUG解决方案以及禁止横屏和竖屏切换!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/315.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读: