收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 11216|回复: 23

[AS3] Flash Loading 的感慨

[复制链接]
发表于 2009-1-23 16:37:37 | 显示全部楼层 |阅读模式
我是一个.NET的程序员,起先由于公司的需要,不得不学习Action Script。当时情况很糟,项目来了,迫在眉睫,但是公司舍不得出钱请个AS的程序员(AS的程序员要价总是太高),我只能一边学习,一边做项目,幸好Action Script 3.0的面向对象的,这让我感觉也不太难懂,经过一段时间学习,慢慢对于Flash的理解要稍稍多了一些,不知不觉,公司又接了几个Flash的项目,感觉都还能胜任。不过,直到昨天,我才明白Flash的loading的含义。

以下言论是我自身的理解,不保证100%正确,如有谬误,还请指出,并见谅。

你是否曾经被要求把Flash做到加载几KB就要显示呢,如果有,并且你不知道如何解决的话,请继续向下看;如果您是高手,并且也有兴趣的话,也请继续,并在适当的时候指出我的我的错误。

Flash要显示内容,至少得等第一桢下载完毕,很简单吧。

不过,你是否清楚你的第一桢有多大呢?如果你说你的第一桢很小,因为你留的是一个空白的桢,那不一定。现在我的这个项目的Flash里,做了很多的linkage,您可能明白了,Action Script导入的那一桢不管是不是空白,都是可以很大,所以,在我们经典论坛的Flash版块里总是会看到版主说,做loading用三桢,第一桢loading,第二桢导出脚本,第三桢开始程序……

http://bbs.blueidea.com/thread-2853462-1-1.html

   

   

但是为什么要这样做呢?

您还记得Flash至少要加载第一桢才能显示的道理吧,所以,要尽快的显示Flash的loading,要尽量减小第一桢的大小,把loading的逻辑写在第一桢,将Action Script导出在第二桢,这样,导出的内容就影响不到你,最后,你会在第三桢,也就是加载完成后,开始主程序逻辑。

在Flash的publish settings(快捷键Ctrl+Shift+F12),选择"Flash"选项卡,点击"Script"的那个"settings",把"Export class in frame 1"改成"Export class in frame 2",这样,你的程序的类会导出到第二桢,它不会把第一桢(loading所在的桢)变大,从而进快显示loading。

看看效果吧,在publish settings中,把"Generate size report"勾选,看看发布后flash文件的体积报告:

Frame #    Frame Bytes    Total Bytes    Scene

      1          23892          23892    Main Scene
      2         155519         179411     (AS 3.0 Classes Export Frame)
      3             36         179447   

而把Action Script发布到第一桢呢:

Frame #    Frame Bytes    Total Bytes    Scene

      1         106125         106125    Main Scene (AS 3.0 Classes Export Frame)
      2          70771         176896   
      3             36         176932

你看,如果导出到第二桢,第一桢的体积大约是24KB,这是因为loading动画效果有这样大的体积;而如果将AS发布到第一桢,则变成了106KB,主要的加载内容都在第一桢了,这说明这个loading就比较失败



另外,你可能还会遇到这样的问题:当你辛苦的为你的loading写了一个类,叫myFlashAppPreLoader,在第一桢时,你是这样写的:
(带有一点点语法高亮的版本在:http://s-prince.appspot.com/2009/01/23/Flash_AS3_loading.html,希望不要当AD,这个位置什么也没有的,AD它也没用 )


  1. //private variables

  2. private var loader:myFlashAppPreLoader;

  3. ……

  4.    

  5. //constructor

  6. loader=new myFlashAppPreLoader();

  7. this.addChild(loader);

  8. this.loaderInfo.addEventListener(Event.COMPLETE,loadCompetedHandler);
  9. this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,LoadingHandler);

  10. ……

  11.    

  12. //some other function

  13. private function loadCompetedHandler(e:Event) {
  14.             this.removeChild(loader);
  15. }

复制代码

你这样做的原因在于,你想把loading封装成一个类,你直接用就好了,方便!

