zoukankan      html  css  js  c++  java
  • 最近反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在这四个领域都占优势。

    版权所有,欢迎转载
  • 相关阅读:
    Python小工具:统计代码行数
    计算机图形学复习(一)
    牛客多校训练第一场 J.Different Integers
    数据校验码概述
    数据库复习第二章
    数据库复习第一章
    自动化AC器(带界面版)
    ZOJ 3747 Attack on Titans
    Codeforces Round #245 (Div. 1) B. Working out
    HDU 6266 Hakase and Nano 【博弈论】
  • 原文地址:https://www.cnblogs.com/xiaotie/p/1673116.html
Copyright © 2011-2022 走看看