精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-14
最后修改:2008-12-14
板子要打在macromedia身上,因为在那Internet的蛮荒岁月,macromedia为了尽可能的减少swf文件的尺寸,在一部分对象中采用非字节对齐的文件格式。 简单的说,一部分对象不是以int/short这样存储的,而是以bit位这样存储的。
让我们看一个例子,例如Rect结构,在swf文件中的存储格式:
假设有一个700x350的Rectangle,在swf文件的存储如下(以2进制表示)
01111000,00000000,00000110,11010110,00000000,00000000,00001101,10101100,00000000,00000000,00011000,00000010,00000000,01000100,00010001,00011001 --------==============--------------------------==============-------------------------- 储存每 xMin xMax yMin yMax 维长度 的bit数
Rect结构储存如下: 首5个字节代表了之后长宽高的bit数,这里是01111 ,换成10进制是15,代表后面每15个字节就是一维长度 xMin一看就知道,十进制是0 xMax的2进制表示是 011011010110 ,换成10进制是14000 yMin同样一看就知道十进制是0 yMax二进制表示是001101101011000,换成10进制是7000
所以这个Rectangle的四维分别是width = 14000, height=7000
??前面不是说长宽分别是700x350么?
天哪,adobe开源的swf文件格式在Using bit values里的例子有点瑕疵,所以这个问题也困扰了我半天。其实14000的单位是twips,20twips=1pixel 所以长宽仍然是14000/20 = 700, 7000/20 = 350
所以可以看出,当时macromedia在设计swf的时候,隐含就是假设一个int=32位,所以酱紫不知道怎样才可以扩展成64位。 恐怕Adobe在收购以后才发现,macromedia原来这么原始…… 所以或许Adobe要重新编写虚拟机才能顺利的拓展成64位。但是从flex的sdk来看,我觉得Adobe在语言上并不擅长。 这也告诉我们,为了性能而做的bad design总会在将来的某一天成为你的梦魇。
好了,休息,休息一下。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-15
An alpha version of 64-bit Adobe Flash Player 10 for Linux operating systems was released on 11/17/2008.
|
|
返回顶楼 | |
发表时间:2008-12-15
最后修改:2008-12-15
原理也许对,但是不一定因为这个才不出flashplayer的64位版本。另外yMax后面的位数是干啥的,为啥不能用于扩展64位?才用了一半
|
|
返回顶楼 | |
发表时间:2008-12-16
由于字体不是等宽的,所以yMax应该是蓝色背景那部分,后面7个bit是为了字节对齐,没有用,全为0,再后面的00000000,00011000是其他结构的开始。
顺带说一下,这是看SWF规范得出的结论,不是我自己瞎猜出来饿。 Flash Player for x64估计是把32位结构移植到了64位机器上,内部仍然还是32位的,理由如下: AS3里整型只有int,32位的。Rect结构里首位5个字节最大值是31,说明Rect长宽最大只能是31位,要扩展成64位的,必须改Rect结构,这等于过去所有的SWF都要重新编译。 |
|
返回顶楼 | |
发表时间:2008-12-17
这个是个问题,单不是原因。
1、Flash中不需要支持64bit计算,这个目前只有科学计算才需要。So,只需要32bit就够了。 2、网络层的缩位是很常见的处理。 |
|
返回顶楼 | |
发表时间:2009-01-09
我想,2个应该没有必然的联系
即使我64位的vm用32位的方式解释swf又如何 为什么会讨论到swf的格式呢。。 顶多就是swf不支持64位而已 |
|
返回顶楼 | |
发表时间:2009-01-10
allenofchina 写道 由于字体不是等宽的,所以yMax应该是蓝色背景那部分,后面7个bit是为了字节对齐,没有用,全为0,再后面的00000000,00011000是其他结构的开始。
顺带说一下,这是看SWF规范得出的结论,不是我自己瞎猜出来饿。 Flash Player for x64估计是把32位结构移植到了64位机器上,内部仍然还是32位的,理由如下: AS3里整型只有int,32位的。Rect结构里首位5个字节最大值是31,说明Rect长宽最大只能是31位,要扩展成64位的,必须改Rect结构,这等于过去所有的SWF都要重新编译。 也许你是比较习惯c语言 为什么int就必须是机器的字长,为什么for x64就得把Rect变成64位呢?31位照样可以用 java,c#,无论什么机器,int总是32位,long总是64位,对于c,许多编译器也支持__int32和__int64,和机器无关 |
|
返回顶楼 | |
浏览 11124 次