YouYee's Blog http://youyee.org/viewpoint/ A Simple Blog from YouYee OpenSource zh-cn Thu, 29 Jul 2010 10:51:05 -0700 Thu, 29 Jul 2010 10:51:05 -0700 YouYee YouYee YouYee<![CDATA[哀其不幸,怒其不争]]>http://youyee.org/viewpoint/article_view.php?topic_id=120 从标题就看出来这是一篇附带强烈个人感情色彩的文章,而这个标题所描述的对象就是——Flash。

先从我自己的经历开始介绍吧,从高中开始就接触Flash 5一直到现在,我除了中间中断了接近两年的时间从事JavaScript开发,这七年来几乎都在围着Flash打转。在我毕业前一年,我开始着手JavaScript方面的开发,直到毕业后一年也是一直从事JavaScript开发,期间依旧没有放弃过Flash,只是工作上更加偏重与JavaScript。到09年底,因为工作需要,我又继续回到了Flash开发这个职业角色。

从Flash 5一路走来,Flash给我们开发者带来了一次又一次的惊喜,也带来了一次又一次的失望,我们看到了Flash的进步,但是也看到了Flash的局限和不足。尤其是最近Apple处于自身利益对Flash的批判更加将Flash推到了风头浪尖上,我,做为一个开发者来谈谈自己对Flash的感受吧。

Flash Player作为一个自称能跨浏览器提供体验一致的平台,在很多时候都是被用来呈现图表,用于提供相对于HTML + JavaScript更加丰富体验网页应用程序,比如数据图表和图片编辑等,Flash在大多数情况下都能提供比较好的体验,而且合理的将界面和逻辑分离成SWC与AS,从开发体验上也还算比较合理,在PC平台上,Flash至少在目前而言还是非常好用的。

可是Flash始终就不是万金油,想想开发者用Flash开发RIA的初衷,很多是因为浏览器不能或者很难提供的功能才让Flash进行开发,随着前端程序的架构复杂,Flash很多的自身的问题也一一暴露出来了:

基于插件,说白了,要是浏览器把插件给关掉,Flash就只能等着死。有人会说Ajax也会啊,Ajax不也是基于XMLHttpRequest的么,而这个对象在IE下不也是通过插件么,但是在浏览器下除了使用XHR来实现数据的异步请求还有很多的方法来实现,XHR只是其中的一种手段而已。Adobe之所以发布AIR就是想Flash本身脱离浏览器的束缚,然后AIR的客户端普及问题呢?

莫名其妙的小Bug,距离而言输入法总是在某些浏览器下的某些或者全部wmode下莫名其妙地失效,在Firefox下甚至Flash发出的请求很多时候竟然不带Referrer或者干脆连Cookies也丢了,Bug表面上看不是啥问题,可是对于复杂前端程序,这些足以致命,也就是说Flash并不能像宣称的一样提供跨平台的无差异体验,连在电脑上也无法提供,更不要说在手机上了,Flash可用性很差。

文本能力还是很弱,TextEngine虽然在布局上或多或少的弥补了这个问题,但是实现起来还是非常困难,我们需要将HTML转换成显示对象,这个过程复杂繁琐,不亚于做一个HTML解析器了,与其这样还不如直接用HTML显示在浏览器上来得方便直接。

执行效率是最近一直被诟病的地方,连V8引擎跑JavaScript都和ActionScript 3.0的效率相差无几了。这样的效率怎么能够让大家满足?

不是真正的跨平台技术,面对PC的各个浏览器,Flash依旧存在很多跨平台的问题,在Mac下的Safari连接摄像头甚至都要写特殊的逻辑,让大家赶到都回到JavaScript写屏蔽浏览器差异的时代了。的确这个问题在HTML上更加普遍存在,但是总是有方法可以解决,而Flash很多时候连给你解决的机会都没有,这个时候只能去做产品上的Trade Off!

Apple最近阻止Flash进入iPad,是对Adobe或者说Flash当头一棒,这或许应该让Adobe警醒一下了,Flash的今天不仅仅是Apple为私利导致,其中也有不少的自身原因。没有正视自己的问题,没有去及时修复自己的Bug。

前不久Flash Player放出了Android的版本,可是还是差强人意,糟糕的操作体验使得很多没有经过专门优化的内容几乎无法完成最基本的点击操作,而且耗电量也非常大。

随着版本的更新,Flash IDE越来越臃肿,运行起来越来越慢,我都搞不懂为什么配置那么高的机器跑CS5还是会卡,难道Adobe自己的人就不觉得吗?难道Flash CS5的代码都是很业余的临时工写出的代码吗?Flash Builder 4在设计模式下拖拽的体验也大不如从前,总感觉很多提出的体验Adobe总是做坏了,虽然提供了很多新的功能,但是却开始丢掉了以前一些好的东西这让开发者很懊恼。

随着HTML5和CSS3的普及,Flash的优势将越来越少。而这个时候开发者就会作出新的决策,从而背离Flash的阵营。而Flash的失败不是因为Apple的唆使,也不是因为SilverLight的竞争,最终她还是输给了自己。

PS:当还有人骂Adobe的时候至少还说明大家还没有放弃Flash,等到有一天大家都不骂了,说明Flash就真的退出了互联网的舞台了。

]]>
Mon, 31 May 2010 02:32:30 -0700
<![CDATA[HTML5和Flash,不是你死就是我活?]]>http://youyee.org/viewpoint/article_view.php?topic_id=119 最近HTML5和Flash被炒得沸沸扬扬,Adobe和Apple之间的对骂也十分有意思,作为一个开发者的你特别是从业与Flash开发的你有考虑过吗?

就我本身而言,我虽然很爱Flash,毕竟这是我一直都很喜欢玩的一个平台,在MM时代,Flash给人带来一次又一次的惊喜,我甚至无法忘记每次Flash更新给开发者带来喜悦的场景,每次在Adobe Labs 上看到新的版本推出的时候,总是第一时间去了解究竟多了哪些功能,从这些新功能中能有那些能给自己的开发带来帮助,我几乎废寝忘食的去学习去研究这些东西。

然而不得不承认,这一年,Adobe给我带来了一次又一次的失望,安全漏洞方面的问题就不说了,在Mac下,执行效率一直很差(10.1据说好了很多);所谓的多平台最终依旧没能够在iPhone上得到支持,甚至对于摄像头的连接你都要针对平台去写特殊的逻辑;最糟糕的是Flash IDE,臃肿,效率底下,拥有2G内存的机器跑CS4依旧十分吃力。

回头再看看浏览器的发展,Safari,Chrome,Firefox都开始支持HTML5,新一代浏览器开始支持OpenGL或者其他的硬件加速,CSS3正在向开发者走来...你可能会不屑一顾的说:IE6一日不死就别和我谈取代Flash,作为一个Flash爱好者,你可以效忠于你的平台,甚至包容他所有的缺点,Flash很强大,强大到几乎所有问题都能解决,只是比较棘手而已。可是不要忘记,Flash是寄生于浏览器,如果没有HTML, 甚至连嵌入网页的机会都没有,我们总是在说Flash Player普及的速度很快,但是我们考虑到了网吧用户吗?他们的机器上是装有还原卡,这意味着他们关机后所有的更新都被重置,Flash终究是一个插件。

记得以前Luar写过一篇文章《Flash的未来未有来》,他的预言似乎没有任何偏差,Flash在RIA应用上被Ajax抢去了风头,糟糕的可用性和差劲的文本呈现能力导致Flash在这个领域节节败退。我是一个Flash职业开发,同时也是一个FrontEnd 职业开发,不会偏袒任何一方,只是我意识到现在Flash的危机来了,不仅仅是HTML5,不仅仅是浏览器的革命。

让我们看看原来很多不得不用Flash实现的功能:

1、文件的上传

2、摄像头拍照

3、数据图表显示

4、富含动感的小动画

5、3D以及粒子特效

6、Flash小游戏

7、照片的幻灯片效果

8、视频播放

而如今这些功能那些已经被取代呢?

数据图表显示(国外已经有人通过SVG和Canvas实现了,IE6甚至也支持)

小动画 (现在都喜欢直接用Tween来实现动画效果,加上CSS3,这个也很快没有人愿意用Flash来实现了)

3D以及粒子特效 确切的说网上已经有很多人用Canvas实现了这些特效而且效果很不错。

照片幻灯片效果 (LightBox告诉我们,Flash不是必要的!)

