青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Jiang's C++ Space

創(chuàng)作,也是一種學(xué)習(xí)的過(guò)程。

   :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
位圖這個(gè)概念對(duì)于計(jì)算機(jī)圖形學(xué)來(lái)說(shuō)是個(gè)至關(guān)重要的概念,我們?cè)谄聊簧峡吹降娜魏螙|西,對(duì)計(jì)算機(jī)來(lái)說(shuō),其實(shí)都是位圖,簡(jiǎn)單地說(shuō),無(wú)論你是想顯示文字,還是線條,抑或bmp,png,jpg和gif等圖像文件,最終都是要直接或間接轉(zhuǎn)變?yōu)橛?jì)算機(jī)顯示設(shè)備所認(rèn)識(shí)的位圖,才能顯示在屏幕上。

我最近接手了一個(gè)項(xiàng)目,是Windows Mobile平臺(tái)的,主要做UI美化,貼圖是其中的一大塊,我遇到的最大的問(wèn)題就是貼圖的效率問(wèn)題,如何將一張內(nèi)存里的圖片高效繪制出來(lái),實(shí)現(xiàn)平滑流暢的UI動(dòng)畫效果。我嘗試了許多辦法,甚至DirectDraw,但我發(fā)覺(jué)在硬件不支持的情況下,DirectDraw除了讓代碼變得更復(fù)雜之外,沒(méi)有任何優(yōu)點(diǎn)。好,接下去我們來(lái)分析一下如何盡量發(fā)揮GDI的威力。

跟貼圖相關(guān)的函數(shù)有幾個(gè):
BitBlt:最基本的塊傳輸函數(shù)。
StretchBlt:比同BitBlt,它支持圖像的拉伸和壓縮,當(dāng)不需要拉伸和壓縮時(shí)候,它的效果和BitBlt并無(wú)二致。
TransparentBlt:比同StretchBlt,它多了個(gè)“摳色”(Color Keying)功能,能把某種顏色或者某個(gè)范圍的顏色摳去而不作塊傳輸處理,以此來(lái)繪制不規(guī)則圖像。
AlphaBlend:比同StretchBlt,它支持Alpha混合,即“半透明”效果,效果比簡(jiǎn)單的“摳色”更好。

這幾個(gè)函數(shù)是一個(gè)比一個(gè)強(qiáng),但也意味著效率一個(gè)比一個(gè)低,總體上看差不多是這樣的,運(yùn)算量越大,當(dāng)然就越慢,但測(cè)試下來(lái)發(fā)覺(jué)這其實(shí)并不絕對(duì),后面會(huì)提到。

了解了這幾個(gè)函數(shù)之后,我們開始加載一張圖片來(lái)觀察效果,我準(zhǔn)備的是一張320*320的png圖片,利用Windows Mobile 6.0提供的IImage接口來(lái)加載它,并把它轉(zhuǎn)變?yōu)槲粓D,獲得HBITMAP。加載png的代碼可以通過(guò)搜索引擎搜索“IImage用法”等關(guān)鍵詞來(lái)獲取,此處略過(guò)。

加載好圖片后,創(chuàng)建一個(gè)和設(shè)備顯示設(shè)備兼容的DC(Device Context),選入上面加載的位圖,用BitBlt繪制,代碼如下(為簡(jiǎn)潔起見(jiàn),只貼出關(guān)鍵代碼,并且不考慮資源釋放):
HDC hWndDC = GetDC(hWnd);
HDC hMemDC 
= CreateCompatibleDC(hWndDC);
SelectObject(hMemDC, hBitmap); 
//hBitmap是前面加載的圖片
BitBlt(hWndDC, 00, iWidth, iHeight, hMemDC, 00, SRCCOPY);

我們通過(guò)添加一些debug代碼來(lái)觀察BitBlt的執(zhí)行時(shí)間,在我的模擬器上大約是50 - 60ms,我發(fā)覺(jué)這個(gè)速度并不快,按道理說(shuō),BitBlt應(yīng)該可以在極短的時(shí)間之內(nèi)完成的(1 - 2ms),也只有這樣才能實(shí)現(xiàn)“流暢”的UI動(dòng)畫效果,否則圖一旦多起來(lái),豈不是更慢。


