1

在 iOS6 中,我使用 OpenGL 对 AVFoundation 视频帧进行渲染。我见过很多使用 CVPixelBufferLockBaseAddress 和 CVPixelBufferUnlockBaseAddress 的示例代码,但我不清楚我何时执行锁定和解锁或为什么要这样做。CPU修改内存时我应该锁定地址吗?或者当 GPU 正在读取它时我应该锁定它吗?我应该什么时候解锁?为什么我什至想解锁?我已经看过这个 Stack Overflow 答案,但它并没有完全回答我的问题。

4

2 回答 2

3

您应该在每次需要使用它时锁定它,并在使用完并且不再需要它时解锁。这可以防止缓冲区被覆盖,从而使其处于不一致的状态。

一位固件专家曾经给我解释过:一般来说,在处理视频输出的时候,你应该注意有很多带有指针的间接引用,这就像在说:“嘿,这是我的,我正在使用它,指向下一个在其他地方框架”。

我无法根据您的应用程序判断何时不再需要缓冲区,但这是您应该能够弄清楚的。如果您已将缓冲区数据复制到其他地方(例如创建新对象),则意味着您可以解锁它。

希望这可以帮助。

于 2013-03-22T06:50:57.870 回答
2

你应该只在你想访问 CPU 上的像素缓冲区的情况下调用这个函数,在 GPU 的情况下不要这样做!,Apple doc 对此非常清楚。

以下是来自苹果官方文档的信息:

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

您必须在 CPU 访问像素数据之前调用 CVPixelBufferLockBaseAddress 函数,然后再调用 CVPixelBufferUnlockBaseAddress 函数。如果在锁定缓冲区时在 lockFlags 参数中包含 kCVPixelBufferLock_ReadOnly 值,则在解锁缓冲区时也必须包含它。

重要的

使用 GPU 访问像素数据时,锁定不是必需的,并且会降低性能。

于 2015-06-19T21:28:27.933 回答