视频播放(这个还用说吗?YouTube的行动已经证明了一切)

越来越多的东西已经可以不使用Flash来实现了,尽管你会说:Flash能比他们做得更好,但是别忘记了,Flash Player只是一个Plug-in or ActiveX 她的可用性实在很低,在RIA应用上Flash已经失败了一次,然而现在更是腹背受敌。

我们也要仔细的反省下Flash的硬伤:

1.相对于 HTML + CSS + JavaScript, SWF始终在灵活性上欠缺, 服务器要想直接生成动态的SWF内容虽然能够实现,但是需要消耗巨大的硬件资源!

2.FLA始终相对于SVN这一类的代码管理软件而言不够友好,所以Adobe推出了一个叫做Version Cue的东西.

3.无论如何SWF都无法独立在浏览器被禁用的情况下发挥任何作用,甚至不能提示用户.

4.还是文本的渲染能力,是的有了新的TextEngine, 但是效率还是差强人意.

时代在变迁,Flash需要及时地去解决自身的问题,保持自己的创新才能不被取代,在我看来对于开发者而言Flash需要解决以下的问题:

1、依旧是效率还是不够快,你是一款插件,并且程序是经过编译后运行的,你的速度应该比JavaScript快一个数量级以上才是!

2、好好修理自己身上的Bug,不如在Firefox下Wmode导致输入法无法使用,不要去推脱自己的责任,无论这个Bug是谁引起,请推动修改!

3、更加的开放,我们需要Flash Player能够提供更加强大的功能,而不是像现在这样畏首畏脚的Flash Player。

4、保持强劲的创新能力,这样才能让开发者对你爱不释手,才不会放弃你。

5、请把你的IDE的执行效率提高些!Coder们才不会去抱怨去咒骂你们。

作为我个人而言,我当然是希望Flash能够越来越好了,但是光这样又怎能够满足我们开发者的野心呢? 我想Flash Player如果没有就更好了,要是HTML5里面能够支持<swf></swf> 又或者 <video></video>压根就直接支持嵌入Flash,SWF成为HTML5的一个内容标准岂不是更好?!

而身为读者或者开发者的你呢?欢迎留下你的观点。

]]>
Sat, 06 Mar 2010 08:53:37 -0700
<![CDATA[紀念劉和珍君]]>http://youyee.org/viewpoint/article_view.php?topic_id=118

中華民國十五年三月二十五日,就是國立北京女子師範大學為十八日在段祺瑞執政府前遇害的劉和珍楊德群兩君開追悼會的那一天,我獨在禮堂外徘徊,遇見程君,前來問我道,“先生可曾為劉和珍寫了一點什麼沒有?”我說“沒有”。她就正告我,“先生還是寫一點罷;劉和珍生前就很愛看先生的文章。”

這是我知道的,凡我所編輯的期刊,大概是因為往往有始無終之故罷,銷行一向就甚為寥落,然而在這樣的生活艱難中,毅然預定了《莽原》全年的就有她。我也早覺得有寫一點東西的必要了,這雖然於死者毫不相干,但在生者,卻大抵只能如此而已。倘使我能夠相信真有所謂“在天之靈”,那自然可以得到更大的安慰,——但是,現在,卻只能如此而已。

可是我實在無話可說。我只覺得所住的並非人間。四十多個青年的血,洋溢在我的周圍,使我艱於呼吸視聽,那裡還能有什麼言語?長歌當哭,是必須在痛定之後的。而此後幾個所謂學者文人的陰險的論調,尤使我覺得悲哀。我已經出離憤怒了。我將深味這非人間的濃黑的悲涼;以我的最大哀痛顯示於非人間,使它們快意於我的苦痛,就將這作為後死者的菲薄的祭品,奉獻於逝者的靈前。

真的猛士,敢於直面慘淡的人生,敢於正視淋漓的鮮血。這是怎樣的哀痛者和幸福者?然而造化又常常為庸人設計,以時間的流駛,來洗滌舊跡,僅使留下淡紅的血色和微漠的悲哀。在這淡紅的血色和微漠的悲哀中,又給人暫得偷生,維持著這似人非人的世界。我不知道這樣的世界何時是一個盡頭!