可是,这样带来一个极大的问题:

试想,你刚刚把AS导出在第二桢了,现在你的第一桢是loading,第一桢就用第二桢的东西……逻辑不太对吧?

所以,在第一桢的loading里,不要把loading写成类,请直接在舞台的第一桢里放loading的动画,对,把它们通通放到舞台上,这样,你可以直接在document class中对其中进行操作,想要什么动画也可以自行控制了。

  1. //constructor

  2. this.loaderInfo.addEventListener(ProgressEvent.PROGRESS,LoadingHandler);

  3. ……

  4.    

  5. //loading animation handler

  6. private function LoadingHandler(e:ProgressEvent):void {
  7.             txtProgress.text=String(Math.round(e.bytesLoaded/e.bytesTotal*100));
  8. }

复制代码

这里的txtProgress就是舞台上一个DynamicTextField的实例名称,我直接用它赋一个百分比的值,如果你loading的时候要控制更多的元件,也可以同样这样做。


末尾的时候,提醒大家多留意一个size report,这里面不但可以看到桢的体积情况,还可以看到图形、元件、嵌入字体等的大小,对分析你的Flash用处多多哦。
发表于 2009-1-23 17:47:27 | 显示全部楼层
刚刚巧 我也是一个程序员,而不是flasher 。
我对这个倒有不同的理解。
为什么flash 会出现loading...??
那就是因为他们这些flash是flasher做出来的,而并非是程序员做出来的。

很多的网站,都是以flash为主,使用flash 调用另一个flash 不管另一个flash 里面的资源是不是第一个flash需要的。

但是AS3.0的竞争目标是谁呢???
是Ajax !
为什么AJAX没有出现flash的loading 的现象?(虽然AJAX也有很多的loading 的效果,但是为什么大家没有人讨论呢???)
因为AJAX 是程序员在做。
AJAX每次只加载这个页面上必须的无素,而并非几个点击后的所有的元素。

而太多数的FLASH的网站,做的太过于花哨了。
已经完全失去了和AJAX争异步  的那个主要方向。

ADOBE应该也发现了这个现象,所以AS3,一下子把AS1,AS2,给甩开。
直接溶入JAVA的东西。

这样,AS3 ,flex buider肯定会吸引一批JAVA程序员会参加AS的开发。
而不是flasher 。
JAVA程序员当然比flasher更关心网页的展开速度。

还有一个重要的原因JAVA程序员肯定比flasher 的flash水平要差很多。
不会添加过多的技巧。
这样flash自然也会体积变小了很多。
loading...这个东西在flash论坛里,讨论的很多。

但实际上,根本没有作用。
试想一下,你的手机现在每天都在接收着flash 这种形式的新闻。
如果每天都是loading...
信息还是慢慢的出来。

你恨不得不要这种loading...吧。
相反,flash 也影响了观众,
因为大多数的flash都要loading 所以大家对于flash 的这种loading 也就原谅了。
这也是flash全站,为什么到现在为止只停留在欣赏上。

因为,他们的确太不实用了。。。
把研究loading 的精力来研究一下如何让flash变得更流畅吧!
回复 支持 反对

使用道具 举报

发表于 2009-1-23 18:59:02 | 显示全部楼层
根本不用做loading,就让它一开始空白一片就行了,加载完自然就显示了
回复 支持 反对

使用道具 举报

发表于 2009-1-23 19:38:09 | 显示全部楼层
那取决于速度。
如果不到1S出来,你还loading不???

google 的信箱,没有一个loading 。。
回复 支持 反对

使用道具 举报

发表于 2009-1-23 19:39:03 | 显示全部楼层
其实这个PHP的论坛,发贴 子也是使用的AJAX
用JS写一个loading比flash可方便多了。
但是也没见采用loading...
回复 支持 反对

使用道具 举报

发表于 2009-1-23 21:47:37 | 显示全部楼层
我是一个FLASHER

好像有LOAD组件。不过我没用过。
回复 支持 反对

使用道具 举报

