【问题标题】:When should I call CVPixelBufferLockBaseAddress and CVPixelBufferUnlockBaseAddress?我应该什么时候调用 CVPixelBufferLockBaseAddress 和 CVPixelBufferUnlockBaseAddress?
【发布时间】:2013-03-11 14:09:48
【问题描述】:

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

【问题讨论】:

  • 那看看我的类似问答stackoverflow.com/questions/6468535/…
  • 我链接到你的问题。就像我说的,它并没有完全回答我的问题。但也许你有一些见识。我应该什么时候锁定?我应该什么时候解锁?我为什么要解锁?锁能防止什么?

标签: ios opengl-es-2.0 avfoundation gpuimage


【解决方案1】:

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案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 访问像素数据时,锁定不是必需的,并且会降低性能。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多