我嘗試修改BitBlt的最后一個(gè)參數(shù),我發(fā)覺(jué)換成NOTSRCCOPY,速度更慢,變成了70多ms,說(shuō)明運(yùn)算量更大了,這不是簡(jiǎn)單的內(nèi)存拷貝;而當(dāng)我把最后一個(gè)參數(shù)換成BLACKNESS或者WHITENESS的時(shí)候,速度則很快,1ms-2ms即可完成,很顯然,對(duì)BitBlt來(lái)說(shuō),把目標(biāo)全部置為黑色或者白色,運(yùn)算量遠(yuǎn)少于像素傳送。在實(shí)驗(yàn)的時(shí)候把BitBlt替換為另外的幾個(gè)函數(shù),效果和預(yù)期的相差不大,如果圖像需要拉伸,則執(zhí)行得更慢一些,但如果圖像不是拉伸,而是壓縮,即縮小顯示,執(zhí)行速度居然比較快,有些意外,這是因?yàn)閴嚎s后圖像變小,需要傳輸?shù)南袼刈兩俚木壒省?br>
我考慮如何提高繪圖效率,經(jīng)過(guò)很多次嘗試,終于有所突破,我最后發(fā)現(xiàn):如果先把位圖存放在一個(gè)和DC兼容的位圖中,再用這個(gè)位圖對(duì)目標(biāo)設(shè)備進(jìn)行像素傳輸,速度十分理想。代碼:
HDC hWndDC = GetDC(hWnd);
HDC hMemDC 
= CreateCompatibleDC(hWndDC);
HDC hMemDCToLoad 
= CreateCompatibleDC(hWndDC);
HBITMAP hMemBmp 
= CreateCompatibleBitmap(hWndDC, iWidth, iHeight); // The compatible bitmap
HGDIOBJ hOldBmp = SelectObject(hMemDC, hMemBmp);
SelectObject(hMemDCToLoad, hBitmap);
BitBlt(hMemDC, 
00, iWidth, iHeight, hMemDCToLoad, 00, SRCCOPY); //Do this in initialization
BitBlt(hWndDC, 00, iWidth, iHeight, hMemDC, 00, SRCCOPY); //This BitBlt's speed is very fast

第一次調(diào)用BitBlt,可以看作是初始化,我們計(jì)算第二個(gè)BitBlt的耗時(shí),只有1 - 2ms,非常不錯(cuò),經(jīng)過(guò)分析,我認(rèn)為原因應(yīng)該是這樣(不一定全對(duì),如有不妥請(qǐng)讀者指出):

只有在位圖格式完全一致的情況下,BitBlt才能執(zhí)行真正的內(nèi)存拷貝,否則是要經(jīng)過(guò)轉(zhuǎn)換的,轉(zhuǎn)換是需要消耗CPU時(shí)間的,所以慢。

那如何知道位圖的格式呢?用GetObject可以看出來(lái):

如上圖所示,bmp是從png文件加載進(jìn)來(lái)的位圖的信息,而bmp2是用CreateCompatibleBitmap創(chuàng)建的位圖的信息,從這我們能看到,前者是24bit位圖,即一個(gè)像素用3個(gè)字節(jié)表示,而后者是16bit位圖,一個(gè)像素用兩個(gè)字節(jié)來(lái)表示,這個(gè)BitBlt執(zhí)行過(guò)程中,就需要轉(zhuǎn)換了,因此耗時(shí)。而實(shí)際上位圖的差別可能比這個(gè)還要復(fù)雜些,如果再討論設(shè)備無(wú)關(guān)位圖,那就說(shuō)不完了……

總而言之,為了提高效率,我們要想方設(shè)法把加載進(jìn)來(lái)的位圖轉(zhuǎn)變?yōu)樵O(shè)備兼容位圖,繪制的時(shí)候直接BitBlt這些設(shè)備兼容位圖,來(lái)實(shí)現(xiàn)位圖的高效繪制。

前面討論的主要是BitBlt,那對(duì)于別的幾個(gè)Blt函數(shù)呢?我都嘗試過(guò)了,除了AlphaBlend之外,兼容位圖到設(shè)備的Blt速度上都有顯著的提高,而AlphaBlend則無(wú)法正常工作,因?yàn)榧嫒菸粓D不帶Alpha通道,而AlphaBlend貌似需要32bit的ARGB格式的位圖方可正常工作,這個(gè)問(wèn)題我思考了好久都無(wú)解,如果哪位讀者對(duì)提高AlphaBlend的工作效率有心得,不妨跟我聯(lián)系下,我正急需這方面的技術(shù)資料。

因此,我給出這樣的結(jié)論,階段性結(jié)論:從文件(或資源)加載位圖后,把位圖轉(zhuǎn)為設(shè)備兼容位圖,這樣使得BitBlt在執(zhí)行SRCCOPY的時(shí)候直接使用內(nèi)存拷貝,速度很快,即便需要拉伸壓縮或者摳色等運(yùn)算,使用兼容位圖的速度也是相當(dāng)不錯(cuò)的,而使用AlphaBlend的時(shí)候,如果需要較高的效率,就應(yīng)從設(shè)計(jì)上避免繪制大幅位圖,改用小幅位圖,在不必要對(duì)每一幀都執(zhí)行Alpha混合的時(shí)候,就避免執(zhí)行,以免影響畫面的流暢性。
posted on 2010-06-20 20:04 Jiang Guogang 閱讀(3324) 評(píng)論(6)  編輯 收藏 引用 所屬分類: Windows Embedded Programming

評(píng)論

# re: Windows Mobile的高效貼圖 2010-06-20 22:52 Benjamin
這應(yīng)該就是雙緩沖  回復(fù)  更多評(píng)論
  

# re: Windows Mobile的高效貼圖 2010-06-21 13:01 Matthew
唉,沒(méi)有弄過(guò)  回復(fù)  更多評(píng)論
  

# re: Windows Mobile的高效貼圖 2010-06-22 09:03 凡客誠(chéng)品
如果需要較高的效率,就應(yīng)從設(shè)計(jì)上避免繪制大幅位圖,改用小幅位圖,在不必要對(duì)每一幀都執(zhí)行Alpha混合的時(shí)候,就避免執(zhí)行,以免影響畫面的流暢性  回復(fù)  更多評(píng)論
  

# re: Windows Mobile的高效貼圖 2010-06-22 17:23 Condor
這不就是雙緩沖嗎?
和windows上的一樣。  回復(fù)  更多評(píng)論
  

# re: Windows Mobile的高效貼圖 2010-06-22 17:35 f.f.
作者很能折騰,受教受教!!
文章的本意跟雙緩沖沒(méi)關(guān)系,只是從bitblt的性能差異猜想其實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
  

# re: Windows Mobile的高效貼圖 2011-03-17 20:37 Jiang Guogang
事隔那么久,今天又有所突破,在一篇文章里看到的,可能我之前的理解稍微有些出入,但結(jié)論是一樣的,那就是需要用CreateCompatibleBitmap創(chuàng)建出來(lái)的位圖來(lái)參與BitBlt等操作,速度最佳。

