ios - 如何保护我的工作线程不被系统进程抢占?

标签 ios multithreading

我正在开发一些 AR 游戏,其中包含三个主要模块:

  • 用于捕获视频帧数据的 AVCaptureSession
  • 算法模块
  • 渲染引擎

应用程序的例程非常简单:

  • 从AVCaptureVideoDataOutput中获取一帧数据,然后传递给算法模块
  • 算法模块在自己的调度队列上处理帧数据,然后将结果传递给渲染引擎
  • 渲染引擎使用结果来更新整个虚拟场景

每个模块都有自己的工作线程(或调度队列),但只有一个模块处于事件状态,因为它们是串行工作的。

问题是当应用程序在一些低级别设备(如iPhone6)上运行时,fps 不稳定。经过分析,我发现有时两个CPU核心都被某些系统进程占用(例如medieserverd,backboardd ...),并且我的工作线程可能会被抢占很长时间(例如10ms甚至更长)

有什么方法可以确保我的工作线程至少能占用一个CPU核心吗?

现在我使用调度队列来组织我的工作任务。直接使用NSThread会不会更好?

最佳答案

Is there any way to make sure my working thread can occupy at least one cpu core?

通常不会,内核可能总是决定抢占您的线程。但您可以指出线程的重要性,以减少发生这种情况的可能性。

I'm using dispatch queues to organize my work tasks.

尝试增加队列的优先级,例如像这样:

dispatch_set_target_queue(myQueue,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0));

有关设置队列优先级的更多详细信息 here .

Will it be better to use NSThread directly?

NSThread 有更多的方法来调整优先级,所以是的,这可能会带来更好的结果。

如果你切换到NSThread,你将能够设置它的 qualityOfServicethreadPriority .

这应该足以为您的线程提供更多的 CPU 时间。如果没有的话,可以尝试下层API直接调整Mach thread scheduling .

关于ios - 如何保护我的工作线程不被系统进程抢占?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56513310/

相关文章:

ios - JSON转UITableView Swift 4 最近播放的歌曲

java - 以最有效的方式从数据库中获取大量数据

用于 IOT 项目的多个服务器通信的 Java 单客户端线程

java - 使 Java Servlet 线程安全

c++ - 来自另一个线程的线程中断

ios - 清除 UIAutomation 测试的钥匙串(keychain)

ios - 从 AVCaptureVideoDataOutput 获取正确的第一帧 - AVFoundation

objective-c - 一种使核心数据获取性能更好的简单方法

java - 在 Android 和 OpenCV 中使用 BlockingQueue 进行多处理

android - flutter ,云火存储查询方法,其中无法正常工作