前些日子随手写的《Silverlight与Flash的一点不同》一文,有读者提出了赞同和反对意见,意料之中的事情,呵呵,继续讨论如下。
WPF是以XAML为基础的,而XAML并不是为Streaming而设计的,至少我没有看到对此的说明。理论上,XAML也是可以像XML Stream的方式来处理,但是Code BehIDe对应的DLL呢?至少,你总得把整个Dll下载完成后才能加载吧,我不知道微软已经做到了代码的边运行边下载的,就像cpu访问物理内存产生的缺页中断那样--理论上是可以做到,也看到类似的产品了,好像是SoftGrID。
让我们来看一下Flash的SWF文件结构,首先是文件头
FIEld Type* Comment
Signature UI8 Signature byte always ‘F’
Signature UI8 Signature byte always ‘W’
Signature UI8 Signature byte always ‘S’
Version UI8 Single byte file version (e.g. 0x04F for SWF 4)
fileLength UI32 Length of entire file in bytes
FrameSize RECT Frame size in twips
FrameRate UI16 Frame delay in 8.8 fixed number of frames per second
FrameCount UI16 Total number of frames in movIE
更多详情请参见http://www.half-serious.com/swf/format,下同。
我们可以看到,有FrameSize/FrameRate/FrameCount等信息。这跟流媒体的结构是类似的,数据应该是一帧帧组成成的,但也不完全相同,下面解释。
在文件头之后,是一块块独立的数据块(Tagged Data Block),可以是显示数据,也可以是控制命令。并且,数据块内的数据只能对本块的数据进行引用,而不能超越,从而保证Block的独立性。
Tag只能向前引用,而不能引用后面出现的Tag,这是Streaming的关键!
SWF的处理过程是,在遇到第一个ShowFrame Tag的时候,把之前的数据显示到屏幕上,此为第一帧。然后继续下载Tag,再次遇到ShowFrame Tag的时候,在原来第一帧的基础上加入新的数据以显示,此为第二帧……如此等等,直到文件末。
SWF里除了可以包含纯数据,还可以包含控制代码,这是与MPEG等只包含纯数据的流媒体格式不一样的地方。
我之所以说Flash天生就支持流媒体,是因为它的文件格式,以及处理模式就是流式处理的,并不是说它可以显示视频。其实,视频这个定义很模糊,还是用流媒体数据更合适吧。
之所以说Silverlight不是天生支持流媒体,而是后天补充的,是因为它的数据格式本身不是按照Block来组织的。如果把一个Xap包当做一个Block的话,粒度好像太大了。当然,只要能分段下载运行,也算是一种Streaming了,没有人说一定要像Flash那样才算Streaming啊。
写到这里,我突然意识到,有些概念可能搞混了。问题其实有两部分,即数据可以流式处理,和支持流式数据的处理--暂时还找不到合适的称谓。
前面我们讲的只是SWF文件可以流式处理,即边下载边运行。当遇到标准的流媒体数据,比如MP3数据流怎么办?在Silverlight是通过MediaElement来实现流媒体播放的,在Flash里大概也是类似(没仔细研究过)。由此可见,对标准流媒体的播放,Silverlight和Flash并没有什么不同。但是,在自身数据的流式处理上,Flash似乎更胜一筹。
不同的实现机制,各有优劣,不分高下。
总结以上是内存溢出为你收集整理的Silverlight与Flash的一点不同 续全部内容,希望文章能够帮你解决Silverlight与Flash的一点不同 续所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)