为啥我的触摸事件频率在 iOS 4.0 上变慢了?
Posted
技术标签:
【中文标题】为啥我的触摸事件频率在 iOS 4.0 上变慢了?【英文标题】:Why is my touch event frequency slower on iOS 4.0?为什么我的触摸事件频率在 iOS 4.0 上变慢了? 【发布时间】:2010-12-05 04:25:08 【问题描述】:我正在编写一个手指素描类型的应用程序,并且该应用程序在 ios 3.0 上运行良好。但是,在 iOS 4.0 或更高版本下运行应用程序会导致问题。具体来说,我在新操作系统上接收到我的应用程序的触摸事件大约比旧操作系统慢 5 倍。这显然会导致我的应用程序绘制不佳,因为我捕获的数据点减少了 5 倍。
关于如何在 iOS4 上加快触摸事件频率的任何想法?
【问题讨论】:
【参考方案1】:iOS4.x 中的某些图形操作比 3.x 中花费的时间要长得多(慢 2 倍到 10 倍之间)。较长的图形执行时间可能会阻塞主 UI 线程,并且没有为主线程运行循环留下足够的时间来处理用户(触摸)事件。
分析您的 drawRect 代码,看看它现在是否需要更长的刷新率滴答时间。如果是这样,请尝试加快或中断图形渲染,或尝试降低帧速率,看看是否有任何帮助。
【讨论】:
我在绘制代码方面还很陌生,所以这是我的一般策略。我正在继承 UIView。在 touchesmoved 方法中,我有一个数组来存储需要绘制到视图的点。我还创建了一个间隔为 0.03 的计时器,它在触发时调用 setNeedsDisplay。我在 viewDidLoad 中声明了定时器如下: timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES]; 这是正确的方法吗?或者我错过了线程在这里运行的方式。我可以在单独的线程上绘图,这样它就不会阻塞主线程(这样我就可以接收更多的触摸事件)? 在确定您的计时器值是否正确之前,您需要了解您的 drawRect 代码花费了多少时间。某些类型的 CG 绘图是线程安全的,但不是一般的 UI 绘图代码。 @aloo - 听起来您在绘图代码中遇到了一段时间的性能问题:***.com/questions/1123306/…,因此您可能希望定期将绘图展平为位图以避免其中一些减速。与往常一样,使用 Instruments 进行分析以确定确切的热点。 是的,这是真的!我已经对其进行了多次迭代,并找到了适用于所有 pre-iphone4 的东西。正如你所建议的,我已经定期绘制到一个单独的图层上,但在 iPhone 4 上不得不放慢这个间隔。【参考方案2】:您应该使用 Shark 分析您的代码以查看瓶颈在哪里。可能发生的情况是您在主线程上执行的某些代码(很可能是响应触摸而运行的代码)花费的时间比预期的要长,这会阻止您的应用接收触摸事件
【讨论】:
drawRect 是否在主循环中运行?【参考方案3】:少阻塞主线程。
【讨论】:
以上是关于为啥我的触摸事件频率在 iOS 4.0 上变慢了?的主要内容,如果未能解决你的问题,请参考以下文章