CIContext drawImage 速度很慢

2021-07-22 13:40:10 字數 3968 閱讀 4703

cicontext drawimage 速度很慢

->uiimage->cgimageref->ciimage->cifilter處理字幕, 濾鏡, 轉場->新的ciimage->通過cicontext將ciimage顯示到glkview上

->uiimage->cgimageref->ciimage->cifilter處理字幕, 濾鏡, 轉場->新的ciimage->通過cicontext將ciimage轉換成cvpixelbuffer->寫入檔案

ciimage

資料**cgimageref, 用cicontext繪製的時候比較慢

_ciimage = [ciimage imagewithcgimage:_image.cgimage];

除錯的時候 po _ciimage 如下:

0x14c9e0bd0 extent [0

01280

960]>

affine [1

00 -1

0960] extent=[0

01280

960] opaque

colormatch "srgb iec61966-2.1"-to-workingspace extent=[0

01280

960] opaque

cgimageref 0x147fd89c0 rgbx8 1280x960 alpha_one extent=[0

01280

960] opaque

資料**cvpixelbufferref, 用cicontext繪製的時候比較快

_ciimage = [ciimage imagewithcvpixelbuffer:pixelbuffer];

除錯時候 po _ciimage 如下:

0x1291dd5a0 extent [0

01920

1080]>

colorkernel filterkernel(image,scaling=[1

1080]) extent=[0

01920

1080]

affine [2.8571400

2.85714

00] extent=[0

01920

1080] opaque

affine [1

00 -1

0378] extent=[0

0672

378] opaque

colormatch "composite ntsc"-to-workingspace extent=[0

0672

378] opaque

iosu***ce 0x1258002a8 ycc420v 709 alpha_one extent=[0

0672

378] opaque

接下來這段純屬個人推斷, 沒有驗證過

*****==

ciimage內部的實現應該有分cpu和gpu, 如果同樣是cpu到cpu,

uiimage->cgimageref->ciimage經過處理後->ciimage->uiimage, 假設處理也是在cpu上的話, 這樣的處理應該是比較快的,因為沒有資料搬移.

或者gpu到gpu的處理,

cvpixelbufferref->ciimage->經過cifilter處理->ciimage->通過cicontext的drawimage顯示或者renderimage:tocvpixelbuffer生成新的cvpixelbufferref匯出

這樣速度應該會很快, 因為不需要資料搬移, 資料的處理也都在gpu層面上

但是如果過程是這樣的uiimage->ciimage->經過cifilter處理->ciimage->cicontext顯示在gpu上, 這樣的速度就會變慢.

因為經歷了cpu->gpu的資料搬移

*****==

解決思路:

既然是因為ciimage建立的時候如果從uiimage過來就會慢, 從cvpixelbufferref來的就不會慢, 是不是可以對的處理的時候, 建立ciimage可以類似從cvpixelbufferref中來

簡單的說, 就是可不可以用gpu的方式來建立

解決辦法:

將uiimage轉換成cvpixelbufferref, 然後ciimage在從cvpixelbufferref中建立

- (cvpixelbufferref) pixelbufferfromcgimage: (cgimageref) image ;

cvpixelbufferref pxbuffer = null;

cvreturn status = cvpixelbuffercreate(kcfallocatordefault, cgimagegetwidth(image),

cgimagegetheight(image), kcvpixelformattype_32argb, (__bridge cfdictionaryref) options,

&pxbuffer);

if (status!=kcvreturnsuccess)

nsparameterassert(status == kcvreturnsuccess && pxbuffer != null);

cvpixelbufferlockbaseaddress(pxbuffer, 0);

void *pxdata = cvpixelbuffergetbaseaddress(pxbuffer);

cgcolorspaceref rgbcolorspace = cgcolorspacecreatedevicergb();

cgcontextref context = cgbitmapcontextcreate(pxdata, cgimagegetwidth(image),

cgimagegetheight(image), 8, 4*cgimagegetwidth(image), rgbcolorspace,

kcgimagealphanoneskipfirst);

nsparameterassert(context);

// cgcontextconcatctm(context, cgaffinetransformmakerotation(0));

// cgaffinetransform flipvertical = cgaffinetransformmake( 1, 0, 0, -1, 0, cgimagegetheight(image) );

// cgcontextconcatctm(context, flipvertical);

// cgaffinetransform fliphorizontal = cgaffinetransformmake( -1.0, 0.0, 0.0, 1.0, cgimagegetwidth(image), 0.0 );

// cgcontextconcatctm(context, fliphorizontal);

cgcontextdrawimage(context, cgrectmake(0, 0, cgimagegetwidth(image),

cgimagegetheight(image)), image);

cgcolorspacerelease(rgbcolorspace);

cgcontextrelease(context);

cvpixelbufferunlockbaseaddress(pxbuffer, 0);

return pxbuffer;

}

然後

cvpixelbufferref pixelbuffer =[self pixelbufferfromcgimage:_image.cgimage];

_ciimage = [ciimage imagewithcvpixelbuffer:pixelbuffer];

cvpixelbufferrelease(pixelbuffer);

HTML基礎(適合入門,很詳細,很詳細,很詳細)

概念 是最基礎的網頁開發語言 標記語言 快速入門 title red hello world green hello world 標籤學習 檔案標籤 構成html最基本的標籤 文字標籤 和文字有關的標籤 p 段落標籤 br 換行標籤 hr 展示一條水平線 b 字型加粗 i 字型斜體 font 字型標...

理想很豐滿 現實很骨感

時光飛逝 枯燥無味的開場白 畢業後的日子 上班 賺錢,其實也就這點追求了 閒暇的時候,想著大學的日子,大學時候的習慣,現在看來我那時 似乎很偉大 那時我知道二十一天養成乙個好習慣,跟著公尺老師學習,其實那個時候 進步真是飛快,就算現在工作了,我也感謝那段時間帶給我的財富 閒暇的時候和父母聊天,會這樣...

CSDN SD 2 0,很牛很技術

大概是 門時期開始流行的吧!如果要形容乙個事情很特別,總是喜歡用很x很xx的這種模式。參加完今年sd 2.0大會之後哦,讓我也有想形容一下這種感覺的衝動,於是寫下了這個 很牛很技術 的說法。先說說參會。這次舉辦sd大會的日子正是寒流之中,因為無論是從天氣看還是從經濟環境來看,只要參加了這次大會的人都...