[問題] CIFilter/QTSession的nsthread穩定性問題
我最近想寫一個即時修改isight所抓取的影像
並套用CIFilter套用特效的小程式
由於在iMac 3.0G Core 2Duo(OSX 10.6.8, 4G ram)上面有效能問題
用起來會頓頓的
所以打算把它改成多線程版
不過使用NSThread detachNewThread方法後
發現有穩定性問題
不定時會出現QTCALayerRendererPendingQWorkLoop的
exex_bad_access錯誤
想請問的是
1. 使用multi thread執行CIFilter是否可行?
可行的話,有什麼特殊設定或問題要注意嘛?
2. 若只是想抓QTCapterInput並套用濾鏡
(我不會影像處理演算法,所以只能使用現有的濾鏡功能)
然後顯示到螢幕上(不儲存)
有沒有比較節省資源的作法或best practice可以參考?
3. 我的電腦是2010 MBP, 2.6G i7, 8G ram, lion
朋友電腦是imac, 3.06G, 4G ram, 10.8.6
同樣的程式在他電腦上會有明顯的反應遲緩問題
但我的電腦上完全沒有問題
以下是大致作法
MainClass:
/* 使用QTCaptureDevice抓取裝置
設定到QTCaputureDeviceInput
並連接到QTSession中
最後顯示到QTCaptureview
其中在viewwilldisplayimage使用外部影像處理物件 */
@property (nonatomic, retain) CIprocessor* CIpr;
- (CIImage *)view:(QTCaptureView *)view willDisplayImage:(CIImage *)image {
CIImage* ret= [CIpr returnCIImage:image];
if (!ret) {
ret=image;
}
return ret;
}
影像處理物件
/* 由於detachNewThread不能接受回傳
所以我建立了另一個類別 ImgProc
使用屬性方式回傳CIImage */
@interface CIprocessor : NSObject{
CIImage* tmpImage;
}
@property (nonatomic, readwrite, retain) CIImage* tmpInput;
@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;
}
-(void)threadImage:(CIImage*)inputImage{
CIImage* imgThread;
imgThread=[self mainProcess:inputImage];
self.tmpImage=imgThread;
}
-(CIImage*)mainProcess:(CIImage*)inputImage{
//套用Filter處理影像並回傳
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.24.52.233
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章