robotlegs

http://www.robotlegs.org/

Robotlegs is a pure AS3 micro-architecture (framework) with a light footprint and limited scope. Simply put, Robotlegs is there to help you wire your objects together. It provides the glue that your application needs to easily function in a decoupled way. Through the use of automated metadata based dependency injection Robotlegs removes boilerplate code in an application. By promoting loose coupling and avoiding the use of Singletons and statics in the framework Robotlegs can help you write code that is highlytestable.

运用依赖注入在MVC框架下,实现了依赖自动化,确实很方便。

中文教程:https://github.com/robotlegs/robotlegs-documentation/blob/master/best-practices-zh-cn.textile

PV3D中removeChild内存泄露问题

问题描述
今天cailven用pv3d做Parkroyal Mt demo的时候一直很卡,经过他反复测试,发现是因为里面反复使用了pv3d内建的removeChild()方法。一开始认为是贴图无法被清空造成的,后来他改成了线框贴图,依然很卡。
问题分析
他的代码是这样的。
var agency:DisplayObject3D=new DisplayObject3D();
agency.removeChild(beforetarget);
scene.addChild(beforetarget);
scene.removeChild(nowtarget);
agency.addChild(nowtarget);
beforetarget=nowtarget;
他一开始以为是贴图信息无法清楚造成的,后来把材质改成了线框去跑,依然卡的不行,一打开时候有27fps,这段代码运行个20多遍在线框的情况下依然变成了5fps。
但是我的项目要求又必须得大量使用加载入容器,然后移除到场景的方法。
现在确定就是这段代码惹得祸,只要不removeChild,不addChild,程序可以一直维持27fps,一用就开始越来越卡。
问题解决
因为pv3d的内建removeChild有bug不完善,所以他跳过了这个步骤,直接使用了代码:
var agency:DisplayObject3D=new DisplayObject3D();
agency=nowtarget;
直接用agncy指过去,运行下来确实不卡了。
(感谢Cailven提供)

Flash全屏输入文本框不能输入问题

问题描述:最近做AMG多触点程序,遇到flash全屏后文本框不能输入问题。flash10,用swf全屏后可以输入;用exe全屏后不能输入。air2,用exe全屏可以输入。

问题解决:Google了下:

在全屏模式下,用户无法在文本输入字段中输入文本。所有键盘输入和键盘相关的 ActionScript 在全屏模式下均会被禁用,但将应用程序返回标准模式的键盘快捷键(例如按 Esc)除外。

http://livedocs.adobe.com/flash/9.0_cn/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000352.html

CS5中Flash 10的flash.events.TouchEvent

问题描述:今天做AMG的时候以前的代码运行出现错误:TypeError: Error #2007: 参数 type 不能为空。

问题分析:仔细检查报错信息,发现是flash.events.TouchEvent.MOUSE_MOVE为undefined。原来是CS5的Flash 10中加入了flash.events.TouchEvent类,导致于原来冲突。

问题解决:把以前的类改到flash.tuio包里就可以了。

周期定时器:一个Flash Player10.1中不得不关注的特性

在Flash Player 10.1中,Adobe引入了一个全新的Periodic timer定时器概念,它可以改善浏览器中swf内容的CPU使用。在浏览器中的swf文件在不可见状态下(如窗口最小化,隐藏标签tab或页面滚动到swf文件以外的区域)会自动调节以降低资源消耗。(注:之前的Flash Player版本虽然不会渲染图形,但仍然在全速运行AS脚本,音视频编码解码等。)具体改变如下:

可见状态下:
1)SWF的帧频frameRate会被限制和校准为Jiffy时间模式(如最高60fps),但是目前的10.1 beta3仍然保留最高120fps的限制,这在正式版中将会被改变。
2)计时器(AS2中的Interval和AS3中的Timer)也会校准为Jiffy。
3)LocalConnection也同样会被校准。因此消息从一个swf文件到另一个swf文件至少需要33ms(也有说是40ms)。
4)Video不会做改变,他们可以在任何帧频下播放而不受影响。

不可见状态下:
1)SWF的帧频被锁定为2fps,不进行任何渲染。
2)计时器(AS2中的Interval和AS3中的Timer)被锁定为最多2次/秒。
3)LocalConnection也被锁定为最多2次/秒。
4)Video视频解码(不渲染和显示)只占用CPU空闲时间。
5)为了兼容音频,当swf中有音频在播放的时候,swf的帧频会被调整为8fps,同样swf中计时器和LocalConnection也做相应调整。

应该说这个特性非常有利于网络上flash应用的普及,但是也存在着潜在的风险。比如某些情况下,我们的应用程序需要在不可见的时候仍然保持着正常的运转,比如计时器的正确运行,某些事件按时发生,某些下载任务及时进行等等。当swf的帧速下降到2fps的时候,其影响是显而易见的。因此我们需要在swf不可见的时候仍然保持较高或者正常的帧速。目前有两种解决方法:

利用播放一个音频来使swf在不可见状态下维持8fps:
var gs:Sound = new GhostSound();
gs.play(0, int.MAX_VALUE, new SoundTransform(0));

用js的setInterval方法去调用swf的ExternalInterface.addCallback的方法,从而间接实现一些在不可见状态下必须全速运行的一些动作:
setInterval(callSWF, 50);
function callSWF()
{
var swf=document.getElementById("swfID");
if(swf)swf.execSomeMethod();
}

关于convert Flash to iPhone or iPad

一直有人说flash直接能转成iPhone或iPad,最近vin也说可以。

在此,再次说明以下,flash转iOs是可以的,不过只限于简单的程序。比如一个正方形上下动动什么的。如果像现在iPhone上的游戏这么复杂的,都不行。如果flash library里的东西比较多,那么Flash CS5 publish的时候会当掉。

以下是CS5转iPhone的官方方法:
http://help.adobe.com/en_US/as3/iphone/WS789ea67d3e73a8b2-240138de1243a7725e7-8000.html

====================================

还有一个第三方的插件,但是之前我试了无效。最近出来新版本:ELIPS Studio 4,最近测试了一下。此插件号称可以把flash转成Xcode项目,我测试下来确实可以转换,但是用Xcode打开发布就会出现错误,丢失文件,而且里面的架构已经不是iPhone的,估计能行也有性能上的隐患。

在这里给出此插件连接:http://developer.openplug.com/

如有发布成功的兄弟请通知我:)

Google Analytics在SWFAddress下检测不完整的问题

问题描述:
denizen中国站:http://cn.denizen.com/denizen-china/#/home
Google分析只能追踪到/denizen-china/,#符号后面都追踪不到。

问题分析与解决:
追踪代码是放在</body>标记前,代码如下:

<script type="text/javascript">

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-18173256-1']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? ' https://ssl' : ' http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

</script>

因为位置比较靠后,可能和其他js有冲突,所以把这段追踪代码提到最前。
发现还是不行,把

_gaq.push(['_trackPageview']);

改为

_gaq.push(['_trackPageview', document.location.pathname + document.location.hash.replace("#/","")]);

还可以把

<script type="text/javascript" src="js/swfaddress.js"></script>

改为

<script type="text/javascript" src="js/swfaddress.js?tracker=pageTracker._trackPageview"></script>

大功告成。