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