Re: [問題] CIFilter/QTSession的nsthread穩定性問題

看板MacDev作者 (派斯麵)時間14年前 (2011/08/10 13:57), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/4 (看更多)
z大: 謝謝你上次的範例 不過我測試了你的程式後 發現有幾個問題 我想,你可能錯以為我是要抓isight畫面進行靜態修改 其實我是要進行即時濾鏡套用到isght畫面並顯示在螢幕上 在此情況下 您使用setContents方法重繪畫面的方式太吃資源 istat顯示80%以上,i7, 2.6G 原本方法是約16% 然後在interface delay上,可能是因為cpu吃太多 就算偷懶只重繪1/3,CPU依然需要30%以上 而且interface delay問題沒有改善(這點蠻神奇的..) 和VideoPreviewOutput方式相比 使用captureview的deletage方法所需資源較少 - (CIImage *)view:(QTCaptureView *)view willDisplayImage:(CIImage *)image { 15% cpu usage, i7, 2.6G 另外,我有查一下QTCaptureVideoPreviewOutput Class Reference http://goo.gl/rhiCt 裡面是說當captureview無法達成功能才考慮使用previewVideoOutput 因此我目前繼續回頭使用willDisplayImage處理影像 雖然還是卡在使用執行緒就會掛掉的問題中.. 使用QTCaptureView Delegate的程式檔案在此 http://dl.dropbox.com/u/15665142/QTTest_piceman.zip ※ 引述《zonble (zonble)》之銘言: : 你這樣寫最大的問題就在於,當 QTCaptureView 每次呼叫到 view: : willDisplayImage: 這個 delegate method 的時候,在 CIprocessor : 裡頭放在 thread 裡頭的工作,不見得已經完成了,而因為再度被 : 呼叫到,所以就再度開了一個 thread 出來。於是,明明就只有一個 : video stream,卻變成可能同時有好幾個 thread 在處理套用 filter : 的工作,一方面這樣造成不必要的系統負擔,另一方面,同時好幾個 : thread 都要寫入 self.tmpImage,這樣也會出問題。至少在產生一個 : thread 之前,應該先把前一個 thread cancel 掉,以及 self.impImage : 也應該要 lock 起來。 : 另外,用 QTCaptureView 的 delegate 來取得 CIImage,感覺也怪怪 : 的。 感覺另外產生一個 QTCaptureVideoPreviewOutput 會是比較好的作法。 : ※ 引述《Piceman (派斯麵)》之銘言: : : @property (nonatomic, retain) CIprocessor* CIpr; : : - (CIImage *)view:(QTCaptureView *)view willDisplayImage:(CIImage *)image { : : CIImage* ret= [CIpr returnCIImage:image]; : : if (!ret) { : : ret=image; : : } : : return ret; : : } : : @implement CIprocessor { : : -(CIImage*)returnCIImage:(CIImage*)imgInput{ : : //將工作丟到thread,會造成以下錯誤 : : //QTCALayerRendererPendingQWorkLoop EXEC_BAD_ACCESS : : [NSThread detachNewThreadSelector:@selector(threadImage) : : toTarget:self withObject:imgInput]; : : //不使用thread, 沒錯誤問題,不過在其他電腦上會有鍵盤反應遲緩 : : //視窗lag等問題,雖然cpu loading不高.. : : //[self threadImage:imgInput]; : : return self.tmpImage; : : } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.30.74.150
文章代碼(AID): #1EGXsu6R (MacDev)
文章代碼(AID): #1EGXsu6R (MacDev)