gpt4 book ai didi

ios - 一段时间后 dispatch_queue_t 变慢

转载 作者:行者123 更新时间:2023-11-28 23:28:26 28 4
gpt4 key购买 nike

我有关于自定义 DispatchQueue 的问题。

我创建了一个队列,并将其用作captureOutput:方法的队列。这是一个代码片段:

//At the file header
private let videoQueue = DispatchQueue(label: "videoQueue")

//setting queue to AVCaptureVideoDataOutput
dataOutput.setSampleBufferDelegate(self, queue: videoQueue)

获得帧后,我会用它进行昂贵的性能,并且我会为每一帧执行此操作。

当我启动应用程序时,昂贵的性能需要 17 毫秒才能计算,值得庆幸的是我的帧速率约为 46-47 fps。到目前为止一切顺利。

但是一段时间后(大约 10-15 秒),这种昂贵的性能开始花费越来越多的时间,在 1-2 分钟内我最终达到 35-36 fps,而不是 17 毫秒,我大约有 20-25女士。

不幸的是,我无法提供性能昂贵的代码,因为代码量很大,而且至少 XCode 告诉我没有任何内存泄漏。

我知道手动创建的 DispatchQueue 本身并不能真正工作,因为我放在那里的所有任务最终都会在 iOS 默认线程池中结束(我说的是 BACKGROUNDUTILITYUSER_INTERACTIVE等)。对我来说,videoQueue 似乎在一段时间内失去了优先级。

如果我的猜测是正确的 - 有什么方法可以影响它吗? DispatchQueue 的性能非常重要,我想始终给予它最高优先级。

如果我不正确,如果有人能给我一个我应该调查的方向,我将非常感激。提前致谢!

最佳答案

首先,我会怀疑您代码的其他部分,可能还有某种内存积累。我希望您要么一遍又一遍地重新处理相同数据的某些部分,要么进行大量内存分配/解除分配(这可能导致内存碎片)。许多内存问题不会显示为“泄漏”(因为它们不是泄漏)。探索这一点的方法是使用 Instruments。

也就是说,您可能不想在默认 QoS 下运行它。您不应将 QoS 视为“优先级”。它比这更复杂(这就是为什么它被称为“服务质量”,而不是“优先级”)。您应该将工作分配给 QoS 与其对用户的影响相匹配的队列。在这种情况下,看起来您正在实时更新 UI。匹配 .userInteractive QoS:

private let videoQueue = DispatchQueue(label: "videoQueue", qos: .userInteractive)

这可能会有所改善,但我怀疑 Instruments 会帮助您揭示代码中的其他问题。

关于ios - 一段时间后 dispatch_queue_t 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771495/

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