了解iOS

时间:2015-10-07 15:35:27

标签: ios multithreading gpu

我试图了解在什么情况下iOS以及由于过多的CPU消耗而如何限制我的应用程序线程。我得到的结果有点奇怪。

我有一个使用OpenGL / GLKViewController的应用程序渲染视图和一个单独的逻辑线程,使用NSThread.detachNewThreadSelector在后台启动,执行计算。我发现,如果我(为了讨论的目的)让我的计算线程尽可能快地运行,iOS会快速限制它。例如我监视视图和我的线程的FPS,我看到视图保持例如60fps和我的逻辑线程一直在嗡嗡作响,但几秒后突然下降。

因此,对我来说,iOS可能会限制线程消耗。奇怪的是,它不仅逐渐减速,而且似乎以大约GPU帧速率(即30或60fps)的倍数“量化”我的逻辑线程的FPS!

现在,请记住这些线程之间存在无同步,逻辑循环是相当于while(true)的自包含硬循环,所以我不知道iOS的可能性如何除非它以某种方式意识到我的顶级循环并插入其中,否则要完成这个魔法。

如果你不相信我没有同步点,我会告诉你我已经创建了一个测试用例,它实际上只有一个空的GLKViewController循环和一个哑逻辑线程来搅拌一些数字并且它表现出这种行为。屏幕截图如下,如果有人有兴趣,我可以发布代码。

下面的屏幕截图是两个不同的“负载”的逻辑线程,每隔一秒打印一次,在带有iOS 8的iPad Air上运行。

更奇怪的是 - 有时设置较低的首选GLK帧速率(例如30fps)实际上可以使我的逻辑线程运行更慢。我曾预计减少GPU所做的工作会释放(资源/散热)并减少对节流的需求,但似乎并非总是如此。

有没有人对此行为有解释?有记录吗?感谢。

enter image description here enter image description here

编辑:我在这一点上的唯一猜测是,如果GPU运行到热,他们关闭第二个核心并将线程迁移回第一个......然后以某种方式线程优先级会计入隐式同步,尽管我仍然可以我不确定这是怎么发生的。

0 个答案:

没有答案