亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 11247 | 回復(fù): 37
打印 上一主題 下一主題

來看看Flash的奇葩數(shù)據(jù)結(jié)構(gòu),你就知道為什么Flash慢如蝸牛了 [復(fù)制鏈接]

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-01-10 16:00 |只看該作者 |倒序瀏覽
本帖最后由 noword2k 于 2012-01-18 10:56 編輯

眾所周知,Adobe 放棄了 Flash 在移動平臺的市場,一條重要的原因就是Flash跑起來太慢了。
Flash為什么這么慢?一起來看看它奇葩的數(shù)據(jù)結(jié)構(gòu)就知道了。

關(guān)于swf格式,Adobe官網(wǎng)上有完整PDF可以下載。
http://www.adobe.com/devnet/swf.html

從Basic Data Types開始,前面是有符號和無符號的整數(shù),從8位到64位都有;接下來是定點數(shù),也很正常。

下面的浮點數(shù),竟然有16位的浮點數(shù)。
有那種現(xiàn)代CPU直接支持16位浮點數(shù)嗎?至少i386架構(gòu)的CPU沒有吧。
還得轉(zhuǎn)換成標(biāo)準(zhǔn)的32位float,才能運算吧。
搜索一下“half float”,看看怎么轉(zhuǎn)吧。

  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. }
復(fù)制代碼
nvidia-texture-tools里面,還有為了優(yōu)化,而更加夸張的代碼。
為了用16位的浮點數(shù),而在底層付出這樣的代價,值得嗎?

繼續(xù)看下去。
接下來是EncodedU32。以前,你聽說過有這種東東嗎?
簡單的說,就是可變長的整數(shù)。
來看看讀取的代碼:

  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;
復(fù)制代碼
直接用32位的整數(shù),會死人嗎?

接下去,還有更雷人的Rectangle record 和 MATRIX record,取值單位是bit,注意是bit不是byte。
例如,一個byte前5個bit是某個值,后3個bit與后一個byte的若干個bit組成另一個值。

大規(guī)模的使用變長的bit結(jié)構(gòu),這樣“打碎”byte的做法,貫穿著整個flash結(jié)構(gòu)。
我不知道當(dāng)初的設(shè)計人員是怎么考慮的,為了節(jié)省存儲空間嗎,還是為秀技巧?
節(jié)省存儲空間的話,flash不是直接支持zlib壓縮的格式嗎?

flash死的一點也不冤,從誕生的那一刻起,從那個腦殘的 leader 定義這種腦殘的數(shù)據(jù)結(jié)構(gòu)起,就注定失敗。

論壇徽章:
0
2 [報告]
發(fā)表于 2012-01-10 16:07 |只看該作者
臥槽 .. 頂起求驗證

論壇徽章:
0
3 [報告]
發(fā)表于 2012-01-10 16:07 |只看該作者
本帖最后由 AD8018 于 2012-01-10 16:07 編輯

不奇怪,在用電話線上網(wǎng)的年代,flash文件的大小很重要。
正是由于其用極小的空間實現(xiàn)了動畫,
它才能如此的成功。
當(dāng)然,敗也蕭何,這好像是后話了。

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
4 [報告]
發(fā)表于 2012-01-10 16:17 |只看該作者
AD8018 發(fā)表于 2012-01-10 16:07
不奇怪,在用電話線上網(wǎng)的年代,flash文件的大小很重要。
正是由于其用極小的空間實現(xiàn)了動畫,
它才能如此 ...

我文章里已說過,如果為了減少存儲空間,flash已經(jīng)有 zlib 了。
文件的信息量不變,用zlib壓縮以后,能有多大的區(qū)別呢?

論壇徽章:
0
5 [報告]
發(fā)表于 2012-01-10 16:59 |只看該作者
難道是為了奸蠑?

論壇徽章:
0
6 [報告]
發(fā)表于 2012-01-10 17:06 |只看該作者
回復(fù) 5# 雞絲拌面


    .. 這個詞有什么隱含意義或思想感情么

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
7 [報告]
發(fā)表于 2012-01-10 17:42 |只看該作者
不就是一個16位的浮點數(shù)么,有啥奇怪的?梢杂8位的整數(shù),為啥不能有16位的浮點數(shù)

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
8 [報告]
發(fā)表于 2012-01-10 17:47 |只看該作者
koolcoy 發(fā)表于 2012-01-10 17:42
不就是一個16位的浮點數(shù)么,有啥奇怪的?梢杂8位的整數(shù),為啥不能有16位的浮點數(shù)

回帖不看貼的,你對得起你的頭像嗎?

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
9 [報告]
發(fā)表于 2012-01-10 19:31 |只看該作者
回復(fù) 8# noword2k

你咋知道我沒看帖的{:3_189:}
你不就是因為flash用了一個x86 cpu不支持的16位浮點數(shù),而16位浮點轉(zhuǎn)32位浮點算法繁瑣,發(fā)了一肚子牢騷么~~~

論壇徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
10 [報告]
發(fā)表于 2012-01-10 19:33 |只看該作者
哦,看見了,還發(fā)了其它牢騷的{:3_196:}
視頻處理這種以bit為單位的數(shù)據(jù)結(jié)構(gòu)到處都是,你看看h264什么的就知道了
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP