看板 MacDev 關於我們 聯絡資訊
你這樣寫最大的問題就在於,當 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; : } -- zonble.net cocoa.zonble.net -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.42.186.156
Piceman:感謝Z大解惑,我會嘗試從那幾塊地方進行突破,謝謝 08/07 15:06
zonble:http://cl.ly/3K37040o2N0Z272A0R1g 08/07 22:56
zonble:簡單寫了一下 08/07 22:57