免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 11112 | 回复: 37
打印 上一主题 下一主题

来看看Flash的奇葩数据结构,你就知道为什么Flash慢如蜗牛了 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-10 16:00 |只看该作者 |倒序浏览
本帖最后由 noword2k 于 2012-01-18 10:56 编辑

众所周知,Adobe 放弃了 Flash 在移动平台的市场,一条重要的原因就是Flash跑起来太慢了。
Flash为什么这么慢?一起来看看它奇葩的数据结构就知道了。

关于swf格式,Adobe官网上有完整PDF可以下载。
http://www.adobe.com/devnet/swf.html

从Basic Data Types开始,前面是有符号和无符号的整数,从8位到64位都有;接下来是定点数,也很正常。

下面的浮点数,竟然有16位的浮点数。
有那种现代CPU直接支持16位浮点数吗?至少i386架构的CPU没有吧。
还得转换成标准的32位float,才能运算吧。
搜索一下“half float”,看看怎么转吧。

  1. unsigned int
  2. halfToFloat (unsigned short y)
  3. {

  4.     int s = (y >> 15) & 0x00000001;
  5.     int e = (y >> 10) & 0x0000001f;
  6.     int m =  y        & 0x000003ff;

  7.     if (e == 0)
  8.     {
  9.         if (m == 0)
  10.         {
  11.             //
  12.             // Plus or minus zero
  13.             //

  14.             return s << 31;
  15.         }
  16.         else
  17.         {
  18.             //
  19.             // Denormalized number -- renormalize it
  20.             //

  21.             while (!(m & 0x00000400))
  22.             {
  23.                 m <<= 1;
  24.                 e -=  1;
  25.             }

  26.             e += 1;
  27.             m &= ~0x00000400;
  28.         }
  29.     }
  30.     else if (e == 31)
  31.     {
  32.         if (m == 0)
  33.         {
  34.             //
  35.             // Positive or negative infinity
  36.             //

  37.             return (s << 31) | 0x7f800000;
  38.         }
  39.         else
  40.         {
  41.             //
  42.             // Nan -- preserve sign and significand bits
  43.             //

  44.             return (s << 31) | 0x7f800000 | (m << 13);
  45.         }
  46.     }

  47.     //
  48.     // Normalized number
  49.     //

  50.     e = e + (127 - 15);
  51.     m = m << 13;

  52.     //
  53.     // Assemble s, e and m.
  54.     //

  55.     return (s << 31) | (e << 23) | m;
  56. }
复制代码
nvidia-texture-tools里面,还有为了优化,而更加夸张的代码。
为了用16位的浮点数,而在底层付出这样的代价,值得吗?

继续看下去。
接下来是EncodedU32。以前,你听说过有这种东东吗?
简单的说,就是可变长的整数。
来看看读取的代码:

  1.         unsigned int value = 0;
  2.         value = getUI8();
  3.         if (!(value & 0x80)) {
  4.                 return value;
  5.         }
  6.         value = (value & 0x7f) | (getUI8() << 7);
  7.         if (!(value & 0x4000)) {
  8.                 return value;
  9.         }
  10.         value = (value & 0x3fff) | (getUI8() << 14);
  11.         if (!(value & 0x200000)) {
  12.                 return value;
  13.         }
  14.         value = (value & 0x1fffff) | (getUI8() << 21);
  15.         if (!(value & 0x10000000)) {
  16.                 return value;
  17.         }
  18.         value = (value & 0xfffffff) | (getUI8() << 28);
  19.         return value;
复制代码
直接用32位的整数,会死人吗?

接下去,还有更雷人的Rectangle record 和 MATRIX record,取值单位是bit,注意是bit不是byte。
例如,一个byte前5个bit是某个值,后3个bit与后一个byte的若干个bit组成另一个值。

大规模的使用变长的bit结构,这样“打碎”byte的做法,贯穿着整个flash结构。
我不知道当初的设计人员是怎么考虑的,为了节省存储空间吗,还是为秀技巧?
节省存储空间的话,flash不是直接支持zlib压缩的格式吗?

flash死的一点也不冤,从诞生的那一刻起,从那个脑残的 leader 定义这种脑残的数据结构起,就注定失败。

论坛徽章:
0
2 [报告]
发表于 2012-01-10 16:07 |只看该作者
卧槽 .. 顶起求验证

论坛徽章:
0
3 [报告]
发表于 2012-01-10 16:07 |只看该作者
本帖最后由 AD8018 于 2012-01-10 16:07 编辑

不奇怪,在用电话线上网的年代,flash文件的大小很重要。
正是由于其用极小的空间实现了动画,
它才能如此的成功。
当然,败也萧何,这好像是后话了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
4 [报告]
发表于 2012-01-10 16:17 |只看该作者
AD8018 发表于 2012-01-10 16:07
不奇怪,在用电话线上网的年代,flash文件的大小很重要。
正是由于其用极小的空间实现了动画,
它才能如此 ...

我文章里已说过,如果为了减少存储空间,flash已经有 zlib 了。
文件的信息量不变,用zlib压缩以后,能有多大的区别呢?

论坛徽章:
0
5 [报告]
发表于 2012-01-10 16:59 |只看该作者
难道是为了奸蝾?

论坛徽章:
0
6 [报告]
发表于 2012-01-10 17:06 |只看该作者
回复 5# 鸡丝拌面


    .. 这个词有什么隐含意义或思想感情么

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2012-01-10 17:42 |只看该作者
不就是一个16位的浮点数么,有啥奇怪的。可以有8位的整数,为啥不能有16位的浮点数

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
8 [报告]
发表于 2012-01-10 17:47 |只看该作者
koolcoy 发表于 2012-01-10 17:42
不就是一个16位的浮点数么,有啥奇怪的。可以有8位的整数,为啥不能有16位的浮点数

回帖不看贴的,你对得起你的头像吗?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2012-01-10 19:31 |只看该作者
回复 8# noword2k

你咋知道我没看帖的{:3_189:}
你不就是因为flash用了一个x86 cpu不支持的16位浮点数,而16位浮点转32位浮点算法繁琐,发了一肚子牢骚么~~~

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2012-01-10 19:33 |只看该作者
哦,看见了,还发了其它牢骚的{:3_196:}
视频处理这种以bit为单位的数据结构到处都是,你看看h264什么的就知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP