Y.Boy's Blog

Web Game,Flex,Flash,AIR,RIA,ActionScript,Pixel Bender

flash模拟多线程的又一种想法


        Flash Player 是一个多线程的软件,但它不提供多线程的API。在我们看来,它是单线程的。不知道你同不同意我的观点,欢迎讨论。你打开一个Flash Player(无论是运行在浏览器上的ActiveX,还是运行在桌面上的exe),我们把它看成是一个只有一个线程的进程。flash开发者们都十分希望能有两个或以上的线程为我们工作,因为这样能充分利用CPU和内存的空闲资源。好吧,我开启了一个Flash Player,得到了一个线程;我想得到两个线程,我就打开两个Flash Player吧!这两个线程(实际上是两个进程)如何协作呢?Flash Player提供了 LocalConnection API!嗯,说到这里,你应该明白我这一“flash模拟多线程”的想法和思路了。

        甚至,你还可以:使用JavaScript动态开启和注销线程(说进程会更合乎情理)。我的意思是:当你刚开始打开一个网页时,只有一个swf,需要打开一个flash player即可。一旦你需要多一个线程来工作的话,你用JavaScript(swfobject是一个不错的选择)在网页上添加多一个swf(1像素大小就可以了,甚至想办法把它隐藏掉),也就是说你又打开了一个flash player。在这个网页上,总共有两个flash player进程在运行着,但你可以看成有两个线程在为你工作。如果你不需要后来添加的swf,你用JavaScript把它从网页上去除即可。通过这个方法,理论上你可以在同一页面上添加很多个swf,即开启很多个进程(线程)为你工作。

        我不知道这是不是新玩法,也不知道这是不是稳定可靠的、安全可用的。感兴趣的不妨测试一下和留言讨论。

标签:ActiveX, Flash Player, LocalConnection, SWFObject, 单线程, 多线程

评论


1
作者:  flex2007 | 日期:  2010年2月1日 | 时间:  10:49

是个办法,不过我觉得LocalConnection 是个足以让人抓狂的东西。

回复他(她)

Y.Boy Reply:

是使用麻烦,还是潜在很多问题?

回复他(她)

2
作者:  得失 | 日期:  2010年2月1日 | 时间:  16:53

多进程和多线程毕竟不是一个东西,线程之间可以共享内存空间,可以相互阻塞。localconnection总感觉不安全

回复他(她)

Y.Boy Reply:

同感。

回复他(她)

3
作者:  shoaly | 日期:  2010年2月1日 | 时间:  16:59

不知道有无实现的具体案例, 刚刚我大致的想了一下, 好像有一个问题不能解决的是线程同步. 如果不能解决同步问题, 那么做出的结果就不是安全的

回复他(她)

Y.Boy Reply:

实例没有:(同步问题,可通过人为去解决。

回复他(她)

4
作者:  xucan | 日期:  2010年2月2日 | 时间:  10:10

感觉不靠谱……看到ADOBE有篇文章是用Pixel Bender代替处理数据的,因为在FP里 跑AS的是一个线程,网络那块是一个线程,渲染那块估计也是单独一个。还有就是ixel Bender独立占用一个~有兴趣的可以用Pixel Bender试试~不过这东西和LocalConnection 一样让人感觉不好。还不太稳定。只能做试验了,,大数据量的时候也许就挂了,可能直接浏览器崩溃……

回复他(她)

Y.Boy Reply:

你说得很对。在处理逻辑方面上PixelBender不方便,Pixel bender有待世人的发掘。

回复他(她)

5
作者:  mousebomb | 日期:  2010年2月4日 | 时间:  20:51

flash“模拟”多线程,我觉得没什么实用性呢

回复他(她)

Y.Boy Reply:

目前我也用不着。

回复他(她)

6
作者:  ideareas.com | 日期:  2010年2月6日 | 时间:  18:52

我有一点实现,与你的想法是相同的!

回复他(她)

Y.Boy Reply:

能跟大家分享你的实现方法吗?

回复他(她)

7
作者:  yzhkof | 日期:  2010年2月8日 | 时间:  13:11

这想法确实不错,有创意

回复他(她)

8
作者:  jerry | 日期:  2010年2月10日 | 时间:  11:52

mop的某个网页游戏用的就是两个swf,一个用于存储资源之类的东西,一个用于主场景,然后用通信方式使用资源,我想也是这个道理,对于大型应用来说,这是不错的程序组织方式,也可以分得更多内存和计算资源。

回复他(她)

Y.Boy Reply:

感谢你提供了一个案例。

回复他(她)

9
作者:  ibio | 日期:  2010年2月26日 | 时间:  20:20

flashplayer 确实是多线程的东西,例如可以同时使用 Loader 加载资源等等。不过具体能同时启用多少个 Loader,我还真不知道。不知道 y.boy 有没有这方面的经验,呵呵!

回复他(她)

Y.Boy Reply:

5个Loader。

回复他(她)

Y.Boy Reply:

应该是要看浏览器支持多少个下载并发。

回复他(她)

10
作者:  diego | 日期:  2010年3月2日 | 时间:  09:43

我们有一个项目大量使用了LocalConnection 感觉还是不那么靠谱

回复他(她)

Y.Boy Reply:

看来LocalConnection还是少用才好。

回复他(她)

11
作者:  lite3 | 日期:  2010年3月17日 | 时间:  10:04

LocalConnection 效率太低了,我用LocalConnection做的DebugLoger,就是查看输出的,但是会出现明明已经调用了,但是延时很严重,汗

回复他(她)

Y.Boy Reply:

据说,LocalConnection 有90ms的延时。还有,推荐使用一款叫“De MonsterDebugger”的东西。

回复他(她)

12
作者:  lite3 | 日期:  2010年3月18日 | 时间:  10:04

呵呵,确实很强大,哈哈

回复他(她)



发表评论

Note: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-spam image