Flash开发移动设备技巧

   随着Adobe Flash技术向iOS, Android, BlackBerry这三大移动平台的进军,必然将涌现出大量的基于Flash Player和AIR的手机和平板应用。然而移动设备的硬件限制,对Flash的运行效率产生了很大的挑战,所以如何优化代码成为Flash移动开发的核心问题。另外、基于触摸的全新交互方式和移动设备上独有的系统环境,也让移动平台上的Flash开发多了许多机会和功能点。今天我就给大家简单介绍一下我在近期总结的一些经验和技巧。

    GPU渲染 

  移动设备的CPU和电脑上的CPU相差甚远,所以要运行大量动画(尤其是矢量动画),则最好要使用GPU来渲染。Flash Profession CS5在针对Android或者iOS项目的发布设置中可以选择是否使用GPU硬件加速。

  不要大量使用位图缓冲

  很多人认为使用位图(包括cacheAsBitmap) 要比使用矢量图要好,实际情况并非如此,一味单纯地使用图片也有弊端。论据之一是位图在缩放时显示不佳,我相信大家都有这样的体会;另外,如果位图元素被用在了移动、缩放、旋转等动画之内,那么它的运行效率不是提高反而下降了不少。而且在在使用GPU加速情况下,使用位图缓冲会让画面锯齿增加,远不如矢量图的清晰度高。但是如果用GPU渲染内容较多的动态文本,则必须使用位图缓冲。

  大量文本的渲染

  正如上点所说,GPU对处理动态矢量文本是非常之慢,原因就是GPU对矢量图采用了镶嵌渲染(tessellate),所谓镶嵌渲染就是将矢量图分为若干个小三角形,根据它们的顶点信息分别绘制再镶嵌成整体的形状(如同Molehill的顶点着色器),镶嵌渲染对矢量图的裁剪数量是依据其本身的形状,如果矢量图的拐点较多,那么就会裁剪出较多的三角形。因为动态文本含有大量的拐点,所以会产生很多的三角形镶嵌计算,而如果文本含有大量内容则会带来灾难性的结果。所以对大量文本需要使用位图缓冲来处理,使用cacheAsBitmap = true,让GPU按照文本的宽高来均匀地裁剪三角形,这样会使运行速度非常流畅。在做其他矢量图形的时候同样需要注意这一点,尽量避免弯曲而且狭长的图形,这让GPU绘制很多三角形从而拉低运行效率。


  (如上图,"镶"字的偏旁部分所示的是对矢量图镶嵌,"嵌"字示意的是对位图镶嵌)

  矢量图的帧滞后现象

  这是我在制作手机游戏过程中发现的一个现象,前提是使用GPU加速,如果在第二帧要在舞台上首次显示一个复杂的矢量场景,那么在第一帧会有一个很明显的停顿,这也是由于GPU的镶嵌造成的。在我的例子中,前一个场景在做淡出效果,淡出到M帧应该是纯黑的画面,同时在M帧显示一个新的场景。由于GPU镶嵌造成的运算,使得前一个场景在M-1帧停顿了大约0.2-0.5秒,这时候画面并非纯黑,所以很明显感觉到停顿。我最后的处理方式是将前一个场景的退出和后一个场景的进入改为异步连接,在中间使用一个timer来等待100毫秒,这样肉眼就丝毫感觉不到停顿地存在。

  不要使用特殊效果

  对移动设备来说,无论使用CPU还是GPU,在某些效果地渲染上都尚未达到理想的结果。比如在动画上方盖一个很大的透明渐变层,会导致帧频极具下降至10以下;如果采用了滤镜,哪怕只有简单的模糊滤镜,都会让帧频下降到个位数,GPU下甚至根本就不支持滤镜的渲染。GPU同样不支持的还有部分layer,alpha,erase,overlay,hardlight,lighten,darken这些图形叠加效果以及着色器PixelBender。

  设备键盘的使用

  和电脑上获取键盘事件的原理一样,我们可以给应用程序添加一个侦听器来捕获KeyboardEvent,从而定义移动设备上的按键事件。从AIR2.5以后,我们可以使用Keyboard里的一些针对移动设备的key code(如Keyboard.BACK,Keyboard.MENU,Keyboard.SEARCH),如下面的例子:

  stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);function onKeyDown(pEvent:KeyboardEvent):void{ if(pEvent.keyCode == Keyboard.BACK){ //do something here }}

  另外有一点可能比较有用,我们可以利用Event的preventDefault方法来阻止一些键盘事件的默认行为。比如如果我们不希望按了返回键之后跳出当前应用程序到桌面,我们可以在上面的例子里加一行代码:

  stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);function onKeyDown(pEvent:KeyboardEvent):void{ if(pEvent.keyCode == Keyboard.BACK){ pEvent.preventDefault(); //do some checking here }}

  跨平台应用程序的判断

  对于一个打算发布在多个平台的应用程序,我们当然希望使用相同的代码,避免为每个平台单独开发。桌面应用和移动应用在交互方式上是不一样的,桌面上更多的是采用鼠标操作,而移动上更多的是触摸和手势。这两种方式的API是不一样的,鼠标使用的是MouseEvent,触摸和手势则用TouchEvent和GestureEvent。所以在定义交互的时候我们需要判断当前运行的平台是什么样的交互模式:

  if(Capabilities.touchscreenType == TouchscreenType.FINGER){ //定义触摸和手势交互}else{ //定义鼠标交互}

  除了交互方式的不同,移动设备上的AIR与桌面端AIR一样,有对原生系统的访问API比如NativeApplication类。举一个例子,在浏览器中运行的应用程序不用去考虑关闭应用程序,但是AIR则经常会设计一个自我关闭的功能。这个功能需要用到NativeApplication.exit()方法,可是NativeApplication类只存在于AIR运行时而非Flash Player中,所以如果在跨平台的代码中直接导入NativeApplication则会在编译浏览器版本时报错,即使使用AIR的发布功能将SWF发布成功,那么在浏览器中运行这个SWF也会报未知对象的错误。

  我的解决方法是使用反射来解决编译时的导入问题,而使用Exception来解决运行时的错误:

  try{ //AIR版本 var myClass:Class = getDefinitionByName("flash.desktop.NativeApplication") as Class; nativeApplication = myClass.nativeApplication; nativeApplication.addEventListener(Event.DEACTIVATE, deactivateHandler); nativeApplication.addEventListener(Event.ACTIVATE, activateHandler); nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);}catch(e:Error){ //浏览器版本}

  状态保存

  Android和iOS平台与电脑平台一样,支持SharedObject本地存储功能,所以可以在所有平台使用一样的代码来对应用程序状态(比如游戏进度、应用的偏好设置)进行保存和读取。如果你对SharedObject的保存和读取不是很清楚,下面的代码可以帮助你了解。

  访问本地SharedObject数据

  //blabla是自定义的字符串,本地存储文件会以它来命名。var so:SharedObject = SharedObject.getLocal("blabla");//so.data是SharedObject的只读属性,可以作为容器存放需要在本地存储的数据变量,(注意,本地存储的数据有大小限制,最多为100KB)so.data.savedata = "What a nice function!!";//生成本地存储文件so.flush();

  如果要清除特定的本地存储文件,可以用下面的代码来实现:

  var so:SharedObject = SharedObject.getLocal("blabla");so.clear();

  应用程序状态判断

  举一个例子,如果你正在手机上玩一个有背景音乐的游戏,突然被来电打断,那么你当然不希望在通话的时候同时会听到游戏的背景音乐。或者你按了Back键回到了桌面,那么游戏也是理所应当被静音的。这就需要对应用程序的运行状态比如Activated, Deactivated添加侦听:

  nativeApplication.addEventListener(Event.DEACTIVATE, deactivateHandler);nativeApplication.addEventListener(Event.ACTIVATE, activateHandler);function activateHandler(pEvent:Event):void{}function deactivateHandler(pEvent:Event):void{}

  另外还有一些增加用户体验上的经验,比如如何处理被触摸控制的物体到达屏幕边界时的弹性缓冲运动,都可以用基本的ActionScript方法来进行处理和运算,这里不做详细介绍。

  补充两点:

  1.避免使用Timer,

  2.在一些静态图片的时候可以降低帧率

 

时间: 2024-09-13 02:35:15

Flash开发移动设备技巧的相关文章

ASP开发44条技巧集锦之一

技巧 下一节:ASP开发44条技巧集锦之二 1. 几个常用函数 Round(pi, 2) 四舍五入 FormatNumber(k,4) ' 把 k 格式化为带四位小数点的数. eg. 如果k =20000则显示为20,000.00:如果把formatnumber(k,0)则为20,000 Replace(expression,find,replacewith) '返回一字符串,其中指定的子串已被另一个子串替换 Left(String,Length) '返回指定数目的从字符串的左边算起的字符串.

ASP开发44条技巧集锦之二

技巧 上一节:ASP开发44条技巧集锦之一 21. 嵌入另一页   <iframe class="TBGen" style="top:2px" ID="UploadFiles" src="upload.asp" frameborder=0 scrolling=no width="250" height="25"></iframe> ----------------

聊聊交互设计师与开发沟通的技巧

 开发沟通的技巧-语聊聊骚技巧"> 一个项目或版本开发过程中,交互设计师50%的时间在沟通,40%的时间在思考,10%的时间在写文档.当然,只是个大概值,不同的工作流程下可能略有不同.由此可见,沟通对交互设计师来说,是一项很重要的技能.前期与产品经理.视觉的沟通,后期与开发.测试的沟通,每个环节都很重要且都会关乎到产品上线后的体验.但今天只总结我(交互设计师)与开发的沟通技巧,与君共勉. 首先,多学善问 毕业刚入行的时候,接到的第一个任务是:优化语音查找异常处理流程.对于计算机一窍不通的自

mysql开发必看技巧

mysql教程开发必看技巧 一.基础 1.说明:创建数据库教程 Create DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server - 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' - 开始 备份 BACKUP DATABASE pubs TO testBa

UWP Windows10开发获取设备位置(经纬度)

原文:UWP Windows10开发获取设备位置(经纬度) 1.首先要在UWP项目的Package.appxmanifest文件中配置位置权限,如下图所示: 2.Package.appxmanifest后选择第三个选项卡,勾选位置权限(Location) 打开 3.然后创建一个LocationManage类,包括以下代码: public async static Task<Geoposition> GetPosition() { //请求对位置的访问权 var accessStatus = a

10 个 Visual Studio 原生开发的调试技巧

我以前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS2005或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 数据断点 线程重命名 特定进程中断 大概执行时间 数字格式化 内存数据格式化 系统DLL中断 装载符号表 MFC中内存泄露报告 调试ATL 提示11:数据断点 当数据所在内存位置变化时,调试器将会中断.然而,

visual studio-wdk8.1+vs2013中使用winusb模版开发usb设备驱动

问题描述 wdk8.1+vs2013中使用winusb模版开发usb设备驱动 新人一只,本身是做硬件的,现在要编写硬件(USB设备)的驱动,然后想使用winusb进行快速的驱动开发.在使用winusb之前,使用了libusb-win32下的inf工具进行inf文件的生成和安装,通过bus hound可以看到枚举,并进行的bulk in/out测试(自带的send command).目标pc是64位的win7旗舰版. 现在状况是vs2013新建了winusb模版工程,其中drivers packa

Asp.Net Couchbase Memcached图文安装调用开发_实用技巧

安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64. 在安装服务端如果发生如下所示的错误,我在win7 64安装的过程中就遇到了. 这个时候可以先撤销安装.通过CMD命令运行regedit.展开HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion分支,在窗口的右侧区域找到名为"ProgramFilesDir"

flash开发中如何实现界面代码分离

"flash开发"发展到今天,大体上已经细分为二个分支:Flash 设计师 和 Flash程序员,然而设计师不懂代码,程序员不懂设计,如何把这二种角色有机结合起来,实现代码.界面分离?可能下面的办法对你有用:   actionscript3允许把外部swf直接用Embed标记嵌入到主类中(当然用UrlLoader动态加载也行),这意味着设计师们可以把一些常用的与代码无关的素材(比如按钮,图片,小动画),以他们喜欢的方式,用Flash CS工具设计好放到库中.   然后程序员把这类包含(