发表于 2009-1-23 21:48:41 | 显示全部楼层
LOADING这东西,我觉得是在象广告时间发展。给人加强LOGO印象用的。
回复 支持 反对

使用道具 举报

发表于 2009-1-23 23:42:22 | 显示全部楼层
多谢楼主,在你空间发言未遂.

这个问题一直困扰着我,其实也不仅我,老外都有专门网站研究做自身加载研究的,你终于把方法找到了,太感谢了.


楼上有几位似乎不会as,看样子不知道楼主说的是啥,更不知道楼主说的价值所在.
回复 支持 反对

使用道具 举报

发表于 2009-1-24 00:30:46 | 显示全部楼层
樓上的朋友 能詳細說一下吧
我能理解的 就是鏈結的時候不選在第一幀導出,而是將用到的全體拖到比較後的一個隱藏幀上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-24 17:34:54 | 显示全部楼层
今天下午回家,在长途汽车上用手机看看论坛,呵呵
首先,感谢8楼的同学给予我肯定的评价,谢谢。
对于2#的同学与ajax比较,我也认为说得很有理,不过,毫无疑问,flash的loading在大多数情况下都是必要的;正如您说的那样,flash变得很大通常都是flasher干的,他们导出的 图片、元件,或者是一些逐帧动画,都好大,我们随时都可以看到一个个2 m 以上的flash ,不用猜我们就知道这里面含有大量的图片、声音、动画或是字体…因为,我们很难想象一个纯as的flash 会超过2 m ,那样的程序员太令人敬畏了。
不过,虽然flasher使得flash远远变大了,但是他们的工作却是重要且不可替代的,作为程序员,应该感谢他们,设想你的客户要求你用as画出所有的水晶图标,或是要求你用as做出一个人物并展现他的跑步和摔倒的过程,在这个过程中必须呈现出所有的复杂细节…我想,所有的程序员都会认为,“天!不可理喻”。就算你忍气吞声,天天加班,完成了这件事,可是你发现,由于呈现过多的动画细节,你的flash太耗cpu了,甚至拖得ie或firefox死掉,而当然,客户在死机的过程中没有看到你的任何动画,从而否定了你的工作,你想解释,可是你能要求客户升级他的机器然后在看这个动画吗?
还有,我也不认为flash需要刻意地与ajax比较,因为flash的意义已经远远超出了局部刷新的范畴,他还有更多更多的特性,我想,他的竞争对手应该是有强大支持的silverlight,silverlight的出现,会吸引大量的·NET程序员,并且,silverlight作为·NET的一员,能很好的与asp·net融合在一起、方便的通信,并且·NET的程序员不需要花很大的力气就能开始silverlight之旅。
手机打字太费事…就先说这些吧,刚刚看到成南高速路上发生了一起车祸,希望没什么大事,这大过年的。
回复 支持 反对

使用道具 举报

发表于 2009-1-24 17:44:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2009-1-25 01:35:19 | 显示全部楼层
原帖由 [i]99love 于 2009-1-24 17:34 发表
今天下午回家,在长途汽车上用手机看看论坛,呵呵
首先,感谢8楼的同学给予我肯定的评价,谢谢。
对于2#的同学与ajax比较,我也认为说得很有理,不过,毫无疑问,flash的loading在大多数情况下都是必要的;正如您 ...


没有绝对的全矢量化,也没有绝对的全BITMAP是不???
如果大多数的人,用flash 的都注意一下里面的图片,
那flash的情况会好很多。

另外,上面说不用AS的人说什么loading的重要。
这个是对的。因为现在的flash 3.0才出来,FLEX这种思路才刚刚发展嘛。
如果AS 不向着面向对象发展,
那flash 再过几年,还是某些人手中的玩物。。
回复 支持 反对

使用道具 举报

发表于 2009-1-25 01:40:24 | 显示全部楼层
另外,flash 费不费CPU??

这个由什么绝定???
如果图片小,那CPU不是反而要降低了???
矢量图,和位图相比,这个又不是引起复杂的脚本

