《電子技術應用》
您所在的位置:首頁 > 顯示光電 > 設計應用 > 深入理解iPhone屏幕雙緩沖技術
深入理解iPhone屏幕雙緩沖技術
摘要: 筆者在最近項目的開發中需要使用到“屏幕雙緩沖”技術,“屏幕雙緩沖”是GUI客戶端中最經常使用的一種技術,但是這種技術在iPhone平臺似乎很少被人使用到,網上的資料基本很難找到,這點讓筆者很是不解.
Abstract:
Key words :

  筆者在最近項目的開發中需要使用到“屏幕雙緩沖技術,“屏幕雙緩沖”是GUI客戶端中最經常使用的一種技術,但是這種技術在iPhone平臺似乎很少被人使用到,網上的資料基本很難找到,這點讓筆者很是不解。

  相信大多數人都知道,所謂“屏幕雙緩沖”是指在內存中建立一個“圖形設備上下文的緩存”,所有的繪圖操作都在這個“圖形上下文緩存”上進行,在需要顯示這個“圖形上下文”的時候,再次把它更新到屏幕設備上。

  iPhone平臺提供了這樣一個API:

  CGContextRef CGBitmapContextCreate (

  void *data,

  size_t width,

  size_t height,

  size_t bitsPerComponent,

  size_t bytesPerRow,

  CGColorSpaceRef colorspace,

  CGBitmapInfo bitmapInfo

  );

  這個API各個參數的意義如下:

  Ø 參數data指向繪圖操作被渲染的內存區域,這個內存區域大小應該為(bytesPerRow*height)個字節。如果對繪制操作被渲染的內存區域并無特別的要求,那么可以傳遞NULL給參數date。

  Ø 參數width代表被渲染內存區域的寬度。

  Ø 參數height代表被渲染內存區域的高度。

  Ø 參數bitsPerComponent被渲染內存區域中組件在屏幕每個像素點上需要使用的bits位,舉例來說,如果使用32-bit像素和RGB顏色格式,那么RGBA顏色格式中每個組件在屏幕每個像素點上需要使用的bits位就為32/4=8。

  Ø 參數bytesPerRow代表被渲染內存區域中每行所使用的bytes位數。

  Ø 參數colorspace用于被渲染內存區域的“位圖上下文”。

  Ø 參數bitmapInfo指定被渲染內存區域的“視圖”是否包含一個alpha(透視)通道以及每個像素相應的位置,除此之外還可以指定組件式是浮點值還是整數值。

  從接口定義中可以看出,當調用這個函數時,系統會創建一個“視圖繪制環境”,這個“視圖繪制環境”就是讀者定義的一個“視圖上下文”。當讀者在這個“視圖上下文”進行繪制操作時,系統會在定義的渲染內存區域中把繪制操作渲染成位圖數據。“視圖上下文”的像素格式由三個參數來定義,也就是每個組件占用的bits位數、colorspace以及alpha(透視),而alpha值指定了每個像素的不透明度。

  根據上面講述的知識點,筆者定義了被渲染內存區域如下:

  imageData = malloc((iFrame.size.width)*(iFrame.size.height)*32);

  筆者這里在屏幕每個像素上使用了32-bits來表示RGBA顏色格式,那么參數bitsPerComponent就為32/4=8,各個參數的定義如下:

  iDevice = CGBitmapContextCreate(imageData,iFrame.size.width,iFrame.size.height,8,32*(iFrame.size.width),iColorSpace,kCGImageAlphaPremultipliedLast);

  這里筆者獲取iColorSpace的方法如下:

  iColorSpace = CGColorSpaceCreateDeviceRGB();

  CGColorSpaceCreateDeviceRGB()方法可以獲取設備無關的RGB顏色空間,這個顏色空間需要調用CGColorSpaceRelease()進行釋放。

  在創建成功被渲染的內存區域的“視圖上下文”iDevice后,那么讀者就可以在這個被渲染的內存區域的“位圖上下文”上進行繪制操作了,正如上面所講的,所有的繪制操作將在被渲染的內存區域中被渲染成位圖數據,繪制操作如下:

  // 繪制圖片

  CGContextDrawImage(iDevice, CGRectMake(0, 0, iFrame.size.width, iFrame.size.height), aImage);

  // 繪制半透明矩形

  CGRect rt;

  rt.origin.x = 100;

  rt.origin.y = 20;

  rt.size.width = 200;

  rt.size.height = 200;

  CGContextSaveGState(iDevice);

  CGContextSetRGBFillColor(iDevice, 1.0, 1.0, 1.0, 0.5);

  CGContextFillRect(iDevice, rt);

  CGContextRestoreGState(iDevice);

  CGContextStrokePath(iDevice);

  // 繪制直線

  CGContextSetRGBStrokeColor(iDevice, 1.0, 0.0, 0.0, 1.0);

  CGPoint pt0, pt1;

  CGPoint points[2];

  pt0.x = 10;

  pt0.y = 250;

  pt1.x = 310;

  pt1.y = 250;

  points[0] = pt0;

  points[1] = pt1;

  CGContextAddLines(iDevice, points, 2);

  CGContextStrokePath(iDevice);

  可見,在被渲染的內存區域的“位圖上下文”中可以進行圖片、矩形、直線等各種繪制操作,這些操作被渲染成位圖數據,讀者可以通過如下方法獲取到這個被渲染的“位圖”:

  -(void)drawRect:(CGRect)rect {

  // Drawing code

  UIGraphicsGetCurrentContext();

  UIImage* iImage = [UIImage imageNamed:@“merry.png”];

  [iOffScreenBitmap DrawImage:iImage.CGImage];

  UIImage* iImage_1 = [UIImage imageWithCGImage:[iOffScreenBitmap Gc]];

  [iImage_1 drawInRect:CGRectMake(0, 0, 120, 160)];

  }

  上面的代碼中,通過iOffScreenBitmap的DrawImage:CGImageRef方法把圖片merry.png繪制到屏幕雙緩沖中,并接著進行了矩形、直線繪制,然后通過CGBitmapContextCreateImage:CGConotextRef方法獲取“視圖上下文”的“視圖快照(snapshot)”image_1,最后把這個“視圖快照”更新到屏幕上,從而實現屏幕雙緩沖的技術,效果如下:

  

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美日韩一区二| 国产日韩三区| 久久久91精品国产一区二区精品| aa国产精品| 一区二区三区你懂的| 一本到高清视频免费精品| 亚洲日本在线观看| 亚洲精品久久久久久久久久久 | 亚洲伊人第一页| 亚洲色诱最新| 亚洲欧美日韩一区二区三区在线观看 | 亚洲一区视频在线观看视频| 亚洲小说欧美另类社区| 亚洲欧美日韩国产中文 | 欧美偷拍一区二区| 国产精品v欧美精品v日韩| 国产精品激情av在线播放| 国产精品男人爽免费视频1| 国产精品色婷婷| 国产偷国产偷亚洲高清97cao| 国产主播精品在线| 亚洲国产成人porn| aa亚洲婷婷| 亚洲午夜女主播在线直播| 亚洲免费在线视频| 欧美一区二区三区日韩| 最新中文字幕亚洲| 一区二区三区视频观看| 午夜久久久久久| 久久九九热re6这里有精品| 麻豆视频一区二区| 欧美日产在线观看| 国产精品人成在线观看免费| 国产一区二区三区四区hd| 亚洲国产欧美国产综合一区 | 亚洲国产视频一区| 在线视频你懂得一区二区三区| 午夜精品久久久久久久99热浪潮| 欧美资源在线观看| 欧美成在线观看| 国产精品九色蝌蚪自拍| 国产在线观看精品一区二区三区| 亚洲国产清纯| 亚洲一区不卡| 亚洲欧洲综合另类| 亚洲综合精品四区| 久久伊人精品天天| 欧美日韩一区在线播放| 国产有码在线一区二区视频| 亚洲精品国产欧美| 亚洲欧美资源在线| 亚洲毛片在线观看| 欧美伊人影院| 欧美精品久久久久久久| 国产日韩精品在线播放| 最新国产乱人伦偷精品免费网站| 亚洲欧美日韩精品| 亚洲狼人综合| 久久本道综合色狠狠五月| 欧美区一区二| 国产视频欧美视频| 亚洲日本电影| 欧美在线一级视频| 亚洲一区二区在| 免费在线欧美黄色| 国产欧美精品一区二区色综合| 亚洲欧洲日本国产| 小处雏高清一区二区三区| 一本到高清视频免费精品| 久久女同精品一区二区| 国产精品久久久久久久7电影 | 亚洲免费高清视频| 欧美一区午夜视频在线观看| 亚洲四色影视在线观看| 免费欧美电影| 国产午夜精品全部视频在线播放| 日韩视频欧美视频| 亚洲欧洲精品一区二区三区不卡 | 亚洲靠逼com| 久久久久久亚洲精品不卡4k岛国| 欧美视频在线一区| 91久久国产精品91久久性色| 性欧美大战久久久久久久免费观看| 亚洲一区二区三区四区五区黄 | 欧美日韩成人一区二区| 国产三区精品| 制服丝袜激情欧洲亚洲| 亚洲精品网址在线观看| 久久久五月婷婷| 国产欧美精品一区二区三区介绍| 一区二区三区|亚洲午夜| 99re视频这里只有精品| 欧美77777| 激情综合久久| 久久国产精品久久久久久久久久| 亚洲欧美怡红院| 国产精品扒开腿爽爽爽视频| 日韩午夜在线观看视频| 亚洲精品一区二区在线观看| 老妇喷水一区二区三区| 国外成人在线视频| 欧美一区二区三区的| 久久精品导航| 国产亚洲精品bv在线观看| 午夜日韩在线| 欧美一区二区三区视频| 国产精品一二一区| 亚洲免费中文| 欧美在线黄色| 国产欧美日韩精品一区| 亚洲欧美成人综合| 欧美在线观看一区二区三区| 国产精品羞羞答答| 午夜影院日韩| 久久激情视频| 国内免费精品永久在线视频| 久久av一区二区三区| 久久久久久穴| 一区二区三区在线免费播放| 亚洲国产日韩在线一区模特| 男人的天堂亚洲| 亚洲人午夜精品| 一区二区三区精品| 欧美亚洲成人免费| 亚洲已满18点击进入久久| 欧美一区成人| 国内精品久久久久伊人av| 亚洲国产美女| 欧美久久久久久| 日韩一区二区久久| 亚洲中午字幕| 国产欧美一区二区三区另类精品| 欧美一区二区三区男人的天堂| 久久久久久有精品国产| 在线日韩中文| 亚洲精品乱码久久久久久久久| 欧美日韩国产一区精品一区| 亚洲天堂久久| 久久精品一区| 亚洲国产精品第一区二区| 一区二区三区国产在线| 国产精品美女视频网站| 午夜视频在线观看一区二区三区 | 欧美激情久久久久| 99热精品在线| 欧美一区二区视频网站| 国产一区二区在线观看免费| 91久久精品国产91久久性色| 欧美日韩成人在线| 亚洲一区在线免费| 久久夜色精品国产| 亚洲人屁股眼子交8| 午夜精品在线看| 精品1区2区3区4区| 在线一区视频| 国产日韩欧美在线播放| 亚洲精品系列| 国产精品一区二区三区免费观看| 亚洲国产精品视频一区| 欧美性大战久久久久久久蜜臀| 午夜精品视频在线观看| 欧美激情视频网站| 亚洲欧美影音先锋| 欧美国产精品劲爆| 亚洲综合色视频| 欧美成在线视频| 亚洲欧美国产视频| 欧美成人第一页| 亚洲欧美国产另类| 欧美国产精品久久| 午夜精品视频在线观看| 欧美精品久久久久久久久老牛影院 | 亚洲一区二区三区久久| 麻豆成人在线| 亚洲女人小视频在线观看| 欧美大尺度在线观看| 亚洲综合视频一区| 欧美黄免费看| 久久9热精品视频| 欧美视频导航| 亚洲日本中文字幕| 国产三级欧美三级日产三级99| 99视频精品全国免费| 好吊色欧美一区二区三区视频| 中国女人久久久| 伊人成人网在线看| 香蕉久久夜色精品国产| 亚洲精品四区| 免费高清在线一区| 午夜综合激情| 国产精品成人免费| 日韩亚洲一区二区| 一区二区视频免费在线观看| 午夜亚洲精品| 99riav国产精品| 欧美激情按摩在线| 亚洲国产精品t66y| 国产午夜精品视频免费不卡69堂| 亚洲主播在线| 日韩香蕉视频|