2013-03-21 74 views
1

在iOS6中,我使用OpenGL在AVFoundation視頻幀上進行一些渲染。我見過很多使用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress的示例代碼,但是我不清楚何時執行鎖定和解鎖或者我爲什麼要這麼做。我應該在CPU修改內存時鎖定地址嗎?還是應該在GPU讀取它時鎖定它?我應該何時解鎖?爲什麼我甚至想要解鎖?我見過this Stack Overflow answer,但它不能完全回答我的問題。什麼時候應該調用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress?

+0

那看一個類似的問題,我的回答 http://stackoverflow.com/questions/6468535/cvpixelbufferlockbaseaddress-why-capture-still-image-using-avfoundation – Andrea 2013-03-21 21:17:50

+0

我掛你的問題在我的。就像我說的,它並不完全回答我的問題。但也許你有一些洞察力。我應該什麼時候鎖?我應該何時解鎖?爲什麼我應該解鎖?鎖具防止什麼? – GingerBreadMane 2013-03-21 22:07:54

回答

3

你應該鎖定每次你需要使用它,並解鎖完成後,你不再需要它。這可以防止緩衝區被覆蓋,從而使其處於不一致的狀態。

一位固件專家曾向我解釋過這一點:一般來說,在處理視頻輸出時,應該注意有很多間接引用指針,就像是說:「嘿,這是我的,我正在使用它,指向其他地方的下一幀「。

我無法根據您的應用程序判斷何時不再需要緩衝區,但這是您應該弄清楚的。如果您已將緩衝區數據複製到其他位置(例如創建新對象),則意味着您可以解鎖它。

希望這會有所幫助。

2

如果你想訪問CPU上的像素緩衝區,如果GPU不這麼做,你應該只調用這個函數!,Apple doc很清楚。

下面是來自蘋果官方的文檔的信息:

https://developer.apple.com/library/prerelease/ios/documentation/QuartzCore/Reference/CVPixelBufferRef/index.html#//apple_ref/c/func/CVPixelBufferLockBaseAddress

必須調用CVPixelBufferLockBaseAddress功能與CPU存取像素數據之前,後來叫CVPixelBufferUnlockBaseAddress功能。如果在鎖定緩衝區時在lockFlags參數中包含kCVPixelBufferLock_ReadOnly值,則在解鎖緩衝區時還必須包含該值。

重要

與GPU訪問像素數據時,鎖定是不必要的,並且會削弱性能。

相關問題