﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-vinny</title><link>http://www.blogjava.net/vinny/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 15:03:48 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 15:03:48 GMT</pubDate><ttl>60</ttl><item><title>果冻特效弹出窗口</title><link>http://www.blogjava.net/vinny/archive/2008/08/13/221625.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Wed, 13 Aug 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/13/221625.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/221625.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/13/221625.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/221625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/221625.html</trackback:ping><description><![CDATA[<h3><a title="Permanent Link: 果冻特效弹出窗口" href="http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html" rel="bookmark">果冻特效弹出窗口</a></h3>
<div class="entry">
<p>这个JellyPanel继承自panel，用户可用直接使用，并可自加其它逻辑及子控件等。有两个参数，一为vibrationCount，表示弹出时振动的重复值；一为delayNumber，表示振动间隔。这两个参数结合使用，可以调节弹出外观。</p>
<p></p>
<p>
<object height="360" width="544" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" xcodebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="_cx" value="14393" /><param name="_cy" value="9525" /><param name="FlashVars" value="" /><param name="Movie" value="http://blog.sban.com.cn/download/2008/04/jellyexample.swf" /><param name="Src" value="http://blog.sban.com.cn/download/2008/04/jellyexample.swf" /><param name="WMode" value="Transparent" /><param name="Play" value="0" /><param name="Loop" value="-1" /><param name="Quality" value="High" /><param name="SAlign" value="LT" /><param name="Menu" value="-1" /><param name="Base" value="" /><param name="AllowScriptAccess" value="" /><param name="Scale" value="NoScale" /><param name="DeviceFont" value="0" /><param name="EmbedMovie" value="0" /><param name="BGColor" value="" /><param name="SWRemote" value="" /><param name="MovieData" value="" /><param name="SeamlessTabbing" value="1" /><param name="Profile" value="-1" /><param name="ProfileAddress" value="" /><param name="ProfilePort" value="1869767529" /><param name="AllowNetworking" value="all" /><param name="AllowFullScreen" value="false" />
<embed src="http://blog.sban.com.cn/download/2008/04/jellyexample.swf" height="360" width="544" quality="high" wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" 
    ></embed></object></p>
    <p>在这里下载源码：<a href="http://groups.google.com/group/flex5/web/JellyAlertEffectsExample.zip">JellyAlertEffectsExample.zip</a></p>
    <p>读者可自行采集欠阻尼曲线点，demo的采样来源于网上。本demo仅供学习与研究之用。本demo是对DistortionEffects的二次开发，DistortionEffects是<a href="http://weblogs.macromedia.com/auhlmann/">auhlmann</a>开发的。</p>
    <p>可以在mac,ubuntu中找到它的影子。实现原理都是类似的，大意是利用欠阻尼曲线控制弹出窗口的四角坐标，用不同的语言有不同的实现方式。</p>
    <p>欠阻尼点非我采集，使用的是<a href="http://blog.ezse.com/">YX.Shawn</a>在网上公布的采样。除了参考了他的blog，同时还参照了<a href="http://weblogs.macromedia.com/auhlmann/">auhlmann</a>开发的DistortionEffects的例子，当然也使用了他开发的组件。这个效果非我首创，YX.Shawn早在去年便已实现，只是他没有公布源码。</p>
    <p><a href="http://blog.sban.com.cn/">sban</a> 2008年3月28日于北京朝阳门<br />
    本站采用创作<a href="http://creativecommons.org/licenses/by-nc/2.5/deed.zh">共用许可</a>署名，非商业。 如需转载，请保留<a href="http://blog.sban.com.cn/">原文作者</a>及链接。<br />
    原文链接： http://blog.sban.com.cn/2008/04/01/jelly-effect-alert-window.html</p>
    </div>
