查看GLCameraRipple示例時,AVCaptureVideoDataOutput的設置方式是,每當從iphone攝像頭獲得新幀時調用回調(captureOutput)。爲什麼AVCaptureVideoDataOutput回調依賴於OpenGL繪製幀率?
但是,在「drawInRect」函數(用於OpenGL繪圖)的開始處放置一個「sleep(1)」,該回調函數每秒只調用一次,而不是每秒調用30次。
誰能告訴我爲什麼iPhone相機的幀率與OpenGL繪製調用的幀率相關聯?
更新:重現步驟
- 從這裏下載GLCameraRipple樣本:http://developer.apple.com/library/ios/#samplecode/GLCameraRipple/Introduction/Intro.html
- 在RippleViewController.m => captureOutput,添加
NSLog(@"Got Frame");
。運行它會產生大量的「Got Frame」消息(每秒大約30次) - 在RippleViewController.m => drawInRect中,在函數的最開始處添加一個
sleep(1);
。現在每秒只出現一條消息。
非常感謝您的回答!你怎麼會知道這事? (特別是相機回調在主線程中運行)。這是記錄在某處嗎? –
@JanRüegg - 在主線程中調用它們是正確的,但這是因爲Apple使用這一行明確地將它放在主隊列上:'[dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];'。如果你願意,它可以放在後臺隊列中,但是如果你的渲染跟不上傳入的視頻幀速率,那麼你必須擔心在那個隊列中建立塊。 Sunama在說明OpenGL渲染必須在主線程上完成時是不正確的,因爲只要多線程不訪問上下文,它可以在後臺完成。 –
嗯......我測試了它,當我使用這一行時,我遇到同樣的問題:'[dataOutput setSampleBufferDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)];'不應該在另一個線程中運行全局隊列嗎? –