• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            MMX版本的Alpha Blend算法實現(xiàn)

            Posted on 2010-03-31 10:50 S.l.e!ep.¢% 閱讀(663) 評論(0)  編輯 收藏 引用 所屬分類: VC

            MMX版本的Alpha Blend算法實現(xiàn)


            這次我們的目標是: 超越普通的CPU玩家,用CPU的母語來優(yōu)化程序!

            實驗器材:VC++ 4.2以上的編譯器或C++ Builder 4.0以上編譯器

            MMX技術到現(xiàn)在來說可以算是基本大眾化了,目前大多數(shù)個人電腦都應該能支持它。P55C,K6,PII,PIII...按照慣例,Intel公司將在以后的x86版本永遠支持它。

            要了解MMX指令體系,請一定瀏覽以下URL,獲得系統(tǒng)的MMX體系知識:

            http://www.game1st.com/database/mmxd/mmxd.htm

            否則將會對我的講解摸不著北,(象聽最優(yōu)控制或者線性控制理論一樣)

            提示:最好自己多寫些Console App來實驗和熟悉MMX指令特性,cout出結果,不要一來就搞Windows App.

            MMX技術的優(yōu)點是什么?

            一言蔽之,就是一個指令操作多個整型數(shù)據(jù).并且可以自動完成飽和運算

            MMX最適合的應用領域是數(shù)字圖象處理 ,然后是語音,通訊等領域。

            寫圖象處理算法時很影響效率的以下幾點是:

            1.不厭其煩的低效鄰域操作: 不厭其煩的寫GfxBuffer[i],GfxBuffer[i+1],GfxBuffer[i+2],...取RGB值等。

            2.惱人的環(huán)繞:

            像素運算溢出,必須拿個大點的數(shù)據(jù)類型來保存結果再判斷溢出,否則結果就是錯誤的

            short int GfxOut=GfxBuf1[i]+GfxBuf2[i]; ...

            if(GfxOut>255)GfxOut=255; if(GfxOut<0)GfxOut=0;

            問題是你知道那兩個判斷回會生成多少匯編代碼嗎?

            3.不必要的高精度: 該死的RGB->YUV運算,我們最熟悉的彩色轉灰度運算: Y=(BYTE)(Red*0.299+Green*0.587+Blue*0.114);

            其實我們關心的是一個字節(jié)結果,誰愿意讓協(xié)處理器做大量運算,得到float結果,還要再轉換為byte結果呢?要知道IEEE浮點轉整數(shù)可不象在C程序里看起來那么簡單!(在你為51單片機這種低級的劣質的沒有協(xié)處理器的CPU寫過程序就知道了...)代價是相當大的。

            尤其圖面比較大的情況下,你會在屏幕面前等得生霉,我們不要那么高的精度啊。

            而MMX技術就是黑暗中的燈塔,被老板咒罵的程序員的救命稻草,使圖象處理模式識別和神經(jīng)網(wǎng)絡專業(yè)方向的研究生不被導師訓斥的的葵花寶典...(本人不系Intel中國公司的營銷部經(jīng)理啊..)

            以32-bit為例,下面具體講下用簡單的例子講解MMX技術優(yōu)化北航老王頭提供的Alpha Blend算法:

            絕對為本人在某個深夜所原創(chuàng),不抄襲自任何資料

            char *pSrc,*pOvr; { pSrc=pScanline1+j; pOvr=pScanLine2+j; j+=4; .....

            假定我們的源像素在pSrc,覆蓋圖Overlay在pOvr,各指向一個32 bit像素。

            ( 為什么要以32bit像素?因為老赫有兩年做字幕卡程序的背景,電視字幕是32 bit圖文層嘛! )

            如果你閱讀了開始我提供的URL文檔,你就清楚,MMX有八個64bitRegister,叫MM0->MM7,是浮點處理器的別名,也是他們的低64位映象。

            __asm{ pxor mm2,mm2 //把MM2清0

            mov edx,dword ptr [pSrc] //取32bit像素地址到edx

            movd mm0,dword ptr [edx] //把Source像素取到mm0低32bit

            mov edx,dword ptr [pOvr]

            movd mm1,dword ptr [edx] //把32 bit Overlay像素取到mm1低32bit

            punpcklbw mm0,mm2 //Source:8 bit到16 bit以容納結果,32bit expand to 64 bit

            punpcklbw mm1,mm2 //Overlay:8 bit到16 bit以容納結果.32bit expand to 64 bit

            movq mm3,mm1 // 因為要用Overlay的Alpha值

            punpckhwd mm3,mm3 // 高字移動到雙字

            punpckhdq mm3,mm3 // 雙字移動到四字,現(xiàn)在有八個像素的Alpha了!

            movq mm4,mm0 //Source->mm4

            movq mm5,mm1 //Overlay->mm5

            psubusw mm4,mm1 //Source-Overlay,飽和減,小于0為0

            psubusw mm5,mm0 //Overlay-Source,飽和減,小于0為0

            pmullw mm4,mm3 //Alpha * (Source-Overlay)

            pmullw mm5,mm3 //Alpha * (Overlay-Source)

            psrlw mm4,8 //除以256,now mm4 get the result,(Source-Overlay)<0 部分

            psrlw mm5,8 //除以256,now mm5 get the result,(Overlay-Source)>0 部分

            paddusw mm0,mm5 //飽和加到原圖象:D=Alpha*(O-S)+S,(Source-Overlay)<0 部分

            psubusw mm0,mm4 //飽和加到原圖象D=S-Alpha*(S-O),(Overlay-Source)>0 部分

            packuswb mm0,mm0 //緊縮到低32bit

            mov edx,dword ptr [pSrc]

            movd dword ptr [edx],mm0 //保存結果

            emms ///必要的!Empty MMX Status

            } 以上算法和常規(guī)算法比較:

            Legend PII 400 With damnble,extremely Slow Sis6326 Video Card: 640*480*32bit bitmap:

            Normal algorithm:170-180 ms

            This algorithm:Below 40 ms

            均包含拷貝內(nèi)存時間,純處理時間只要20ms, 就是說如果用DirectX,Blt,BltFast通常比memcpy快很多.就小于40ms了

            總結: 反復使用緊縮移位,緊縮擴展,緊縮壓縮指令,并施加飽和運算等,是用MMX寫算法的核心。

            程序員必須對數(shù)制,內(nèi)存結構,定點數(shù)很熟悉才能寫出高效率的MMX加速的子程序。

            久久久久久久波多野结衣高潮| 久久夜色精品国产欧美乱| 国产一级持黄大片99久久| 久久九九亚洲精品| 久久97久久97精品免视看| 国产精品欧美久久久久无广告| 91麻豆国产精品91久久久| 精品久久久久香蕉网| 成人国内精品久久久久影院VR| 亚洲精品成人网久久久久久| 国产精品久久久久久吹潮| 国产高潮国产高潮久久久91 | 国产成人精品久久一区二区三区| 国产精品欧美久久久天天影视| 久久精品无码一区二区三区免费 | 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 色婷婷久久久SWAG精品| 国产婷婷成人久久Av免费高清 | 亚洲精品乱码久久久久久不卡| 久久人人爽人人爽人人片AV高清| 女人香蕉久久**毛片精品| 伊人久久大香线蕉av不卡| 很黄很污的网站久久mimi色| 亚洲精品蜜桃久久久久久| 无码8090精品久久一区| 丁香五月网久久综合| 蜜臀av性久久久久蜜臀aⅴ| 亚洲人成网站999久久久综合| 亚洲国产精品久久久久婷婷老年| 东方aⅴ免费观看久久av| 亚洲精品无码久久毛片| 久久精品国产99久久丝袜 | 久久久久成人精品无码| 国产成人久久精品一区二区三区 | 久久久久亚洲AV成人网人人软件| 久久综合给合久久狠狠狠97色| 久久久久亚洲国产| 手机看片久久高清国产日韩| 香蕉aa三级久久毛片| 欧美久久综合九色综合| 精品久久综合1区2区3区激情|