在iOS6中,我正在使用OpenGL在AVFoundation视频帧上进行一些渲染。我已经看到很多使用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress的示例代码,但是当我完全执行锁定和解锁或为什么我这样做时,我不清楚。当CPU修改内存时,我应该锁定地址吗?或者我应该在GPU读取它时将其锁定?什么时候应该解锁?为什么我甚至想解锁?我见过this Stack Overflow answer,但它并没有完全回答我的问题。
答案 0 :(得分:3)
每次需要使用时都应锁定,并在完成后解锁并且不再需要它。这可以防止缓冲区被覆盖,从而使缓冲区处于不一致状态。
一位固件专家曾向我解释过这一点:一般来说,在处理视频输出时,你应该注意有很多带指针的间接引用,就像说:“嘿,这是我的,我正在使用它,指向下一个框架在其他地方“。
我不能根据您的应用程序判断何时不再需要缓冲区,但这是您应该能够弄清楚的。如果您已将缓冲区数据复制到其他位置(例如创建新对象),则表示您可以将其解锁。
希望这会有所帮助。
答案 1 :(得分:2)
如果你想访问CPU上的像素缓冲区,你应该只调用这个函数,万一GPU不这样做!Apple doc非常清楚。
以下是来自官方苹果doc的信息:
在使用CPU访问像素数据之前必须调用CVPixelBufferLockBaseAddress函数,然后调用CVPixelBufferUnlockBaseAddress函数。如果在锁定缓冲区时在lockFlags参数中包含kCVPixelBufferLock_ReadOnly值,则还必须在解锁缓冲区时包含它。
重要强>
使用GPU 访问像素数据时,无需锁定,可能会影响性能。