问题:我制作了一个播放100帧的300 x 300像素大图像序列动画的课程。这个类有一个启动动画的-start方法,然后是一个遍历框架的-animate:方法。在每一帧中,它从png中获取大块位图数据,将其包装到UIImage中并将其分配给UIImageView的image属性。然后它会调用一个延迟选择器来接下一帧:
[self performSelector:@selector(animate:) withObject:nil afterDelay:delay];
动画本身很流畅,但整个用户界面冻结直到完成。 在iPhone模拟器上,UI不会冻结。所以我假设在执行这个动画时CPU的运行率为100%。
现在的问题是:在这样的情况下,什么样的多线程技术或策略可以提供帮助?
我应该开始关注POSIX吗?或任何其他API /库/框架?或者我应该依赖NSObject方法来创建线程还是使用NSThread?
我试图将整个动画放入一个新的NSThread线程,但这对任何事都没有帮助。据我所知,我必须在主线程上调用任何UI代码。因此,在动画期间更新UIImageView的图像属性时,必须在主线程上完成。因此,当我从PNG中获取位图数据时,我可以“节省时间”用于UI重新响应的唯一真实部分是什么?或者还有其他什么可以帮助吗?
答案 0 :(得分:1)
奥拉,
你提到把整个事情放在一个线程中。这是问题的一部分。下面的链接涉及从线程更新用户界面的不同方面。
简而言之,你的主线程将启动一个子线程,子线程将执行提取和其他计算,子线程将使用PerformSelectorOnMainThread调用一个函数'在主线程中':(查找类似于我链接到下面的页面),使用PerformSelectorOnMainThread调用的函数将更新UI,您的子线程将睡眠一段时间,您的子线程将保持打勾状态。
一些有用的链接:
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 -
答案 1 :(得分:0)
我首先使用泄漏仪器检查是否有泄漏。 另外,看看Object Alloc,看看没什么可疯狂的。
答案 2 :(得分:0)
在深入研究多线程之前,我建议在应用程序在设备上执行时(而不是模拟器)运行Shark的时间配置文件。通过适当的数据挖掘(主要是向其调用者收取较低级别的库),您应该能够快速查看热点在运行的应用程序中的位置。如果它是屏幕的实际显示,那么多线程可能不会给你带来太多。在这种情况下,您可能希望研究更有效的显示方法。作为一个数据点,Mo Dejong报告here他能够使用非多线程代码在原始iPhone上以15 FPS为30个480x320 PNG制作动画。
在多线程方面,iPhone上有两种主要方法:手动管理的NSThreads和基于队列的NSOperations。 NSThreads可以更简单地设置(使用detachNewThreadSelector:toTarget:withObject:或NSObject的performSelectorInBackground:withObject :),但是你必须手动管理它们的执行并且担心访问共享资源。 NSOperations和NSOperationQueues可能需要更多的代码来设置,但它们可以通过协调执行顺序使事情变得更加容易。此外,在许多情况下,您可以创建一个单宽的NSOperationQueue来访问某些共享资源,并避免围绕该资源进行昂贵的锁定。
我在去年将几乎所有的多线程代码都移到了NSOperation,并且看到了显着的性能优势(虽然大部分代码都在Mac上)。例如,我有一个类似的任务,我需要从CCD相机抓取一个帧,处理帧,并将其显示在屏幕上。我把它分成三个NSOperationQueues,每个都是一个操作范围。一个队列包含从相机中拉出帧并将处理操作插入第二个队列的操作。处理操作完成后,创建一个操作以更新显示并插入第三个队列。我发现为每个帧处理任务创建一个新的NSOperation的开销远远超过了不必锁定和解锁某些资源的性能优势。