最近反Flash的气氛很浓啊,尤其是Html5这个小P孩(续)
上一篇文章是从管理学角度进行的分析,用的是技术扩散的分析方式。这篇主要从技术角度,补充论证上文的观点。
Flash是什么?它早就不单是在线广告显示技术了,那是它的起家。目前,Flash是一个软件平台,是和Java、.Net一样的平台。Flash可以用多种语言编写,但目前主要使用的是ActionScript。ActionScript 3.0已经很强大了,可以算一门成熟的语言了。在性能上,理论上,Flash和.Net是一样的。也就是说,.Net能开发的,Flash也能开发。几者的对应关系如下。
Flash | Silverlight | Html5 | |
平台 | Flash虚拟机 | Sl虚拟机 | 浏览器(Html解释器+Js解释器) |
开放性 | 私有,开放 | 私有,开放 | 非私有,开放 |
广告应用 | 大量的Flash美工 成熟的工具 很高的普及率 | 美工少 工具和Flash还差一些 普及率不高 | 美工无 工具无 普及率低 |
RIA应用 | 开发工具Flex | 开发工具VS2010 | 目前抱js大腿 |
视频应用 | 绝对优势 | 惨 | 最惨 |
Web Game | 优势 | 待发展 | 抱js大腿 |
下面,分项阐述:
(1)平台性能。
理论上性能,Flash=Silverlight>HtmlX+JS。实测,目前,Flash和Silverlight是差不多的。下面,我写一个Flash小程序,比较Flash虚拟机和Silverlight虚拟机的性能:
Flash测试程序是一个嵌入Html中的Flash,代码如下:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Label x="141" y="298" text="Label" id="lbText"/> <mx:Button x="242" y="296" label="Submit" click="OnSubmit()"/> <mx:Script> <![CDATA[ private function OnSubmit() : void { var d : Date = new Date(); Foo(100000000); var ms : Number = new Date().time - d.time; var s : String = ms.toString() + "毫秒"; this.lbText.text = s; } private function Foo(count:int) : int { var n : int = 0; for(var i : int = 0; i < count; i++) { n+= i; } return n; } ]]> </mx:Script> </mx:Application>
Silverlight程序代码如下:
private void button1_Click(object sender, RoutedEventArgs e) { DateTime start = DateTime.Now; Foo(100000000); TimeSpan ts = DateTime.Now - start; this.lbText.Content = ts.TotalMilliseconds.ToString(); } private static int Foo(int count) { int n = 0; for (int i = 0; i < count; i++) { n += i; } return n; }
测试结果:
Flash程序 – 400-450 ms
Silverlight 程序 – 300-400 ms
说明什么呢?说明大家都是虚拟机,性能上半斤八两。至于Html5,肯定得结合Js才能和Flash或Silverlight比。但是,浏览器处理Js+Html5要么是解释,要么是编译。它做到最好,也只是性能上和Flash或Silverlight一样。也就是说,在性能上,Html5+Js还得奋斗很多年才能和Flash、Silverlight坐在一起喝咖啡。
请教一下,为什么Silverlight的性能会比.Net控制台性能低下?上面的测试,在.Net控制台下大概是90-100ms。
(2)开放性
私有开放 vs. 非私有开放。注意,并非公有就是好的。私有和开放并不矛盾。同理,公有也并不意味着不封闭。这个大家都有体会,就不多说了,说多了要被公有下的螃蟹给夹了。如果只指技术,C++是前车之鉴。
这里说一点,Flash是私有但开放的平台,Adobe把虚拟机都捐给Mozilla了。在开放性上,Html5 很难做到更好 —— 对标准有不同的实现。这里存在委托代理关系,标准方是委托者,各浏览器的实现是代理者。委托者和代理者的矛盾经常出现:股民是委托者,企业管理层是代理者;屁民是委托者,公仆是代理者。
(3)广告应用和产品展示
这个只说明一点,就是工具问题。Blend 和 Flash CS系列差不多了。但是,Flash在以往积累了很多第三方开发工具,比如,电子杂志工具,等等,这一块,Silverlight目前还比不上。而Html5那一块的工具基本为0,全得手写。如果Html5要和Flash竞争,最终必须得出现一系列商业工具,哈哈,还是得花钱买。这一点,Html5真的毫无优势。
(4)RIA应用
我不知道为啥很多人认为Flash开发RIA会败给Silverlight。在过去的半年里,我接了4个RIA开发,清一色的全是Flex,4个中有1个是企业管理系统,剩下的3个是对图像处理有很高要求的系统。
再比较其它指标:
第一个指标:China-pub上搜索Flex,结果260本书;搜索Silverlight,结果26本书。
第二个指标:在51Job上搜索职位,Flex是1421项,Silverlight是249项。
也就是说,目前RIA是Flex占优势。
具体比较,Silverlight4才是和Flash 10一个数量级的。仔细分析Silverlight的优势,你会发现,这些优势并不大。
虽然.Net下的程序员多,过渡到Silverlight很快。但Action Script 3 和 C#,Java很像,这一关很好过,事实上,相似语言之间的过渡成本比库之间的过渡成本要低得多。我从C#切入Flex只花了半天时间——无非就是熟悉一下语法,熟悉一下控件生命周期。IDE上,Flex Builder是基于Eclipse的,这个……使用Eclipse的不比使用VS的少吧。并且,目前VS2008还无法支持UI设计,得等VS2010出来才行。
Silverlight开发的话,服务器端选择什么?大部分还是选择.Net吧。而那些Server端用php的,用java的,他们要是想引入RIA元素,你觉得他们会选择Silverlight还是Flash?咱就不说Server端用php或java的,就说俺接的这4个Flex项目,3个Server端用.Net的,1个用php的,连 Server 选择 .Net 技术的项目,客户都要用Flex不用Silverlight。
啥叫优势大?C# vs C++在开发速度上,这叫优势大。以前招聘一个哥们,让他写个性能要求不高的程序,他用C++写,写了一周还没搞定。我烦了,打开gedit(Linux下的记事本),一天就搞定了。这叫优势。而Silverlight针对Flash在RIA开发这一块,真没多大优势。都是拖控件,设置属性,写事件。Silverlight的改进只是锦上添花而已。说Flash不适合软件开发的,下面是俺的工作界面,看看哪里不适合了?
开发Silverlight,必须使用VS2010,才能和Flex Builder比开发体验啊,而VS2010还在产房里呢。
再看代码编写,俺这个Redo/Undo写的多简洁啊(多步Redo/Undo实现了但未经过测试,单步Redo/Undo测试正常):
package Orc.Patterns { import Orc.Collections.Stack; import flash.events.Event; import flash.events.EventDispatcher; public class HistoryManager extends EventDispatcher { public static const EVENT_MOMENTO_REDO:String="MomentoRedo"; public static const EVENT_MOMENTO_UNDO:String="MomentoUndo"; public static const EVENT_MOMENTO_CHANGED:String="MomentoChanged"; private var m_undoStack : Stack = new Stack(); private var m_redoStack : Stack = new Stack(); private var m_maxHistoryCount : int; public function HistoryManager(maxHistoryCount:int = 0) { if(m_maxHistoryCount <0) m_maxHistoryCount = 0; m_maxHistoryCount = maxHistoryCount; } public function get MaxHistoryCount():int { return this.m_maxHistoryCount; } public function PushMomento(obj:Object):void { if(this.MaxHistoryCount <= 0) return; while(this.m_undoStack.Size() > this.m_maxHistoryCount) { this.m_undoStack.Dequeue(); } this.m_undoStack.Push(obj); if(this.m_redoStack.IsEmpty()==false) this.m_redoStack.Clear(); this.DispatchMomentChangedEvent(); } public function get CanUndo():Boolean { return this.m_undoStack.Size() > 1; } public function get CanRedo():Boolean { return !this.m_redoStack.IsEmpty(); } public function Undo(step:int = 1):void { if(step < 1) return; if(this.CanUndo == false) return; if(step > (this.m_undoStack.Size()-1)) step = this.m_undoStack.Size()-1; var obj: Object = null; for(var i : int = 0; i < step; i++) { obj = this.m_undoStack.Pop(); if(obj!=null) this.m_redoStack.Push(obj); } obj = this.m_undoStack.Head; if(obj!=null) { this.DispatchMomentEvent(obj, EVENT_MOMENTO_UNDO); } this.DispatchMomentChangedEvent(); } public function Redo(step:int = 1):void { if(step < 1) return; if(this.CanRedo == false) return; if(step > this.m_redoStack.Size()) step = this.m_redoStack.Size(); var obj : Object = null; for(var i : int = 0; i < step; i++) { obj = this.m_redoStack.Pop(); if(obj != null) this.m_undoStack.Push(obj); } if(obj!=null) { this.DispatchMomentEvent(obj, EVENT_MOMENTO_REDO); } this.DispatchMomentChangedEvent(); } public function ClearMomentos():void { this.m_redoStack.Clear(); this.m_undoStack.Clear(); } private function DispatchMomentEvent(momento: Object, eventType: String):void { var e:MomentoEvent=new MomentoEvent(momento, eventType); this.dispatchEvent(e); } private function DispatchMomentChangedEvent():void { var e : Event = new Event(EVENT_MOMENTO_CHANGED); this.dispatchEvent(e); } } }
企业应用我举不出来,这些都很少公开在网上。但凭借俺接活接到过这方面的应用外包,而从没接到过Silverlight的这方面的应用外包可以看出,Flash/Flex应用在企业领域的不少。其它成功应用举例:
· Adobe 的 CS系列产品集成了大量的 Flash 作为程序(而非界面);
· 星际争霸2的部分界面
· keniu 影像在线版 http://www.keniu.com/online/online.html
· N多的类Visio程序的在线版
· N多的类photoshop简化在线版
· N多的在线股票分析
· 某款单人开发的共享软件,2009年盈利100多万美元
再看几个大公司开发的RIA应用,SilverlightQQ呵呵,看来像玩票。淘宝的银光http://list.mall.taobao.com/promotion/activity/silverlight.htm,点击店铺,会发现几乎都是死尸。
(5)视频应用
目前Flash是占绝对优势,剩下的两个,顶多做的和它一样好。
(6)Web Game
不说多了,就两个字:偷菜。进一步的3D Web Game,http://tankionline.com/ 这是Flash在线多人3D坦克对战游戏。下面是截图:
没敌人了,俺和友军一辆坦克互撞,刚被它撞翻了。爬起来了,接着撞。
前天晚上,我方几辆坦克和敌方几辆坦克轰得不亦乐乎。
========
最近项目太忙,没时间写太多,就到此为止。写这两篇文章的目的是想说明一个问题:
我们应具备分辨宣传和真相的能力。尤其是对于媒体文章,需要进行分析后选择性接受。观察这么多年,可以发现到这个现象:
(1)还没占据主导地位而先声夺人的,占据主导地位的可能性不高。
(2)那些占据主导地位的产品或技术,一般在前期都不被人所看好。当年马化腾卖QQ没人要,Google的几个哥们卖Google也没人要。
也就是那句俗话——响屁不臭,臭屁不响。
一个东西要取代另一个东西的取决因素很多,我上一篇文章 最近反Flash的气氛很浓啊,尤其是Html5这个小P孩 所采用的分析方法是 《创新的扩散》一书中的分析模型,那是Rogers总结了几乎所有发表的技术与创新的扩散案例总结出来的五点。并不是新东西看起来比旧东西好,就可以取代的。一个新技术要取代旧技术,必须具有非常明显非常突出的优势才行。
btw. 小声说下,目前Flex程序员这一块竞争还不激烈,赚钱比Silverlight要好赚。新入行的程序员可以尝试。别说是新入行的,就是我这个这么多年的.net程序员,在进行RIA技术选型时,目前也偏向于Flash。
下面针对 最近反Flash的气氛很浓啊,尤其是Html5这个小P孩 该文的一些典型回复作答:
(1) “chrome已实现了html的部分功能,如播放音频,视频,就相当于动摇了flash的半壁江山,至少那些运营音频,视频的网站不用向flash交费”
该交的还是要交啊。Flash客户端又不收费。收费的是Server。你就是用Html5,你也得Server吧。这个Server怎么来的?开源的还是商业的?商业的,也得交费。开源的,Flash Server也有开源的啊。
(2) “请问楼主的爷爷像楼主这么大时他身边是什么技术主导? 电报?手摇电话?小米加步枪?黑白相机? 这些在那时还是新技术吧,而且是主导的. 楼主阐述观点别说的那么夸张嘛,搞技术不是写小说,还是严谨点好.”
你说的替代是具有很大的相对优势才顺利替代的。如果相对优势很大,不管兼容性、复杂性、可实验性、可观察性咋样,也是可以替代的。这就像跳槽,如果工资只涨5%,你跳吗?而我上面的分析,Html5针对Flash没优势,Silverlight针对Flash有优势,但优势不大。哥这个分析是很严谨的,毕竟,我搞技术管理搞了几年,C#开发也从1.1就开始了,中间带人做Java项目也好几个,最近一年做Flex也好几个。并且使用的分析模型是很正规的模型。哥不是像记者那样信口写的。
(3)“而sl是瘦客户端,是个软件平台。从技术角度或许半斤八两,但是从受众来说是风马牛不相及。”
我上面详细分析了广告和产品展示、视频、Web Game、RIA开发四个领域,从受众来说,Flash和Silverlight是一致的,而目前Flash在这四个领域都占优势。