1 代码写法

1 定义局部变量

定义局部变量的时候,一定要用关键字var来定义,因为在Flash播放器中,局部变量的运行速度更快,而且在他们的作用域外是不耗占系统资源的.当一个函数调用结束的时候,相应的局部变量都会被销毁,并且释放出他们占有的系统资源

2 申明变量时强制类型

var a:int; 而非 var a;

3  访问静态属性 比 非静态属性 慢

4  getter setter 比直接访问属性慢

5  final变量和类效率更高

6  申明多个变量时单行效率比多行申明高

for(var i:int=0; i<100000; i++)

{ var v1:Number=10, v2:Number=10, v3:Number=10, v4:Number=10;}

7 不要在循环内定义变量

8 删除不必要的导入类

9 as 比 type(value) 转型要快

10 短变量名比长变量名高效

11  尽量将代码内嵌,避免过多的函数调用。(比如用 value > 0 ? value : -value; 来代替 Math.abs())

调用函数成本很高。尝试通过移动内联代码来减少函数的调用次数

for (i = 0; i< MAX_NUM; i++)

{

currentValue = arrayValues;

arrayValues = Math.abs ( currentValue );

}

优化代码如下:运行速度提高四倍以上。

for (i = 0; i< MAX_NUM; i++)

{

currentValue = arrayValues;

arrayValues = currentValue > 0 ? currentValue : -currentValue;

}

12 if(a.a) 比 if(a.a==null) 快

13 for..in 效率大于for ,需求证

14 当用到复杂的条件表达式时。把他们打散成为嵌套的独立判断结构是最佳方案。比如if(a&&b&&c)的效率就低于if(a){if(b){if(c){}}}。

15  对 while 循环使用相反的顺序 ( while (--i > -1) { } ) 比for更高效

16 低阶运算效率高于高阶运算

unit()--->Math.floor()     更快的算法:var u:uint=1.5>>0;

int()--->Math.ceil()

位运算>乘法>除法 ,但要注意是的有些运算是不能转换的 13/2 不能转换成 13<<0;

17  方法闭包作为监听器更方便和高效,因为他不需要活动的对象作为依赖体.

class Form

{

function setupEvents()

{

var f = function(event:Event) {

trace(“my handler”);

}

grid.addEventListener(“click”, f);

}

}

优于

class Form

{

function setupEvents()

{

grid.addEventListener(“click”, f);

}

function f(event:Event)

{

trace(“my handler”);

}

}

2 数组等容器

1  初始化 var a:Array=[]; 效率高于 var a:Array = new Array();

2 一维数组来代替二维数组

3 关于Vector和Array

1在基本数据类型 int number string 时Vector 效率优于Array

2在Object中,还是选择Array,不管是排序还是大量应用Array,特别在用sortOn时Array比Vector要快.

3固定长度的 Vector 更快。( Vector 可以这样初始化:var coords:Vector.<Number> = Vector.<Number>([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);)

4数组循环:

用局部变量缓存数组长度 ,用uint代替int

for(var i:uint=0;i<len;i++){

Var a:Object = arr;

}

5 重置数组用

Arr.length=0 效率最快

6 初始化数组

a[]  比push方法效率高600%

7  尽可能少使用方括号操作符访问 Vector 或 Array 元素,可以利用一个临时变量来操作。

8  Dictionary 弱引用可用来自动销毁资源.

3 显示对象api相关

1  新的 drawing API 更快,它们是:drawPath, drawGraphicsData, drawTriangles。

2  使用 setVector() 方法来处理像素。

3  使用 setPixel() 和 setPixel32 方法时,要配合使用 lock() 和 unlock() 方法。

4  尽可能在避免在循环内更新 TextField。

5  位图还是矢量图:

矢量 :同屏元素较少, 需要放大不失真   ,位图:需要大量元件,游戏特效,图像特效

矢量平滑处理:减少控制点。可使帧频稳定。

选中矢量图,Ctrl+Alt+Shift+C,减少线条

位图压缩方式 Fireworks 可以用PNG8格式高效的压缩带Alpha通道的图片

6 运动物体针对每个子元件使用 cacheAsBitmap 而不是针对父元件使用。

7 使用 cacheAsBitmap 和 opaqueBackground 参数可以改进渲染性能(包含 TextField )。

8   stage3d在旋转、缩放和alpha混合方面很有优势,这块是位图的软肋,位图只有在原始状态下渲染是最快的,想要不影响效率就得预先缓存出各种情况,会耗费掉大量内存,因此在这方面stage3d的性能更加强大 ,可以用3d来做2d加速

9  使用 TextField 时,appendText() 方法比 += 操作符要快。

10  使用 TextLine 处理静态文本比 TextField 快而且使用更少的内存

11 对文本基本搜索和提取时,使用 String 类方法而非正则表达式

12 当某个实例透明度小于1时,也会对播放速率造成影响。低透明度的可设置visable为flase

13 不要用masks 应该用 scrollRect来做遮罩效果

14 使用适当的DisplayObject

* Shape – 没有交互(占内存少)

* Sprite – 有交互(占内存多)

* MovieClip – 有时间线(占内存更多)

15 减少重绘区域

显示重绘区域:flash.profiler.showRedrawRegions (true,0x33ff00);

16 尽可能禁用鼠标交互。obj.mouseEnabled = false; obj.mouseChildren = false;

17 激活和停用事件

使用 Event.ACTIVATE 和 Event.DEACTIVATE 事件检测后台是否处于非活动状态,并相应地优化应用程序。对于移动设备很重要,例如后台运行air时,可将其帧频减小。

18 回调方法 要比 event 快而且消耗更少的内存

4   资源

对象缓存池

减少文件大小 (嵌入字体少用,用滤镜而非位图)

合理加载,要用时加载资源

列表和列表数据分开加载

数据分页

分次请求

资源销毁

1 释放内存 – 将所有对象的引用设置为 null

2 bitmap bitmapData 不用时  dispose();并将引用设置为null

3 卸载从外部装载的内容时,使用loader.unloadAndStop(),而不要使用 loader.unload()。

4 xml对象会比字符串占用内存增大20倍,可用System.disposeXML()来断开程个xml对象连接销毁xml对象.

5 URLLoader.close();URLStream.close();加载素材时可用这两个加载再用Loader.loadbytes。因为  Loader.load会展开swf文件,内存比压缩的流数据占用内存大.

6 适当使用事件冒泡,如有大量子对象需要添加事件监听器时,可以添加在父窗口中,冒泡实现 。

,大量事件冒泡是不必需的,可停止冒泡.事件记得移除监听

7 不可见mc ,先stop,再移除监听,再从舞台上remove.

8 如果之前使用了ExternalInface.callBack("APIName", functionName)声明了一个API,则可以使用ExternalInface.callBack("APIName", null)取消该API

总结:

移除监听

管理intervals timeout timer

卸载swf

停止声音视频

移除显示对象

停止时间帧

关闭连接 LocalConnections NetConnection NetStream

没有摄像头和麦克风处理的处理

释放位图数据

Janitor类

http://gskinner.com/talks/resource-management/source.zip

参考:

http://gskinner.com/talks/resource-management/

http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/

编译原理:

as3 代码优化的更多相关文章

  1. as3 代码优化之pmd

    首先下载com.abobe,ac.pmd.eclipse_...jar 和 flex-pmd-all-in-one...zip俩文件 前面一个装在xx\adobe flash builder xx\e ...

  2. (转)as3效率优化

    1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...

  3. as3效率优化

    1.改进算法无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了 ...

  4. PHP代码优化

    1 代码优化 1 尽量静态化 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和 ...

  5. 跟Unity3D学代码优化

    今天我们来聊聊如何跟Unity学代码优化,准确地说,是通过学习Unity的IL2CPP技术的优化策略,应用到我们的日常逻辑开发中. 做过Unity开发的同学想必对IL2CPP都很清楚,简单地说,IL2 ...

  6. 记录一次bug解决过程:else未补全导致数据泄露和代码优化

    一.总结 快捷键ctrl + alt + 四个方向键 --> 倒置屏幕 未补全else逻辑,倒置查询数据泄露 空指针是最容易犯的错误,数据的空指针,可以普遍采用三目运算符来解决 SVN冲突解决关 ...

  7. 【Java】记录一次代码优化

    前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...

  8. Java代码优化(长期更新)

    前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...

  9. 微信扫描打开APP下载链接提示代码优化

    上一次我发了一篇文章叫“微信打开网址添加在浏览器中打开提示”,里面我发出来了三个代码,分别是纯JS.js+html.jQuery+HTML代码.今天来一个简化版带可以关闭的按钮操作.使用的是纯JS+H ...

随机推荐

  1. 阿里云流计算专场-GitHub上相关文档

    阿里云流计算专场-GitHub路径:https://github.com/Alibaba-Technology/hangzhouYunQi2017ppt

  2. vertx.io 与nodejs 一个简单的性能比较

    vertx.io 与node 都是可以进行js运行的一个引擎,但是vertx 支持的语言相对于node 多,可以查看官网.今天下网上查询相关的信息 时来了解到vertx.io 性能比node 好,于是 ...

  3. linux挂载SD卡

    (1)通过#fdisk -l命令确认板子上的linux系统是否识别SD卡 MP805M板子插入SD卡后显示 SD30 slot is without WPmmc1: new high speed SD ...

  4. oracle归档日志配置查询

    归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档 ...

  5. IONIC 页面之间传递参数

    HomePage 定义goToMyPage方法,传递id和name MyPage接收参数

  6. SiteMap Editor for Microsoft Dynamics CRM 2011 使用说明

    How to connect to CRM environments using this tool If you already connected to a CRM deployment usin ...

  7. 转换sql文件的create table语句为drop table语句

    package com.csii.pweb.query.action; import java.io.BufferedReader; import java.io.FileNotFoundExcept ...

  8. linux 标准I/O (一)

    在前面<UNIX环境高级编程----文件描述符浅析>一文中所讲的I/O函数都是针对文件描述符.而对于标准I/O库,它们的操作都是围绕流来进行的.当用标准I/O库打开或创建一个文件时,我们已 ...

  9. redis通过dump.db文件 进行数据替换 复制

    进行数据替换无非就是三步, 杀掉redis进程 ------------> 复制 dump.db文件 ------------------>启动redis   pkill redis-se ...

  10. java 中getDeclaredFields() 与getFields() 的区别

    java 中getDeclaredFields() 与getFields() 的区别 getDeclaredFields()返回Class中所有的字段,包括私有字段.例证: package com.t ...