我們還在這樣的世上活著;我也早覺得有寫一點東西的必要了。離三月十八日也已有兩星期,忘卻的救主快要降臨了罷,我正有寫一點東西的必要了。

在四十餘被害的青年之中,劉和珍君是我的學生。學生雲者,我向來這樣想,這樣說,現在卻覺得有些躊躇了,我應該對她奉獻我的悲哀與尊敬。她不是“苟活到現在的我”的學生,是為了中國而死的中國的青年。

她的姓名第一次為我所見,是在去年夏初楊蔭榆女士做女子師範大學校長,開除校中六個學生自治會職員的時候。其中的一個就是她;但是我不認識。直到後來,也許已經是劉百昭率領男女武將,強拖出校之後了,才有人指著一個學生告訴我,說:這就是劉和珍。其時我才能將姓名和實體聯合起來,心中卻暗自詫異。我平素想,能夠不為勢利所屈,反抗一廣有羽翼的校長的學生,無論如何,總該是有些桀驁鋒利的,但她卻常常微笑著,態度很溫和。待到偏安於宗帽衚衕,賃屋授課之後,她才始來聽我的講義,於是見面的回數就較多了,也還是始終微笑著,態度很溫和。待到學校恢複舊觀,往日的教職員以為責任已盡,準備陸續引退的時候,我才見她慮及母校前途,黯然至於泣下。此後似乎就不相見。總之,在我的記憶上,那一次就是永別了。

我在十八日早晨,才知道上午有群眾向執政府請願的事;下午便得到噩耗,說衛隊居然開槍,死傷至數百人,而劉和珍君即在遇害者之列。但我對於這些傳說,竟至於頗為懷疑。我向來是不憚以最壞的惡意,來推測中國人的,然而我還不料,也不信竟會下劣凶殘到這地步。況且始終微笑著的和藹的劉和珍君,更何至於無端在府門前喋血呢?

然而即日證明是事實了,作證的便是她自己的屍骸。還有一具,是楊德群君的。而且又證明著這不但是殺害,簡直是虐殺,因為身體上還有棍棒的傷痕。

但段政府就有令,說她們是“暴徒”! 但接著就有流言,說她們是受人利用的。

慘象,已使我目不忍視了;流言,尤使我耳不忍聞。我還有什麼話可說呢?我懂得衰亡民族之所以默無聲息的緣由了。沉默呵,沉默呵!不在沉默中爆發,就在沉默中滅亡。

但是,我還有要說的話。

我沒有親見;聽說她,劉和珍君,那時是欣然前往的。自然,請願而已,稍有人心者,誰也不會料到有這樣的羅網。但竟在執政府前中彈了,從背部入,斜穿心肺,已是致命的創傷,只是沒有便死。同去的張靜淑君想扶起她,中了四彈,其一是手槍,立僕;同去的楊德群君又想去扶起她,也被擊,彈從左肩入,穿胸偏右出,也立僕。但她還能坐起來,一個兵在她頭部及胸部猛擊兩棍,於是死掉了。

始終微笑的和藹的劉和珍君確是死掉了,這是真的,有她自己的屍骸為證;沉勇而友愛的楊德群君也死掉了,有她自己的屍骸為證;只有一樣沉勇而友愛的張靜淑君還在醫院里呻吟。當三個女子從容地轉輾於文明人所發明的槍彈的攢射中的時候,這是怎樣的一個驚心動魄的偉大呵!中國軍人的屠戮婦嬰的偉績,八國聯軍的懲創學生的武功,不幸全被這幾縷血痕抹殺了。

但是中外的殺人者卻居然昂起頭來,不知道個個臉上有著血污……。

時間永是流駛,街市依舊太平,有限的幾個生命,在中國是不算什麼的,至多,不過供無惡意的閑人以飯後的談資,或者給有惡意的閑人作“流言”的種子。至於此外的深的意義,我總覺得很寥寥,因為這實在不過是徒手的請願。人類的血戰前行的歷史,正如煤的形成,當時用大量的木材,結果卻只是一小塊,但請願是不在其中的,更何況是徒手。

然而既然有了血痕了,當然不覺要擴大。至少,也當浸漬了親族;師友,愛人的心,縱使時光流駛,洗成緋紅,也會在微漠的悲哀中永存微笑的和藹的舊影。陶潛說過,“親戚或餘悲,他人亦已歌,死去何所道,托體同山阿。”倘能如此,這也就夠了。

我已經說過:我向來是不憚以最壞的惡意來推測中國人的。但這回卻很有幾點出於我的意外。一是當局者竟會這樣地凶殘,一是流言家竟至如此之下劣,一是中國的女性臨難竟能如是之從容。

我目睹中國女子的辦事,是始於去年的,雖然是少數,但看那幹練堅決,百折不回的氣概,曾經屢次為之感嘆。至於這一回在彈雨中互相救助,雖殞身不恤的事實,則更足為中國女子的勇毅,雖遭陰謀秘計,壓抑至數千年,而終於沒有消亡的明證了。倘要尋求這一次死傷者對於將來的意義,意義就在此罷。

苟活者在淡紅的血色中,會依稀看見微茫的希望;真的猛士,將更奮然而前行。

嗚呼,我說不出話,但以此記念劉和珍君!

]]>
Sat, 16 Jan 2010 22:12:13 -0700
<![CDATA[玩转Adobe Flex蚂蚁]]>http://youyee.org/viewpoint/article_view.php?topic_id=117你是否遇到如下问题?

1. 是一个团队在开发Flash程序, 但是代码最终编译却很让人头痛?

2. 你需要一个方法来检验别人提交到SVN的代码是否能够通过编译?

3. 你有一台编译机,可是每次远程登陆的时候都要打开Flash Builder或者慢得如蜗牛得Flash CS4 来编译Flash?

这个时候, 你需要Flex Ant, 使用Java开发项目的人应该听过这个工具, 如果你没有听过但是又遇到了上面说的问题, 那么请接着阅读接下来的内容.

俗气一下介绍Adobe Flex Ant:

The Adobe® Flex® Ant tasks provide a convenient way to build your Flex projects using an industry-standard build management tool.

Adobe Flex Ant 可以提供方便的方式来让你的Flex项目使用一个工业标准构建的管理工具来构建.

通过这个工具, 你可以让你的项目在编译的时候更加方便, 甚至可以轻松实现自动化编译.

首先我们先建立一个

文件夹 MyProject

分别建立 libs, src 两个文件夹

libs 下放置 flexTasks.jar 这个文件,如果你安装了Adobe Flex, 可以在目录:

{$flex_install_folder}/sdk/3.2.0/ant/lib/

下找到

然后回到目录 MyProject 建立一个build.properties 文件

内容参考如下:

# 把这个目录改成你的Flex安装目录下的sdk目录

FLEX_HOME=/Applications/Adobe Flex Builder 3/sdks/3.2.0

# 这个是你的MyProject源码文件夹的目录

# {$basedir} 是默认指向MyProject目录

SRC_DIR =${basedir}/src

# 这个指向libs文件夹目录

LIBS_DIR =${basedir}/libs

# 这个编译完成后的输出目录

DEPLOY_DIR = ${basedir}/DEPLOY

保存后关闭

接下来在MyProject目录下新建一个 build.xml文件, 内容如下:

<project name="Flex Ant Tasks Build Script" default="compile flex project">

<property file="build.properties" />

<taskdef resource="flexTasks.tasks" classpath="${basedir}/libs/flexTasks.jar"/>

<target name="init">

<delete dir="${DEPLOY_DIR}" />

<mkdir dir="${DEPLOY_DIR}" />

</target>

<target name="compile flex project" depends="init">

<mxmlc file="${SRC_DIR}/MyProject.as" output="${DEPLOY_DIR}/MyProject.swf">

<load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

<source-path path-element="${FLEX_HOME}/frameworks"/>

<compiler.debug>true</compiler.debug>

</mxmlc>

</target>

</project>

保存后关闭

然后把你需要编译的主类放置到 MyProject/src这个目录下, 并且命名为 MyProject.as 这样准备工作就完成了.

如何执行编译操作呢?

如果你是使用Linux或者Mac那么恭喜你, ant工具已经默认安装好了, 假设你是把MyProject保存在Desktop目录下, 那么输入:

cd ~/Desktop/MyProject/

ant

这样就大公告成了.

如果你是Windows用户, 那么需要去下载ant并且安装后使用命令行执行上面的语句.