<img src ="http://www.blogjava.net/vinny/aggbug/221625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-13 10:14 <a href="http://www.blogjava.net/vinny/archive/2008/08/13/221625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex Mac弹出窗口</title><link>http://www.blogjava.net/vinny/archive/2008/08/13/221624.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Wed, 13 Aug 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/13/221624.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/221624.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/13/221624.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/221624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/221624.html</trackback:ping><description><![CDATA[转自：http://www.zhuoqun.net/article.asp?id=672<br />
<a href="http://blog.xsive.co.nz/archives/244" target="_blank">Campbell</a> 写了一个弹出窗口（popup）的例子，提供源码下载。<br />
<br />
<img title="在新窗口打开图片" style="cursor: pointer" alt="" src="http://photo1.bababian.com/upload3/20070903/61B91B15FD7962167A3AABD79124C02C_500.jpg" border="0" /><br />
<br />
<a id="r_l_0" href="http://blog.xsive.co.nz/flex_source/mac_popup_2/index.html" target="_blank">运行示例</a>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;<a id="r_l_1" href="http://blog.xsive.co.nz/flex_source/mac_popup_2/srcview/" target="_blank">查看源码</a> <br />
<img src ="http://www.blogjava.net/vinny/aggbug/221624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-13 10:14 <a href="http://www.blogjava.net/vinny/archive/2008/08/13/221624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KKPlayer.js</title><link>http://www.blogjava.net/vinny/archive/2008/08/08/220814.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Fri, 08 Aug 2008 00:48:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/08/220814.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/220814.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/08/220814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/220814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/220814.html</trackback:ping><description><![CDATA[window.clipboardData.setData("Text",clipBoardContent);<br />
调用顺序:<br />
function init<br />
&nbsp;&nbsp;g_PlayerScript ：嵌入的script标签<br />
&nbsp;&nbsp;g_container&nbsp; ： KKPlayer容器<br />
function collectParams() ：设置KKPlayer参数<br />
function play(oParams) :载入播放器，播放<br />
function ppplayerInit()<br />
386 function KKPlayer_getMovieUrl: 分为几种，现在用的为：&nbsp; 1317:/dddd/ddd/d<br />
240 function getMovieUrlByIdPath: 得到实际路径<br />
function KKPlayer_setMovieInfoAndPlay(needCDN) ：调用getCDNManageData<br />
function getCDNManageData(needCDN)：得到一些未知数据<br />
499 function KKPlayer_setMovieInfo()： 播放！！！！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _xlPlaydataPV(用于得到未知数据) KKPlayer_formateCID
<img src ="http://www.blogjava.net/vinny/aggbug/220814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-08 08:48 <a href="http://www.blogjava.net/vinny/archive/2008/08/08/220814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在FLEX中真正的隐藏一个组件</title><link>http://www.blogjava.net/vinny/archive/2008/08/07/220762.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Thu, 07 Aug 2008 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/07/220762.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/220762.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/07/220762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/220762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/220762.html</trackback:ping><description><![CDATA[一直被这个问题困扰，就是在设置UI的Visible的时候，改组件的位置一直被占着，比较恶心，今天在这里发现了一个方法，操作方法如下<br />
<br />
设置：<strong><span style="color: #00cc33">includeInLayout为false即可</span></strong> 
<img src ="http://www.blogjava.net/vinny/aggbug/220762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-07 20:26 <a href="http://www.blogjava.net/vinny/archive/2008/08/07/220762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用as3中的getDefinitionByName函数实现拼写类并动态创建类的实例</title><link>http://www.blogjava.net/vinny/archive/2008/08/07/220761.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Thu, 07 Aug 2008 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/07/220761.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/220761.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/07/220761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/220761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/220761.html</trackback:ping><description><![CDATA[<p>使用as3中的getDefinitionByName函数实现动态拼写类并动态创建类的实例<br />
</p>
<blockquote>
<p><font style="background-color: #c0c0c0"><strong>public function getDefinitionByName(name:String):Object</strong><br />
返回参数 name 中指定的类引用<br />
<br />
<strong>参数</strong>&nbsp;&nbsp;name:String - 类名称 <br />
<strong>返回</strong>&nbsp;&nbsp;Object - 返回参数 name 中指定的类引用<br />
<strong>错误</strong>&nbsp;&nbsp;ReferenceError - 找不到参数 name 对应的公共定义</font></p>
<p>as3中的getDefinitionByName函数是 返回 name 参数指定的类的类对象引用。 </p>
<p>这样就可以使用这个方法根据已知类的路径的字符串来获取类的类对象引用。这样就可以利用这个特性让flash动态创建类的实例... </p>
<p>但问题是:</p>
<p>1. 使用getDefinitionByName方法获得的类必须是在发布的时候被编译到swf文中的,否则就会报错:"ReferenceError: Error #1065: 变量 &lt;类的名字&gt; 未定义。"</p>
<p>2. 由于使用import导入的类(只是作为查找类的路径)并不会在发布swf的时候被编译进去(当然flash.*包里面的类本身就是player中的),只用在代码中使用到的类才会被编译进去...</p>
<p>&nbsp;</p>
<p>那么,要使用这个方法来实现动态执行怎么办? 只有把可能需要的所有类包含在代码中(比如在定义变量的类型声名时使用 *),并且在开始声名此类，声名时可以随便使用个名字，这样才能使用getDefinitionByName方法...<br />
实际上getDefinitionByName所获得的类名就是前面你所做的声名的名字引用//-------------------------------------------------<br />
import com.ooph.parser.*;<br />
//包内有ParserWeb类<br />
var ss:ParserWeb;<br />
//在此处声名ParserWeb类，名为ss(名字不用与下面实例名的相同)<br />
var sortStr:String="Web";<br />
var P:Class = getDefinitionByName("com.ooph.parser.Parser"+sortStr) as Class;<br />
//注意这里要写完整的类路径 "com.ooph.parser.Parser"+sortStr<br />
var newParser:* = new P();</p>
</blockquote>
 <img src ="http://www.blogjava.net/vinny/aggbug/220761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-07 20:26 <a href="http://www.blogjava.net/vinny/archive/2008/08/07/220761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex中Image控件设置complete效果</title><link>http://www.blogjava.net/vinny/archive/2008/08/07/220759.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Thu, 07 Aug 2008 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/07/220759.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/220759.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/07/220759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/220759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/220759.html</trackback:ping><description><![CDATA[<div>以下的例子展示如何通过使用Mxml,css或者CS设置completeEffect属性来为Image控件增加一个complete效果。</div>
