最近反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不适合软件开发的,下面是俺的工作界面,看看哪里不适合了?

image

开发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);
		}
	}
}
实际上,除了语法有变,Action Script3可以当作简化版的C# 4.0来用。

企业应用我举不出来,这些都很少公开在网上。但凭借俺接活接到过这方面的应用外包,而从没接到过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坦克对战游戏。下面是截图:

image

没敌人了,俺和友军一辆坦克互撞,刚被它撞翻了。爬起来了,接着撞。

image 

前天晚上,我方几辆坦克和敌方几辆坦克轰得不亦乐乎。

========

最近项目太忙,没时间写太多,就到此为止。写这两篇文章的目的是想说明一个问题:

我们应具备分辨宣传和真相的能力。尤其是对于媒体文章,需要进行分析后选择性接受。观察这么多年,可以发现到这个现象:

(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在这四个领域都占优势。

posted @ 2010-02-25 05:56 xiaotie 阅读(...) 评论(...) 编辑 收藏