位圖有許多不同的種類,可以通過(guò)呼叫函式CreateDIBSection、CreateBitmap或CreateCompatibleBitmap來(lái)建立位圖,從而得到相對(duì)應(yīng)的位圖句柄。前兩個(gè)函式是分配在系統(tǒng)內(nèi)存中的。而CreateCompatibleBitmap根據(jù)裝置驅(qū)動(dòng)程序和硬設(shè)備的不同由裝置驅(qū)動(dòng)程序分配內(nèi)存,同時(shí)裝置驅(qū)動(dòng)程序可以分配影像內(nèi)存。影像內(nèi)存是一個(gè)很有價(jià)值的資源,這是因?yàn)樵谒械男^(qū)域操作速度會(huì)大大增加。如果十分在意速度并希望能夠快速地對(duì)位圖進(jìn)行操作,那么呼叫函式CreateCompatibleBitmap或許是最佳的選擇。
在某些系統(tǒng)平臺(tái)上,只有當(dāng)信息源和目標(biāo)文件同時(shí)存在于影像內(nèi)存中時(shí)硬件加速卡才能起作用。因此將信息源和目標(biāo)文件同時(shí)放在影像內(nèi)存中會(huì)大大提高系統(tǒng)的影像性能。  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲美女黄色片| 久久精品视频亚洲| 一本久久a久久免费精品不卡| 噜噜噜噜噜久久久久久91| 亚洲第一页自拍| 亚洲第一免费播放区| 美女黄色成人网| 9国产精品视频| 亚洲系列中文字幕| 国产一区二区三区丝袜| 免费短视频成人日韩| 免费亚洲电影在线观看| 一区二区三区四区五区视频 | 国产精品国产福利国产秒拍| 欧美一区二区三区男人的天堂| 久久国产精品久久久| 最新国产乱人伦偷精品免费网站| 日韩写真视频在线观看| 国产欧美日韩亚洲一区二区三区| 乱人伦精品视频在线观看| 夜夜嗨av一区二区三区| 亚洲美女中文字幕| 国产亚洲精品久久久久久| 欧美不卡福利| 欧美性猛片xxxx免费看久爱| 久久久久国产成人精品亚洲午夜| 免费精品99久久国产综合精品| 亚洲一区二区三区视频播放| 欧美在线免费播放| 99国产精品私拍| 亚洲在线中文字幕| 亚洲国产cao| 亚洲一区二区毛片| 亚洲高清视频在线观看| 亚洲视频专区在线| 亚洲国产美女久久久久| 亚洲网友自拍| 在线看国产日韩| 亚洲私人影院在线观看| 亚洲第一毛片| 亚洲专区免费| 亚洲美女电影在线| 欧美一级淫片播放口| aⅴ色国产欧美| 久久久久久久97| 亚洲欧美日韩国产中文在线| 免费不卡在线视频| 久久国产精品免费一区| 欧美日韩国产123区| 久热精品在线视频| 国产精品久久网站| 亚洲国产三级在线| 黑人巨大精品欧美一区二区| 一区二区欧美日韩| 亚洲人成网站色ww在线| 欧美在线视频一区| 亚洲欧美日韩电影| 欧美激情1区2区3区| 久久婷婷蜜乳一本欲蜜臀| 国产精品久久久久久久久久妞妞| 欧美日韩精品免费| 欧美在线二区| 欧美日韩精品二区| 欧美波霸影院| 黄色日韩精品| 99精品热视频| 亚洲美女毛片| 久久综合福利| 久久嫩草精品久久久精品一| 国产精品男gay被猛男狂揉视频| 亚洲国产日韩欧美一区二区三区| 在线精品一区| 久久精品中文字幕一区| 久久成人18免费观看| 欧美视频手机在线| 亚洲精品一区二区三| 亚洲黄色影片| 久久夜色精品一区| 久久日韩精品| 国产一区二区三区在线观看网站 | 欧美xx视频| 黄色工厂这里只有精品| 性视频1819p久久| 午夜日韩在线观看| 欧美天天在线| 99re6热只有精品免费观看| 亚洲日本精品国产第一区| 久久久99爱| 久久爱www久久做| 国产欧美 在线欧美| 亚洲一区二区三区精品动漫| 一区二区三区久久网| 欧美精品日韩一本| 亚洲人精品午夜| 亚洲伦理一区| 欧美精品日韩www.p站| 亚洲国产日韩一区| 一本综合久久| 欧美日韩亚洲一区二区三区| 亚洲精品一区二区在线观看| 欧美激情综合五月色丁香| 一区二区三区免费看| 欧美精品国产一区| 亚洲精品一区二区三区四区高清| 亚洲精品在线观看免费| 欧美激情精品久久久六区热门| 亚洲国产一区二区三区高清| 日韩视频中午一区| 欧美日韩精品免费观看视频| 99精品热视频只有精品10| 亚洲女性裸体视频| 国产精品视频第一区| 亚洲欧美制服中文字幕| 久久精品综合一区| 禁断一区二区三区在线| 久久久久一区二区| 欧美激情精品久久久久久变态| 亚洲日韩中文字幕在线播放| 欧美区国产区| 中文国产亚洲喷潮| 久久国产精品72免费观看| 黄色国产精品一区二区三区| 麻豆久久婷婷| 亚洲精品在线电影| 亚洲免费一在线| 国产一区二区av| 久久艳片www.17c.com| 亚洲国产一区二区三区a毛片| 一本久久青青| 国产精品午夜视频| 欧美在线影院| 欧美激情在线播放| 一本色道久久88亚洲综合88 | 亚洲黄色影院| 亚洲一区亚洲| 国产永久精品大片wwwapp| 久久综合色天天久久综合图片| 亚洲国产另类精品专区| 亚洲视频精品在线| 国产无一区二区| 欧美ed2k| 亚洲图片你懂的| 久久综合久久综合这里只有精品| 亚洲人体影院| 国产精品色在线| 久久一区免费| 亚洲性图久久| 久久天堂精品| 99国产一区| 久久手机免费观看| 亚洲免费av片| 国产欧美另类| 男人天堂欧美日韩| 亚洲一二三区精品| 欧美h视频在线| 亚洲性视频网址| 在线日韩av片| 国产精品美女久久久久久免费| 久久精品一本| 日韩视频在线永久播放| 久久精品人人做人人爽| 日韩视频精品| 国产在线国偷精品产拍免费yy| 欧美精品观看| 久久精品视频在线免费观看| 日韩午夜黄色| 免费高清在线一区| 亚洲深夜影院| 一区在线影院| 国产精品高潮视频| 老牛影视一区二区三区| 亚洲一区二区三区激情| 亚洲国产精品久久人人爱蜜臀| 欧美在线一区二区| 亚洲免费观看高清完整版在线观看熊 | 亚洲综合精品自拍| 欧美激情在线播放| 久久久久91| 亚洲一区二区三区高清| 亚洲国产精品久久久久久女王| 国产精品视频第一区| 久久婷婷激情| 午夜视频久久久| 99国产精品99久久久久久| 免费欧美在线视频| 欧美在线免费观看视频| 中文精品视频一区二区在线观看| 在线国产精品一区| 国产欧美日韩免费看aⅴ视频| 欧美日韩免费高清一区色橹橹| 开元免费观看欧美电视剧网站| 亚洲在线免费| 国产欧美综合在线| 欧美乱在线观看| 蜜臀av在线播放一区二区三区| 亚洲一级在线观看| 91久久精品国产91久久性色| 美女性感视频久久久| 欧美综合二区| 午夜精品在线观看|