<div><script language="JavaScript">
function change(el) {
style="display: none;"
whichEl = document.getElementById(el) 
var sb=$('stateBut1');
if (whichEl.style.display == 'none') {
   whichEl.style.display   = 'block'; 
   sb.innerHTML='<font color="#ff0000">隐藏代码</font>';
} else {
     whichEl.style.display   = 'none';
  sb.innerHTML='<font color="#ff0000">显示代码</font>';
     whichEl.witdh="300px";
   }
}
</script>&nbsp;<a id="stateBut1" onclick="change('myCanvas1'); return false"><font color="#ff0000">隐藏代码</font></a>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
<div id="myCanvas1" style="display: block; width: 720px; position: relative; height: 1780px" witdh="300px">
<pre class="code">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- http://blog.flexexamples.com/2008/06/29/setting-a-complete-effect-on-an-image-control-in-flex/ --&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white"&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
private function button_click(evt:MouseEvent):void {
image.load("assets/Fx.png");
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:ApplicationControlBar dock="true"&gt;
&lt;mx:Button id="button"
label="Load Image"
click="button_click(event);" /&gt;
&lt;/mx:ApplicationControlBar&gt;
&lt;mx:Image id="image"
completeEffect="Fade"
maintainAspectRatio="true"
width="100%"
height="100%" /&gt;
&lt;/mx:Application&gt;
</pre>
<pre class="code">或者用AS实现（1）</pre>
<pre class="code">
<pre class="code">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- http://blog.flexexamples.com/2008/06/29/setting-a-complete-effect-on-an-image-control-in-flex/ --&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white"&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
<strong style="color: red">import mx.effects.*;
private function init():void {
image.setStyle("completeEffect", Fade);
}</strong>
private function button_click(evt:MouseEvent):void {
image.load("assets/Fx.png");
}
]]&gt;
&lt;/mx:Script&gt;
&lt;mx:ApplicationControlBar dock="true"&gt;
&lt;mx:Button id="button"
label="Load Image"
click="button_click(event);" /&gt;
&lt;/mx:ApplicationControlBar&gt;
&lt;mx:Image id="image"
maintainAspectRatio="true"
width="100%"
height="100%"
<strong style="color: red">initialize="init();"</strong> /&gt;
&lt;/mx:Application&gt;
</pre>
<pre class="code">（2）</pre>
<pre class="code">&nbsp;</pre>
<pre class="code">
<pre class="code">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;!-- http://blog.flexexamples.com/2008/06/29/setting-a-complete-effect-on-an-image-control-in-flex/ --&gt;
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white"
initialize="init();"&gt;
&lt;mx:Script&gt;
&lt;![CDATA[
import mx.containers.ApplicationControlBar;
import mx.controls.Button;
import mx.controls.Image;
import mx.effects.*;
private var button:Button;
private var image:Image;
private function init():void {
button = new Button();
button.label = "Load Image";
button.addEventListener(MouseEvent.CLICK, button_click);
var appControlBar:ApplicationControlBar;
appControlBar = new ApplicationControlBar();
appControlBar.dock = true;
appControlBar.addChild(button);
Application.application.addChildAt(appControlBar, 0);
image = new Image();
image.maintainAspectRatio = true;
image.percentWidth = 100;
image.percentHeight = 100;
image.setStyle("completeEffect", Fade);
addChild(image);
}
private function button_click(evt:MouseEvent):void {
image.load("assets/Fx.png");
}
]]&gt;
&lt;/mx:Script&gt;
&lt;/mx:Application&gt;
</pre>
</pre>
</pre>
</div>
<p>&nbsp;</p>
<div>查看Demo演示</div>
<div>
<p align="center"><embed src="http://blog.flexexamples.com/wp-content/uploads/Image_completeEffect_test/bin/main.swf" width="425" height="355" type="application/x-shockwave-flash" wmode="transparent"></embed></p>
</div>
<img src ="http://www.blogjava.net/vinny/aggbug/220759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-07 20:23 <a href="http://www.blogjava.net/vinny/archive/2008/08/07/220759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flash Player 9中的资源管理策略</title><link>http://www.blogjava.net/vinny/archive/2008/08/07/220758.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Thu, 07 Aug 2008 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2008/08/07/220758.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/220758.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2008/08/07/220758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/220758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/220758.html</trackback:ping><description><![CDATA[<p><strong>原文</strong> </p>
<p><a href="http://www.adobe.com/devnet/flashplayer/articles/resource_management.html" target="_blank">Resource management strategies in <a onclick="javascript:tagshow(event, 'Flash');" href="javascript:;" target="_self"><u><strong>Flash</strong></u></a> Player 9 </a>
<p><strong>翻译</strong>
<p>Actionscript 3.0带给Flash开发人员更加快的代码执行和许多新的API增强，站在开发人员的立足点来说，相对之前的版本这些改变需要更高级别的可靠性。本文重点讨论Actionscript 3.0中新资源管理特性，以及粗略的讨论下Actionscript 3.0中那些可以帮助您跟踪和更加有效的管理内存的工具。
<p>Actionscript 3.0中影响资源管理的最大的改变是其新的显示列表模型。在Flash Player 8及之前版本中，当一个显示(display)对象被从屏幕被移除时（使用removeMovie 或 unloadMovie)，该显示对象及其子对象将被立即从内存总移除并且代码即可终止，Flash Player 9带来了更加灵活的显示列表模型，在该模型中，将显示对象（sprites、movie clips等）作为普通对象一样对待。
<p>这意味着开发人员现在可以做一些真正酷的事情，比如重排根目录（reparenting：将显示对象从一个显示列表移到另一中)和从已经载入的SWF中实例化显示对象。不幸的是，它也同时意味着现在显示对象与<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target="_self"><u><strong>其他</strong></u></a>别的对象一样被垃圾收集器同等对待，它带来了大量有意思（可能不明显）的问题。
<p><strong>为什么资源管理是个问题</strong>
<p>Flash开发人员看了Actionscript 3.0中这些新的资源管理考虑可能觉得概念很复杂，另一方面，Java开发人员可能觉得没什么。这些差距是可以理解的：Flash开发人员不习惯在基本的最佳的实践之外实现手工资源管理——如当不再使用时删除引用——反之Java开发人员之前就将其贯穿所有中了。这些问题对于大多数现代的内存管理语言也同样会出现，不幸的是，现在没有完全避免它们的方法。
<p>尽管资源管理是<a onclick="javascript:tagshow(event, '%C9%FA%BB%EE');" href="javascript:;" target="_self"><u><strong>生活</strong></u></a>之本，Flash遇见了很多在其他语言中罕见的挑战（包括<a onclick="javascript:tagshow(event, 'Flex');" href="javascript:;" target="_self"><u><strong>Flex</strong></u></a>）。Flash内容往往包含许多闲置或易交互的执行代码——不像Java和Flex他们大多数是交互式的。这意味着只有用户交互时才执行CPU密集代码。另外，Flash工程比其他平台更频繁的从第三方资源载入（可能使用贫编码标准）外部内容。Flash开发人员也只有更少的工具、剖析器和框架可以使用。
<p>最后，Flash开发人员通常有着很少的非正式的编程<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><u><strong>工作</strong></u></a>背景。我所知道的大部分Flash开发人员有着<a onclick="javascript:tagshow(event, '%D2%F4%C0%D6');" href="javascript:;" target="_self"><u><strong>音乐</strong></u></a>、艺术、商业、哲学或只是除编程外的任何背景。这种多元化的结果带来另人震撼的创意和内容，但是该社区却没有真正准备好处理资源管理问题。
<p><strong>问题1：动态内容</strong>
<p>在资源管理中遇到的其中一个明显的问题是与sprites（或其他显示对象）有关，您动态实例化它们，然后希望在以后的时间里面移除它们。当您将显示对象从场景中移除后，因为它们不再活动并且挂死在显示列表中，它仍会一直存在内存中。如果您做好了清除它的所有引用的工作，那们在下次垃圾收集器运行收集时，该剪接将会被从内存中移除。基于松散内存管理使用的特性，这将有很多不确定性。
<p>注意到这一点非常的重要，显示对象不只一直占用内存，它还会一直执行&#8220;空闲&#8221;代码，如定时器、进入帧以及监听是否从某一范围出来的监听器。
<p><strong>以下几个示例可以帮助您说明该问题：</strong>
<p>某一游戏sprite监听它自己的enterFrame事件，每次帧移动时，该应用就会处理某些计算以决定它是否接近其他<a onclick="javascript:tagshow(event, '%D3%CE%CF%B7');" href="javascript:;" target="_self"><u><strong>游戏</strong></u></a>元素。在Actionscript 3.0中，即使您已经将该sprite从显示列表中移除并将所有对它的应用都置为null，除非它已经被垃圾收集器给移除后，在每个帧移动时，该应用仍会一直运行该代码。您必须记住要当该sprite并移除时必须明确将enterFrame监听器移除。 </p>
<p>考虑一个通过注册场景的mouseMove来跟随鼠标的电影片段（movie clip）——在新的事件模型下这是达到该效果的唯一方式。除非您记得移除监听器，每次鼠标移动时，该片段将一直会执行该代码，即使在片段被&#8220;删除&#8221;后。缺省的，因为场景中为了事件发布有一个指向它的引用，该片段一直会执行。我将在后面的文章中讨论如何避免这样的问题 </p>
<p>现在想象一下以上示例蕴含的含义，在垃圾收集器回收前移除多个sprites——或者如果移除某一sprites所有的引用失败会发生什么。您很容易一不小心就超出CPU最大处理能力，进而使得您的应用或游戏慢得像在爬，甚至搞得用户计算机完全停顿。当前还没有办法强行让Flash Player杀死一个显示对象并停止它的执行。至多只能在该对象被从显示中移除时由Flash开发人员在手动这样做。
<p><strong>问题2：已载入的内容</strong>
<p>记住现在已载入的SWF的内容也是和其他别的对象一样被同等对待的，并且您可以开始想象下您在载入内容时可能会遭遇到的某些问题。类似其他显示对象，当前没有方法可以直接将已载入SWF和它的内容从内容中移除。调用Loader.unload只是简单将载入器指向SWF的应用置空；它将继续存在并保持执行直到它被下次垃圾收集器回收掉（确保所有对已载入内容的其他引用都已被完整的清除）。
<p><strong>考虑以下两个场景：</strong>
<p>您创建一个用来载入您的实验Flash工程的shell。这一实验工作是尖端技术,并把CPU的资源已经用到了极限 。某一用户点击某一按钮来载入一个实验，查看它，然后再点击某一按钮来载入第二个实验，如果到第一个实验的所有引用都已经被清除，它将继续在后台运行，当第二个实验在同一时刻运行时，很可能会出现最大处理能力溢出。
<p>某一客户委托您创建一个应用来载入其他开发人员创建的Actionscript 3.0 SWFs。该开发人员增加了到场景的监听器或其他别的如创建了一个到其自己内容的外部引用，它将内存中活动并且继续消耗CPU资源直到用户退出您的应用。就算该载入的内容没有任何外部引用，它仍然会继续无限期的执行直到被下次垃圾收集器回收。 </p>
<p>当您设计一个载入不可信内容的应用时，觉察到这非常重要——在您卸载它后该代码仍会继续执行。虽然该内容会遵循Flash Player安全模型规范运行，但在您的应用开发过程中考虑一些潜在的漏洞仍然是一个好主意。
<p><strong>使用System.totalMemory</strong>
<p>尽管System.totalMemory是一个简单工具，但它是重要的因为在Flash中它是开发人员可以使用的第一个运行时剖析工具。它可以让您监控Flash Player运行时用了多少内存。这使得您在开发中有一定的能力调整您自己工作而不用使用系统监视器。更重要的，它使得您可以在给用户带来一系列问题前超前的处理您的内容中的重大内存泄露成为可能。释出一个错误然后终止您的应用总是好于使用户系统停顿或者甚至完全的死机。
<p>这是一个您如何可以做到这的简单示例：
<blockquote dir="ltr" style="margin-right: 0px">
<p>import flash.system.System;<br />
import flash.net.navigateToURL;<br />
import flash.net.URLRequest;<br />
...<br />
// check our memory every 1 second:<br />
// 每秒检查一下我们的内存:<br />
var checkMemoryIntervalID:uint = setInterval(checkMemoryUsage,1000);<br />
...<br />
var showWarning:Boolean = true;<br />
var warningMemory:uint = 1000*1000*500;<br />
var abortMemory:uint = 1000*1000*625;<br />
...<br />
function checkMemoryUsage() {<br />
&nbsp;&nbsp; if (System.totalMemory &gt; warningMemory &amp;&amp; showWarning) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // show an error to the user warning them that we're running out of memory and might quit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 向用户显示一个错误警告他们我们内存溢出并且可能要退出了<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // try to free up memory if possible<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果可能的话试图释放内存<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showWarning = false; // so we don't show an error every second<br />
&nbsp;&nbsp;&nbsp; } else if (System.totalMemory &gt; abortMemory) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // save current user data to an LSO for recovery later?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将用户数据保存到LSO中以在以后恢复?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abort();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
function abort() {<br />
&nbsp;&nbsp; // send the user to a page explaining what happpened:<br />
&nbsp;&nbsp; // 发送给用户一个页面解释发生了什么：<br />
&nbsp;&nbsp; navigateToURL(new URLRequest("memoryError.html"));<br />
}</p>
</blockquote>
<p>&nbsp;</p>
<p>
<p>很明显以上代码还有很多方式可以增强，但是希望该代码能够演示该处理背后的基本概念。
<p>注意到总内存（totalMemory）是单一进程中的共享值是重要的。一个单一进程可能只是一个浏览器窗口，或者所有打开的浏览器窗口，视乎于浏览器、操作系统以及该窗口是符合打开的。例如，在Mac OS X中，所有的Safari浏览器窗口共享一个单一的进程和总内存(totalMemory)值。而在Microsoft Windows中进程数和占用内存值就更加的费解。
<p><strong>弱引用</strong>
<p>在Actionscript 3.0 中其中一个我真的很高兴看到的特性是弱引用的实现。它可以描述为不被垃圾收集器计算以决定某一对象是否可以被收集的对对象的引用。如果某一对象剩余的唯一的引用是弱引用的话，那们该对象将在垃圾收集器的下次运行时被移除。
<p>不幸的是，弱引用只在两种情况下支持。第一是事件监听器——这太伟大了因为事件监听器是导致垃圾收集问题的最常见引用之一。我强烈的推荐您总是在监听器上使用弱引用。要做到这点，要在调用addEventListener时给第五个参数传递true，如下所示：
<p>someObj.addEventListener("eventName",listenerFunction,useCapture,priority,weakReference);<br />
stage.addEventListener(Event.CLICK,handleClick,false,0,true);<br />
// the reference back to handleClick (and this object) will be weak.<br />
// 到 handleClick（和该对象）的引用将是弱的。
<p>关于本章节要更多了解,请阅读我blog上的关于弱引用监听的文章。
<p>Actionscript 3.0还在字典对象（Dictionary object）中支持弱引用。只需要在实例一个新的字典事向第一个参数传递true即可让它使用弱引用作为它的关键字。如下所示：
<p>var dict:Dictionary = new Dictionary(true);<br />
dict[myObj] = myOtherObj;<br />
// the reference to myObj is weak, the reference to myOtherObj is strong<br />
// 指向myObj的引用是弱的，指向myOtherObj的引用是强的。
<p><strong>从这里通往何方</strong>
<p>资源管理是Actionscript 3.0 开发的重要部分。忽略本文中描述的问题可能的结果就是迟缓的内容（应用），此外，也有潜在的完全拖垮用户系统的风险。现在再也没有任何方法可以直接将显示对象从内存中移除并且停止它的代码执行——这意味着在某一应用中Flash开发人员有责任在对象不再需要使用的时候将其完全的清理妥当。
<p>虽然Actionscript 3.0实质上提高了开发人员在他们应用中管理资源必须做的工作量，但是在Flash Player 9提供了新的工具来帮助管理内存的使用。将这些新工具和有效的策略和方法配对起来（关于该主题，请查看本文的姊妹篇：理解Flash Player 9垃圾收集）可以使得您在即将到来的Flash和Flex工程中成功的管理资源。
<p>更多信息，请务必访问Flash开发人员中心和Flash Player开发人员中心。 </p>
<img src ="http://www.blogjava.net/vinny/aggbug/220758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2008-08-07 20:21 <a href="http://www.blogjava.net/vinny/archive/2008/08/07/220758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>英中繁简编程术语对照</title><link>http://www.blogjava.net/vinny/archive/2007/11/05/158262.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Mon, 05 Nov 2007 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2007/11/05/158262.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/158262.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2007/11/05/158262.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/158262.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/158262.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/vinny/archive/2007/11/05/158262.html'>阅读全文</a><img src ="http://www.blogjava.net/vinny/aggbug/158262.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2007-11-05 14:33 <a href="http://www.blogjava.net/vinny/archive/2007/11/05/158262.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Word</title><link>http://www.blogjava.net/vinny/archive/2007/11/05/158261.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Mon, 05 Nov 2007 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2007/11/05/158261.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/158261.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2007/11/05/158261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/158261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/158261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/vinny/archive/2007/11/05/158261.html'>阅读全文</a><img src ="http://www.blogjava.net/vinny/aggbug/158261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2007-11-05 14:29 <a href="http://www.blogjava.net/vinny/archive/2007/11/05/158261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用于管理活动资源的通用模式 </title><link>http://www.blogjava.net/vinny/archive/2007/11/05/158240.html</link><dc:creator>vinny</dc:creator><author>vinny</author><pubDate>Mon, 05 Nov 2007 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/vinny/archive/2007/11/05/158240.html</guid><wfw:comment>http://www.blogjava.net/vinny/comments/158240.html</wfw:comment><comments>http://www.blogjava.net/vinny/archive/2007/11/05/158240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vinny/comments/commentRss/158240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vinny/services/trackbacks/158240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/vinny/archive/2007/11/05/158240.html'>阅读全文</a><img src ="http://www.blogjava.net/vinny/aggbug/158240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vinny/" target="_blank">vinny</a> 2007-11-05 13:39 <a href="http://www.blogjava.net/vinny/archive/2007/11/05/158240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>