作者Piceman (派斯面)
看板MacDev
标题Re: [问题] CIFilter/QTSession的nsthread稳定性问题
时间Wed Aug 10 13:57:10 2011
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