详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用

on

  • 10,169 views

 

Statistics

Views

Total Views
10,169
Views on SlideShare
9,889
Embed Views
280

Actions

Likes
3
Downloads
157
Comments
0

3 Embeds 280

http://events.swfsh.com 219
http://www.slideshare.net 60
http://cache.baidu.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用 Presentation Transcript

  • 1. Flash/ActionScript 3.0 内存管理 路通展览展示设计(上海)有限公司 李正民 软件工程师
  • 2. Flash/ActionScript 3内存管理机制 • 数据存储 1、基元数据类型 (primitive data type) — 值类型 如:Boolean、int、Number、String和uint var _a:int = 10; var _b:int = a; _b = 9; //改变变量b的值为9 trace (_a +“ ”+_b); // 10 9 2、复杂数据类型 (complex data type) — 引用类型 如:Array、Date、Error、Point、MovieClip等等 var _array1:Array = new Array(1, 2, 3); var _array2:Array = _array1; _array2[1] = 4; trace(_array1 + "---> " + _array2); // 1 4 3 --> 1 4 3
  • 3. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 1、引用计数( Reference Counting) var _a:Object = {Name:"Mike"}; // ref(_a) 1 var _b:Object = _a; // ref(_a) 2 delete _a; // ref(_a) 1 trace(_b.Name); // Mike delete _b; // ref(_a) 0 trace(_b.Name); // undefined 通过引用计数,可以让 Flash Player决定何时释放一块内存区。 从这里也可以更好地理解复杂数据类型为引用类型
  • 4. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 引用计数的缺陷 — 两对象互相引用,循环引用 var _a:Object = {}; // ref(_a) 1    var _b:Object = {obj:_a}; // ref(_a) 2 ref(_b) 1    _a.obj= _b; // ref(_b) 2    delete(_a); // ref(_a) 1    delete(_b); // ref(_b) 1 引用计数虽然简单,也很实用,但是并不能解决所有问题。显然 在上面的实例中,引用计数是无法正常工作,因此 Flash Player的GC 也就不会去释放相应的内存块。这必然要求 Flash Player有另外的策 略去清理这些内存块。
  • 5. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 2、标识-清除法(Mark Sweeping) 可以假设内存中没有被标记的对象不再有任何活动引用,因此可 以被安全的删除
  • 6. Flash/ActionScript 3内存管理机制 • 内存释放--Flash Player策略 优点:非常准确 缺点:CPU占用率高 Flash Player解决方案: a、在满足某个条件的时刻执行 b、分段执行,不再一次完成整个过程 上述解决方案导致 Flash Player垃圾回收器操作延期执行,从而引发 下面一些问题: a、对象被删除,但是对象的 Enter_Frame事件还在继续执行 b、对象被删除,但是对象的声音、视频还在继续播放 c、对象被删除,但是对象的一个事件,动作还在继续触发 /执行
  • 7. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 1、引用计数归零:注意尽可能地将一些明显的引用计数清零 2、Actionscript 3 弱引用 a、事件弱引用 b、Dictionary弱引用 addEventListener(type:String,listener:Function, useCapture:Boolean = false,priority:int = 0, useWeakReference:Boolean = false ):void 通过弱引用,在对象被删除,但未移除事件侦听器时,防止对象 的事件函数成为永久函数。 建议:勿忘记 removeEventListener 的调用,设置监听器引用为弱引 用
  • 8. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 removedFromStage事件:从显示列表中直接删除显示对象或删除包含显示对 象的子树时调度。故可以侦听这个事件,在这个事件做对象的清理工作。 this.addEventListener(Event.REMOVED_FROM_STAGE, dispose, false, 0, true); var _btn:Sprite = new Sprite(); _btn.addEventListener(MouseEvent.MOUSE_OVER, btnOver, false, 0, true); _btn.buttonMode = true; addChild(_btn); private function dispose(e:Event):void { this.removeEventListener(Event.REMOVED_FROM_STAGE, dispose); if(_btn){ _btn.removeEventListener(MouseEvent.MOUSE_OVER, btnOver); _btn.removeEventListener(MouseEvent.CLICK, btnClick); removeChild(_btn); } _btn = null; }
  • 9. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 flash.utils .Dictionary 类的使用 public function Dictionary(weakKeys:Boolean = false) 指示Dictionary 对象在对象键上使用 “弱”引用 var _MyObj:Object = new Object(); var _myDict:Dictionary = new Dictionary(true); _myDict[_myObj] = new MovieClip(); _myObject = null // 移除_myObject 由于Dictionary 的对象键的弱引用性。故可以将一些复杂的对象 用作Dictionary 的对象键,来设置复杂对象的弱引用性。
  • 10. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 package com.gskinner.utils { import flash.utils.Dictionary; public class WeakReference { private var dictionary:Dictionary; public function WeakReference(p_object:Object) { dictionary = new Dictionary(true); dictionary[p_object] = null; } public function get():Object { for (var n:Object in dictionary) { return n; } return null; } } }
  • 11. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 public class WeakReference extends Sprite{ private var _timer:Timer = new Timer(5000, 0); private var _sound:Sound = new Sound(); private var _channel:SoundChannel; private var _complete:Boolean = true; public function WeakReference() { _timer.addEventListener(Timer Event.TIMER, showMemory, false, 0, true); _timer.start(); testSound(); } private function showMemory(evt:TimerEvent = null):void{ var _date:Date = new Date(); trace("current time : " + _date.toLocaleString() + " " + System.totalMemory / (1000 * 1000) + "MB"); _date = null; if (true == _complete) testSound(); }
  • 12. Flash/ActionScript 3内存管理机制 • 内存释放--编码规则 private function testSound():void{ if(null == _sound) _sound = new Sound(); _sound.load(new URLRequest("framer.mp3")); _channel = _sound.play(); _channel.addEventListener(Event.SOUND_COMPLETE, complete); _complete = false; } private function complete(evt:Event = null):void{ _channel.removeEventListener(Event.SOUND_COMPLETE, complete); _channel = null; _sound = null; _complete = true; } Flash Player 9/10 执行结果不一样,在版本 9中会出现内存长 时间得不到释放,并不停累积,但是最终会释放, 10不会出现这种情 况。这种情况导致了 Dewar's项目客服端直接死掉。利用 Dictionary 可以解决这个问题
  • 13. 感谢您的关注!