- 论坛徽章:
- 1
|
本帖最后由 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”,看看怎么转吧。
- unsigned int
- halfToFloat (unsigned short y)
- {
- int s = (y >> 15) & 0x00000001;
- int e = (y >> 10) & 0x0000001f;
- int m = y & 0x000003ff;
- if (e == 0)
- {
- if (m == 0)
- {
- //
- // Plus or minus zero
- //
- return s << 31;
- }
- else
- {
- //
- // Denormalized number -- renormalize it
- //
- while (!(m & 0x00000400))
- {
- m <<= 1;
- e -= 1;
- }
- e += 1;
- m &= ~0x00000400;
- }
- }
- else if (e == 31)
- {
- if (m == 0)
- {
- //
- // Positive or negative infinity
- //
- return (s << 31) | 0x7f800000;
- }
- else
- {
- //
- // Nan -- preserve sign and significand bits
- //
- return (s << 31) | 0x7f800000 | (m << 13);
- }
- }
- //
- // Normalized number
- //
- e = e + (127 - 15);
- m = m << 13;
- //
- // Assemble s, e and m.
- //
- return (s << 31) | (e << 23) | m;
- }
复制代码 nvidia-texture-tools里面,还有为了优化,而更加夸张的代码。
为了用16位的浮点数,而在底层付出这样的代价,值得吗?
继续看下去。
接下来是EncodedU32。以前,你听说过有这种东东吗?
简单的说,就是可变长的整数。
来看看读取的代码:
- unsigned int value = 0;
- value = getUI8();
- if (!(value & 0x80)) {
- return value;
- }
- value = (value & 0x7f) | (getUI8() << 7);
- if (!(value & 0x4000)) {
- return value;
- }
- value = (value & 0x3fff) | (getUI8() << 14);
- if (!(value & 0x200000)) {
- return value;
- }
- value = (value & 0x1fffff) | (getUI8() << 21);
- if (!(value & 0x10000000)) {
- return value;
- }
- value = (value & 0xfffffff) | (getUI8() << 28);
- return value;
复制代码 直接用32位的整数,会死人吗?
接下去,还有更雷人的Rectangle record 和 MATRIX record,取值单位是bit,注意是bit不是byte。
例如,一个byte前5个bit是某个值,后3个bit与后一个byte的若干个bit组成另一个值。
大规模的使用变长的bit结构,这样“打碎”byte的做法,贯穿着整个flash结构。
我不知道当初的设计人员是怎么考虑的,为了节省存储空间吗,还是为秀技巧?
节省存储空间的话,flash不是直接支持zlib压缩的格式吗?
flash死的一点也不冤,从诞生的那一刻起,从那个脑残的 leader 定义这种脑残的数据结构起,就注定失败。 |
|