Flash应用程序的内存管理机制和优化方法

来源:互联网 发布:软件操作手册怎么写 编辑:程序博客网 时间:2024/05/21 00:55

1.Flash 应用程序的 性能优化建议 SGF 谈熠
2.GC ( Garbage Collector )是什么
FP 的内存通过 GC 自动管理
GC 是一段自动执行的逻辑,通过回收程序中 无用的对象 来释放内存
3.那什么是“无用的对象”?
对于原生数据类型( Boolean, String, Number, uint, int )而言:就是被删除了的数据
对于非原始数据类型:不再被 “引用” 的对象
4.被“取消引用” vs 被“删除” // 创建一个对象,并将对象的引用指向 a var a: Object = {foo:" bar "} // 把对象的应用复制给 b var b: Object = a; // “ 删除” a 的引用 delete (a); // 这是对象仍然被 b 引用 trace (b.foo); // 输出结果: “ bar”, 对象依旧存在
5.GC 如何判断无用对象
很早以前: GC 采用简单的计件法
var a: Object = {foo:" bar "} // 这个对象现在 1 个引用( a ) 计数: 1 var b: Object = a; // 现在有 2 个引用 (a 和 b) 计数: 2 delete (a); // 只是剩一个引用 (b) 计数: 1 delete (b); // 么有引用了,可以安全释放 计数: 0
6.“ 计件法”的无奈
但“计件法”遇到循环引用的时候
var a: Object = {} ; // 创建对象 b ,并包含引用到对象 a var b: Object = {foo:a}; // 然后让 a 引用 b ,此时 a,b 各记被引用一次 a.foo = b; // 在程序删除 a,b ,由于 a,b 都有计数,因此不会被 GC delete (a); delete (b);
7.现在的 GC 采用标记法
标记法 遍历所有对象 ,对无根的对象进行标记
然后 释放被标记的对象
8.有了 GC ,为什么还会内存泄漏?
GC 的触发不是根据程序的清除指令来执行,而是根据内存分配情况来执行的。内存空间越紧俏, GC 才工作越勤快。
GC 只管标记,而且内存释放是异步执行的
整个过程极不透明
未被释放的内存对象将一直被执行直到释放为止
9.常见的内存漏洞情况
动态内容,比如:
从显示列表中被移除的现实对象
忘记移除监听器的跟随鼠标的现实对象
10.GC 的非典型情况
Timer 对象一定要采用弱引用 , 否则在 Timer 结束之前,存在引用的对象不会被 GC 。
在一个类 内部 ,对类内的对象添加 eventlistener ,即便采用弱引用,这个类的实例不会被 GC ,直到那个 eventlistener 被移除之后。
从一个类的 外部 ,对这个类的实例添加 eventlistener ,不管是强 / 弱引用,这个实例都能被 GC 。
11.强制 GC 进行一次完整清扫
try {
new LocalConnection (). connect (' foo ');
new LocalConnection (). connect (' foo ');
} catch (e:*) {}
// 强迫 GC 进行一次完整的标记和内存清扫
12.帧频
13.FP 实际帧频的由来 多线程的 AVM 来实现单线程的 SWF 内容执行 Flash Player 加载的 swf AVM Marshal
14.SWF 帧频的处理原理 一个完整的 marshal 周期所执行的内容 Marshal 的执行周期和 swf 设定 帧频的匹配
15.Marshal 的执行优先级
声音
视频
动画
逻辑
FP 会用尽一切资源来满足这两项的执行需求! 逻辑排在最后,真是杯具… .
16.关于实际帧频的一些硬指标
在一般 PC 上
Marshal 的最短周期是 17ms ,相当于 60 fps
Marshal 的最长周期是 100ms
如果 SWF 所求帧频低于实际帧频,则 FP 自动降频优化
在 MAC 上
Marshal 周期长度为固定的 19ms
17.程序设计
18.简化 Flex 程序的界面结构 AS 3 的事件广播原理
19.简化 Flex 程序的界面结构 /Stage + Container 1 + Container 1.1 + Container 1.1.1 + Container 1.1.1.1 + Button 1 + Button 2 + Button 3 /Stage + Button 1 + Button 2 + Button 3 + Textfield 1 + Textfield 2
20.采用 IDisposable 接口
GC 不是内存管理!
在每个模块中实现自我清理:
21.采用层叠清除机制 Container 1 Container 1.1 Container 1.1.1 … child.dispose() child.dispose() child.dispose() 清除
22.充分使用 FP 10.1
23.FP 的版本模式
SWF 的发布版本决定了 FP 对其的执行模式
FP10.1 FP10 FP9 FP8 …
24.FP10.1 采用 Nanojit 内核
更高效的字符串处理
可深入控制的图像解压,和针对图像优化的 GC
25.使用 FP10.1 的全局异常处理 try { 你的整个程序! } catch …
26.谢谢

 

原创粉丝点击