高 CPU 负载延迟 UIView 重绘(iOS)

Posted

技术标签:

【中文标题】高 CPU 负载延迟 UIView 重绘(iOS)【英文标题】:High CPU load delaying UIView redraw (iOS) 【发布时间】:2011-01-22 14:29:07 【问题描述】:

我正在制作一个带有 OpenGL ES 视图的 ios 应用程序。在 3D 视图之上,我使用 Cocoa Touch 绘制了各种 GUI 位。

只要帧率良好,它就可以正常工作。然而,当 CPU 负载变高时(GLES 视图下降到 20-ish FPS),似乎正在推进下一个 UIKit 显示周期。

具体来说,我正在尝试基于各种 UIView 子类显示工具提示视图。当需要显示它时,我更新工具提示标签文本并调整其背景大小,然后将主 UIView 的 hidden 设置为 NO 并调用 setNeedsDisplay 和 setNeedsLayout。

当帧率低(即 CPU 负载高)时,下一个显示周期似乎无限期地向前推进。但是当 CPU 负载下降时,视图会按预期显示。

有什么方法可以在我的 3D 引擎重绘之间在 UIKit 中发起一个绘制周期?还有其他想法吗?

【问题讨论】:

【参考方案1】:

在 iPhone 上,除非另有说明,否则所有应用程序都在一个线程上完成其 UI 绘制和逻辑。

您可以将您的 3D 绘图代码移至另一个线程:

[NSThread detachNewThreadSelector:@selector(3DRenderingMethod) toTarget:self withObject:nil]

这里是相关文档:http://developer.apple.com/library/iOS/#documentation/Cocoa/Reference/Foundation/Classes/NSThread_Class/Reference/Reference.html

【讨论】:

在一个线程中运行的所有逻辑和绘图(它们在我的应用程序中执行)都很好。关键是,高 CPU 负载似乎无限期地推动 UIKit 重绘,即使我绝对没有阻塞主线程。当 CPU 负载很高时,UIKit 似乎故意跳过重绘;这是我想在特定情况下防止的。

以上是关于高 CPU 负载延迟 UIView 重绘(iOS)的主要内容,如果未能解决你的问题,请参考以下文章

系统负载高,如何排查?

iOS重绘机制drawRect

用动画重绘 UIView

io等待为啥引发cpu过高

CPU内存IO负载过高排障方法及解决方案

mysql占用磁盘IO过高(主从延迟高)