有了这个, 你可以让你团队通过SVNTools 这样一类的工具将自己的代码同步到编译机, 然后运行此Ant任务,就能轻松的完成编译, 而且你还可以根据编译的输出结果来分析编译的信息.

]]>
Wed, 30 Dec 2009 09:08:36 -0700
<![CDATA[ActionScript 3.0 性能优化小知识]]>http://youyee.org/viewpoint/article_view.php?topic_id=116最近做的很多的事情都是和Flash开发有关,尤其是在性能优化上总结到不少经验,在这里分享给大家。

和其他平台开发一样,Flash程序的运行效率非常重要,为什么总有人觉得Flash程序很卡?甚至有人觉得Flash程序的运行效率还不如IE执行JavaScript 快,原因就在于写Flash程序的人,算法、代码写得太烂,最后连Flash Player的名声都被这些人写坏掉了。

高性能的程序源自高性能的算法、代码、和结构,下面就围绕着这个主题开始展开介绍。

1、改进算法

无论对于那一种程序,好的算法总是非常重要的,而且能够极大地提高程序性能,所以任何性能的优化第一步就是从算法或者说程序逻辑的优化开始,检查自己的程序是否有多余的运算,是否在没有必要的时候做了无用功,往往从这些方面就能找到那些导致性能低下的地方。

2、优化细节代码

针对细节总是好的,有一些小技巧比如:

用 var obj:Object = {}; 要比 var obj:Object = new Object();要好;

var arr:Array = []; 要比 var arr:Array = new Array(); 要好;

for (var i:int=0, len=arr.length; i<len; i++) 要比 for (var i:int=0; i<arr.length; i++) 要好;

如果不是为了保存颜色值请不要适用uint这个类型,他的速度比起 int要慢多了;

Array的遍历要比Object或者Dictionary的枚举要快得多。

if (myObj != null) 要比 if (myObj) 的速度要慢(更正, 之前把结果看反了,对不起大家~), for (var i:* in myObj) 比 for (var i:String in myObj) 要快;

Dictionary当 weak key设置为 true 的时候要比 false 慢;

var myText:String = "a" + "b" + "c";

var myText2:String = [ "a", "b", "c" ].join("");

在JavaScript里面在IE下后者要更快,但是在AS里面,前者更快!

在循环体内声明变量和在循环体外声明变量其实速度上不会有太大的区别。

3、权衡程序的结构

程序的架构也非常重要,良好的结构会带来性能和程序健壮性的提升,但是有的时候又是相互矛盾的,例如代码写得过于健壮,反而会影响性能,这个地方需要开发者自己去权衡。

4、小心Flash的重绘

如果你使用的是Flash Player 的Debugger版本,那么请在检查性能瓶颈的时候不要忘记打开显示重绘区域的功能,这将帮你迅速定位到舞台上有那些地方被重绘了,找出没有显示任何东西却不断重绘的地方,这些地方肯定是有问题的。Flash Player很笨,不会说你把一个DisplayObject的visible设置成false就放弃重绘那个显示对象。所以请保证你的MovieClip在visible=false的时候为停止状态。有一点很有意思,假设两个现实物体存在 hitTest = true 这样的关系,那么重绘的区域的面积很有可能 > 两者的面积总和!

5、以空间换时间

听起来挺虚,实则很简单,说白了就是以内存换CPU,例如将不变动的值进行保存,免去下次需要此数据的时候进行再次计算,虽然原理很简单,但是有的时候却很容易疏忽掉,而这个往往就造成你的算法效率低下的问题。

6、记得销毁你的对象

对于非常驻的对象使用完之后记得消除其引用,防止出现内存溢出的问题,往往要做到这一点需要有一个良好的编程习惯。

7、清除冗余的代码

有些代码可能你的程序一辈子也不会执行到,请把这些没有用的代码或者对象清理掉,否则内存会被偷偷的蚕食掉。

8、小心使用useBitmapCache = true

一般情况下除非你确定这个显示对象不可能发生变化那么用用也无妨,不过我更推荐自己手动的用BitmapData将该对象Draw一遍,然后让这个对象彻底消失。否则每次的变动都是巨大的性能消耗。

大致先总结到这里,欢迎大家一起来讨论关于Flash性能优化的细节。

]]>
Thu, 26 Nov 2009 10:35:24 -0700