作者Piceman (派斯面)
看板MacDev
标题[问题] CIFilter/QTSession的nsthread稳定性问题
时间Sat Aug 6 15:14:54 2011
我最近想写一个即时修改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