Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我应该何时调用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress?_Ios_Opengl Es 2.0_Avfoundation_Gpuimage - Fatal编程技术网

Ios 我应该何时调用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress?

Ios 我应该何时调用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress?,ios,opengl-es-2.0,avfoundation,gpuimage,Ios,Opengl Es 2.0,Avfoundation,Gpuimage,在iOS6中,我使用OpenGL在AVFoundation视频帧上进行渲染。我看过很多使用CVPixelBufferLockBaseAddress和CVPixelBufferUnlockBaseAddress的示例代码,但我不清楚我到底是什么时候执行锁定和解锁的,也不清楚我为什么这么做。我应该在CPU修改内存时锁定地址吗?或者我应该在GPU读取时锁定它?我应该什么时候解锁?为什么我会想要解锁?我已经看到了,但它并没有完全回答我的问题。每次需要使用它时,你都应该锁定它,当你使用完毕并且不再需要它时

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

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

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

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


希望这对您有所帮助。

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

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

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


希望这有帮助。

您应该只在需要访问CPU上的像素缓冲区时调用此函数,如果GPU不这样做!,苹果医生对此非常清楚

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

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

重要


当使用GPU访问像素数据时,锁定是不必要的,可能会影响性能。

仅当您想访问CPU上的像素缓冲区时,才应调用此函数,如果是GPU,则不要这样做!,苹果医生对此非常清楚

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

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

重要


当使用GPU访问像素数据时,锁定是不必要的,可能会影响性能。

看看我的一个类似问题和答案,我在我的问题中链接到了你的问题。就像我说的,它不能完全回答我的问题。但也许你有一些见解。我应该什么时候锁门?我应该什么时候解锁?我为什么要解锁?锁阻止了什么?看看我的一个类似的问题和答案,我把你的问题和我的答案联系起来。就像我说的,它不能完全回答我的问题。但也许你有一些见解。我应该什么时候锁门?我应该什么时候解锁?我为什么要解锁?锁能防止什么?