Re: [問題] CIFilter/QTSession的nsthread穩定性問題
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
討論串 (同標題文章)
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章