如果说比较脚本,
那现在搞的大家说那个帅的,这个玄的3D算法的相册,那才是真正的CPU杀手吧??

如果说哪个人用脚本来画一个水晶图标??
或者是photoshop处理的效果???
那你真的是天才。。
回复 支持 反对

使用道具 举报

发表于 2009-1-30 17:35:28 | 显示全部楼层
也就是说.要把由程序控制的大型FLASH立刻显示的方法,只有做成三桢?并且不要去做成类?
回复 支持 反对

使用道具 举报

发表于 2009-1-30 17:37:44 | 显示全部楼层
我认为,大型的flash 要想马上显示,
应该把flash 做个很多很多的小flash .
回复 支持 反对

使用道具 举报

发表于 2009-1-30 18:10:02 | 显示全部楼层
楼上,你说的状况我现在正在做.把各部分都拆成小FLASH.

但是实际上是LOADING对调用其它FLASH这个过程根本不起作用.
LOADING管它自已第一桢100%跳转ACTION了.然而LOAD其它FLASH的内容还都没出来.
这也可能是我的代码问题?我正在解决试验中...


但接下来还有一个问题:第一桢还是第三桢导入更好?
如果选择第三桢调入的话.LOADING完全失去意义.最好改成每个部分都有分LOADING
第一桢调入的话,又怕时间太长,大家等的烦

这些问题其实很多好的实例中都有解决,呵呵,只是我要些时间研究一下.如果高手能直接指点,当然感激不尽!
回复 支持 反对

使用道具 举报

发表于 2009-1-30 18:34:26 | 显示全部楼层
楼主说的很有道理。

另外应用程序中外带LOADING可以提高重用和减肥。

可是对于有些特殊的设计类FLASH,LOADING和内容之间有流畅的转场,这样的情况需要在同一个SWF中放置内容和LOADING。

[[i] 本帖最后由 enc0717 于 2009-1-30 18:39 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2009-1-30 23:12:44 | 显示全部楼层

回复 4# dearmite 的帖子

gmail有loading,我这里打开gmail加载时间还不短呢
某些特殊的flash网站当然没法跟ajax的比了,像那种房地产之类的网站唰一下就打开了,客户还不乐意呢,某些flash网站就应该有loading
回复 支持 反对

使用道具 举报

发表于 2009-2-1 16:25:46 | 显示全部楼层
各抒己见啊
回复 支持 反对

使用道具 举报

发表于 2009-2-12 02:57:33 | 显示全部楼层
如果有個實例比較一下會更好喔!
回复 支持 反对

使用道具 举报

发表于 2009-2-12 09:18:18 | 显示全部楼层
如果没有loading.....谁知道在你想调用xml或是数据库的一个字段的时候,那个值是不是存在?
拿FLASH和AJAX比....有点开玩笑了吧...都有侧重点..只是都能做到异步而已..
回复 支持 反对

使用道具 举报

发表于 2009-2-12 10:20:19 | 显示全部楼层
我是个flasher,LOADING这个东西自重AS1.0 到AS2.0  AS3.0升级的每个版本
一样的写法居然文件会庞大,尤其是AS3.0溶入JAVA这个东西就不得不抛开AS1.0~2.0的写法
使得我们flasher又要重新学起!!!!!
回复 支持 反对

使用道具 举报

发表于 2010-12-1 17:52:14 | 显示全部楼层

感觉还是as2.0有优势

我用as2.0做flash网站,
主flash用了一个15k左右的文件来做程序包
其他的flash都使用公用方法共享这个程序包,
然后将所有项目都做成异步载入
这样每个swf都不会超过5k大小, 除了图片需要loading,其他部分基本上是瞬时载入

我想把这东西换成3.0,可面向对象的编程方式就很不适应,很麻烦
回复 支持 反对

使用道具 举报

发表于 2010-12-3 17:01:21 | 显示全部楼层
好老的帖子了,呵呵,as3很方便。loading其实可以很小很小的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-3-31 21:54 , Processed in 0.124687 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表