flash的工作流是她的一个重要特性,由于flash强大的表现层的实力和快捷的开发方式,flash成了前端的重要解决方案。但是flashplayer由于种种原因,在性能,跨平台,和一些特殊场合表现不够好,催生了很多的第三方flash播放器,adobe对mozilla开源了avm2的代码,但是并不包括显示渲染部分,渲染部分确实是比较重要的部分,资源管理,重绘,脏矩形…
ok,言归正传,第三方播放器的出现,最初是为了解决swf在linux下播放的问题。最早的似乎是一个叫做gameswf的开源项目,最新版本是2009-08的了,我测试了一下,只支持到as2,而且对as代码的解释似乎问题不少。不过作为比较老的一个项目,他给后来的好些个播放器比如gansh和解决方案比如scaleform提供了指导。
先说Scaleform 这是个很牛的东西,我第一次知道它是因为星际2的UI用了他做引擎,后来看了下确实很牛叉,他的理念就是利用flash成熟的开发方式和丰富的积累,但是对swf文件做了自己的解释。Scaleform GFx的核心内容为丰富的多媒体引擎支持矢量图形硬件加速技术,将矢量图形栅格化为现代3D视频卡能够渲染的三角形。将数据转换为三角形,导出的矢量图形的速度比传统的光栅处理软件快很多倍,并可以在高性能多媒体环境中使用。但是对flash的支持也只是到了as2.不知道还会不会往下继续。顺便说下,他们的引擎商业用很贵.
另外两个linux 第三方播放器是gansh和swfdec了,gansh有个gnash-tools 的命令行工具协助开发,swfdec的稳定性似乎更高点,这两款也都是开源的。但是支持的版本似乎也没有到as3.他们的代码在sourceforce上也都能找到
接下来一个比较厉害的是Lightspark 。他包括基于 OpenGL 的渲染、ActionScript 3.0 支持、提供 Mozilla 兼容的插件等亮点。应该是目前比较好的第三方播放器,而且也是开源的,可以扩展自己的需要,应用到特殊需求的地方。
flash是个好东西,好在他完备而成熟的开发工作流,庞大的用户基数和知识库。和LLVM和SDL和LUA和很多意想不到的领域都有交集,似乎成了一种粘合剂,但是受到flashplayer所限,很多变态需求无法满足,在AIR没出现前,就有一堆的zinc,MDM的强化flash的周边工具,但是他们的本质还是利用flashplayer做个加强外壳,和现在AIR做的事情差不多。但是现在到了需要flash做更变态需求的时候,就需要从Flashplayer入手了。
嗯,就这么多
Popularity: 37% [?]
Flash Player 10.2 升级开始. 网络视频将会更快更省.
10.2的升级包括如下几个新特性:
- Stage Video, 一个完整的硬件加速视频管道
- 原生自定义鼠标
- 多显示器全屏支持
- Internet Explorer 9 硬件加速渲染支持
- 增强的像素渲染,更好的文本展示
可以通过如下资源看到更为详尽的信息:
Flash Player团队博客: http://blogs.adobe.com/flashplayer/2011/02/flash-player-10-2-launch.html
Adobe 开发者中心文章:
第三方文章和demos:
Popularity: 23% [?]
FlashPlayer关键协议之一的RTMP在宣布开源之后近半年后文档终于公开了,作为Adobe Open Screen Project的重要一步,我很佩服Adobe的战略眼光,没啥说的 http://www.adobe.com/devnet/rtmp/这个地址自己看吧,Red5 性能会有进一步提升了,SFS也会更niubility了
Popularity: 53% [?]
Alternativa3D的Tanki Online公测了。需要安装FlashPlayer10。
Popularity: 48% [?]
这个问题几乎是每个flasher在学习阶段都会遇到,并试图实现的。但是不太靠谱。今天一个学弟又问了这个问题,原因是他的毕设中有这么个需求。我给总结了几种方法,希望对看博客的你有所帮助。
1.传统的fscommand,fscommand(”exec”,..),这种方法要把exe放到同目录的fscommand下面,可以传参,可以 启动bat,但是无法交互,可靠性不高。
2.中转法,有个localserver的角色,启动swf,swf可以和localserver通信,localserver来启动exe,做消息中转。如果真的非得把若干个不相干的东西拼成一个,这种方法可以考虑。扯远点,swf的表现层开发远高于MFC等,所以很多软件公司的精美界面其实就是flash的,比如好几款网游的登录界面,用C++或者别的啥做个壳/容器,也可以看做为中转法。
我和学弟扯到这里,他忽然告诉我,他的swf是在页面中的,是html中的,怎么启动客户机exe。我一头汗,浏览器启动exe…但是,也不是不可能。考虑到是毕设,就让他用delphi,c#或者别的啥拖个webbrowser控件,做个定制的浏览器,还是中转的思路,蒙混过关。但是良心告诉我,不能这么忽悠他。于是有了第三种方法
3.伪协议,说着挺忽悠,其实很简单,自定个协议比如aseye,在注册表中关联到需启动的exe,然后用flsh中getURL(as2)/navigateToURL(as3)它即可比如navigateToURL(new URLRequest(”aseye://***”));原理可以参考迅雷,flashget或者emule,呵呵,具体注册表怎么写? 如果你装了emule。在regedit中ctrl+f ed2k,看看怎么写的,导出来改改即可了
话说回来我的几种方法都有点不正统的味道,Adobe应该有包容天下的心态才是王者风范,这点该学学python,直接拿c++的东西,不过好在有了alchemy,可以期待,否则连AIR都启动不了别的exe,太玩具了
Popularity: 45% [?]
flash在sns游戏中的应用越来越重要,facebook排名前20的,有12个是flash开发的,所以推出as3的lib也是明智的选择,这个地址可以看到详细说明和一些应用例子。
webgame中flash无疑是首选,优势很明显,庞大的开发者群,完善的IDE,90%+的FP覆盖率和各种第三方库,服务器端解决方案…但是webgame还有比较多的瓶颈亟待解决:
1:画面渲染
flash在矢量图处理上的能力无可厚非,但是在大家越来越被3d,次时代的效果惯的日益挑剔的时候,flash在3d处理上还是处于比较低级阶段,经常一个用c/c++很容易实现的效果被flash做了,往往博得众多开发者交口称赞,而用户看来,很卡,交互流畅太低,flash支持硬件加速,提供opengl代理才是3d起航的时候,也许是fp12,fp13吧.
2:高并发
实时webgame,对负载要求很大,著名的CLUB PENGUIN是用的smartfox server,基于xmlsocket的软实时,所以多是回合游戏。fms做边缘服务器是很多棋牌类webgame的选择,但服务器3000-5000的样子,fms的优势在于rtmp,如果没有语音也是浪费,所以自己开发服务器的也不少,况且amf有c,python,php等多种语言的实现方案,难度降了不少,我猜rtmp的文档出来之后应该是百花齐放的时候。red5要改,prtmp要改,相信也会有性能不俗的高效rtmp server,(学好erlang很重要)…
3:防作弊
webgame有先天的不足,他是基于浏览器的,所以和桌面exe不是一个级别。换而言之,他没办法对exe做任何限制。webgame几乎都有作弊的可能,比如之前很火的**三国,相信对外挂是恨之入骨了:)
Popularity: 42% [?]
游戏或者动画中使用到时间轴动画,在暂停时mc未必跟着主时间轴停下来,写个简单递归吧。
function stopAllAnimations( mc:MovieClip = null ):void
{
if( !mc ) mc = this as MovieClip;
for(var i:int = 0; i < mc.numChildren ; i++)
{
if( (mc.getChildAt( i ) is MovieClip) == false ) continue;
MovieClip( mc.getChildAt( i ) ).stop();
if( mc.numChildren > 0 )
stopAllAnimations( MovieClip( mc.getChildAt( i ) ) );
}
}
Popularity: 39% [?]
有时候写代码的时候图方便,比如在监听句柄中使用添加监听时的参数,在监听中直接用匿名函数,可以使用arguments.callee获得该匿名监听函数的引用,来移除,举个简单的例子
m_someBtn.addEventListener(MouseEvent.CLICK,function(e:MouseEvent):void{
(e.target).removeEventListener(MouseEvent.CLICK,arguments.callee);
…
})
arguments.callee 是as2时代就有的东西了,可以方便的引用当前执行的函数,引个例子吧
private var count:int = 1;
public function ArgumentsExample() {
firstFunction(true);
}
public function firstFunction(callSecond:Boolean) {
trace(count + “: firstFunction”);
if(callSecond) {
secondFunction(arguments.callee);
}
else {
trace(”CALLS STOPPED”);
}
}
public function secondFunction(caller:Function) {
trace(count + “: secondFunction\n”);
count++;
caller(false);
}
Popularity: 68% [?]
最新评论