gpt4 book ai didi

ios - 以非阻塞方式等待 CIContext 渲染任务

转载 作者:行者123 更新时间:2023-12-04 08:03:14 25 4
gpt4 key购买 nike

我正在寻找等待 CIContext 的方法渲染完成而不会阻塞。为简单起见,这里有一个示例,我渲染了一个 CVPixelBufferRef到另一个 CVPixelBufferRef使用 CIImageCIContext .显然,我的实际管道会做得更多,但这是最简单的情况。

CIContext *context = [CIContext new];
// sourceBuffer provided from something like a camera
CIImage *image = [CIImage imageWithCVPixelBuffer:sourceBuffer];

CVPixelBufferRef output;
// pool was allocated elsewhere
CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, bufferPool, &output)
[context render:image toCVPixelBuffer:output];
代码在渲染完成之前会阻塞,因为 [CIContext render:toCVPixelBuffer:]正在阻塞。
您可以使用 [CIContext startTaskToRender:toDestination:error:] 以非阻塞方式启动渲染任务。 ,像这样
CIContext *context = [CIContext new];
// sourceBuffer provided from something like a camera
CIImage *image = [CIImage imageWithCVPixelBuffer:sourceBuffer];

CVPixelBufferRef output;
// pool was allocated elsewhere
CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, bufferPool, &output)

CIRenderDestination *destination = [[CIRenderDestination alloc] initWithPixelBuffer:output];
[context startTaskToRender:image toDestination:destination error:nil];
这是一半,调用不会阻塞,但我不知道渲染任务何时完成。该 API 返回 CIRenderTask ,但它只有一个实例方法,当然是 waitUntilCompletedAndReturnError ,这将阻塞直到任务完成。
老实说,除了为错误回调提供媒介之外,我并没有真正理解这个 API 的意义。除非您的管道不需要知道任务何时完成,否则您仍然需要阻塞以获取结果。
所以,我的问题是:是否有可能获得 CIContext 的结果?渲染而不阻塞?

最佳答案

第一个render call 实际上不应该是一个阻塞调用。如 this answer 中所述,

"Core Image defers the rendering until the client requests the access to the frame buffer, i.e. CVPixelBufferLockBaseAddress".


但是,您也可以使用 CIRenderDestiantion API 并像这样自己让它异步:
CIRenderTask *task = [context startTaskToRender:image toDestination:destination error:nil];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[task waitUntilCompletedAndReturnError: NULL];
// do async stuff here, e.g. call a callback block
});

关于ios - 以非阻塞方式等待 CIContext 渲染任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66344111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com