有哪些iPhone OS的多线程技术可用,我应该使用哪些?

3
问题:我创建了一个播放100帧的大型300 x 300像素图像序列动画的类。该类具有一个-start方法,它启动动画,然后是一个-animate: 方法,该方法遍历帧。在每个帧上,它从png中获取大块位图数据,将其包装成UIImage并将其分配给UIImageView的image属性。然后它调用延迟的选择器来获取下一帧:
[self performSelector:@selector(animate:) withObject:nil afterDelay:delay];

动画本身很流畅,但整个UI会在动画完成前冻结。在iPhone模拟器中,UI不会冻结。因此我认为,在执行这个动画时CPU运行速度达到了100%。

现在的问题是:在这种情况下应该使用什么样的多线程技术或策略来解决呢?

我应该开始看POSIX吗?还是其他API /库/框架?或者应该依靠NSObject方法创建线程或使用NSThread呢?

我试图将整个动画放入一个新的NSThread线程中,但这并没有帮助任何事情。据我所知,我必须在主线程上调用任何UI代码。因此,在动画期间更新UIImageView的图像属性时,必须在主线程上完成。因此,我唯一可以“节省时间”以提高UI响应性的真正部分是从PNG中提取位图数据吗?还是有其他方法可以帮助解决问题呢?


不要忘记,iPhone模拟器运行在一台可能拥有>2GHz CPU和>1GB RAM的机器上。 - notnoop
我想指出的是,我的代码阻止UI在逻辑上不是一个错误。 - HelloMoon
3个回答

1

你好,

你提到将整个过程放在一个线程中。这是问题的一部分。下面的链接涉及从线程更新用户界面的不同方面。

简而言之,你的主线程将启动一个子线程,子线程将执行提取和其他计算,子线程将使用PerformSelectorOnMainThread:调用“主线程中的”函数(在我下面链接的页面中寻找类似的内容),使用PerformSelectorOnMainThread调用的函数将更新UI,你的子线程将睡眠一段时间,你的子线程将继续运行。

一些有用的链接:

x. 9media.com/blog/?p=195

x. forums.macrumors.com/showthread.php?t=683250

x. www.xprogress.com/post-36-threading-tutorial-using-nsthread-in-iphone-sdk-objective-c

最重要的是,阅读NSThread的文档。
-isdi-

0
我会先使用泄漏检测工具来检查内存泄漏。 此外,还要查看对象分配情况,确保没有发生不正常的情况。

0
在深入研究多线程之前,我建议在设备上执行应用程序时(而不是模拟器),使用Shark的时间分析工具。通过适当的数据挖掘(主要是将较低级别的库充电给它们的调用者),您应该能够快速看到运行应用程序中的热点所在。如果是实际显示到屏幕上,则多线程可能不会带来太多好处。在这种情况下,您可能需要研究更高效的显示方法。作为一个数据点,Mo Dejong在这里报告说,他能够在原始iPhone上使用非多线程代码以15 FPS动画播放30个480x320 PNG。

当涉及到多线程编程时,在iPhone上有两种主要的方法:手动管理的NSThreads和基于队列的NSOperations。NSThreads可以更简单地设置(使用detachNewThreadSelector:toTarget:withObject:或NSObject的performSelectorInBackground:withObject:),但是您必须手动管理它们的执行并且非常关注对共享资源的访问。NSOperations和NSOperationQueues可能需要更多的代码来设置,但是它们可以通过协调执行顺序为您提供更方便的方式。此外,在许多情况下,您可以创建一个单一的宽NSOperationQueue来访问某些共享资源,并避免围绕该资源的昂贵锁定。

在过去的一年中,我几乎将所有的多线程代码都转移到了NSOperation上,并且看到了显著的性能提升(尽管大部分代码是在Mac上)。例如,我有一个类似的任务,需要从CCD相机中获取帧,处理帧并将其显示到屏幕上。我将其拆分为三个NSOperationQueues,每个队列只包含一个操作。一个队列包含从相机中提取帧并将处理操作插入第二个队列的操作。一旦处理操作完成,就会创建一个用于更新显示并插入第三个队列的操作。我发现为每个帧处理任务创建新的NSOperation的开销远远超过了不必锁定和解锁某些资源所带来的性能优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接