Performance 更新复杂度会逐渐降低watchOS3中Apple Watch应用程序的性能

Performance 更新复杂度会逐渐降低watchOS3中Apple Watch应用程序的性能,performance,watchkit,apple-watch-complication,watchos-3,Performance,Watchkit,Apple Watch Complication,Watchos 3,我已经为这个问题强调了大约一周了,试图找出苹果手表应用程序性能缓慢但稳定下降的根源。在大约两天的时间里,我的应用程序的UI将变得越来越缓慢。我已经把它缩小到一个复杂的更新代码。即使我将复杂度更新减少到绝对最小,这个问题仍然会发生,尽管比使用一些实际数据更新复杂度要慢。我每10分钟更新一次并发症。一旦有了新数据,我只需执行 for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications

我已经为这个问题强调了大约一周了,试图找出苹果手表应用程序性能缓慢但稳定下降的根源。在大约两天的时间里,我的应用程序的UI将变得越来越缓慢。我已经把它缩小到一个复杂的更新代码。即使我将复杂度更新减少到绝对最小,这个问题仍然会发生,尽管比使用一些实际数据更新复杂度要慢。我每10分钟更新一次并发症。一旦有了新数据,我只需执行

for (CLKComplication *comp in [CLKComplicationServer sharedInstance].activeComplications) {  
     [[CLKComplicationServer sharedInstance] reloadTimelineForComplication:comp];  
}  
这反过来又要求:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {  
...  
}  
这很好,新的数据显示出来,但当重复几十次时,主应用程序的UI响应能力开始显著降低,当重复大约一百次时(不到一天的时间,10分钟的更新),UI的速度确实显著降低

我对复杂的结构没有任何幻想——没有时间旅行,只显示当前数据,一切都是为此而设置的。为了确保我没有看错地方,我做了一个每秒重新加载时间线的测试,在这个测试中,我的GetCurrentTimeLineEntryForComplexing如下所示:

- (void)getCurrentTimelineEntryForComplication:(CLKComplication *)complication withHandler:(void(^)(CLKComplicationTimelineEntry * __nullable))handler {  
     handler(nil);  
}  
所以这里没有任何东西,只需返回空的处理程序。然而,即使在这种情况下,在大约100个时间线重新加载后,主应用程序的UI速度也明显减慢

还有一些需要注意的事项:

  • 如果我不更新复杂度,应用程序的UI性能永远不会下降,无论我打开它多少次,使用它多长时间,或者数据获取代码在后台运行多少次

  • 在模拟器中进行测试时,我无法实现性能下降,但我始终可以看到复杂更新会导致较小但稳定的内存泄漏(同样,无论我在GetCurrentTimeLineEntryForConcurrence方法中进行多么简单的更新,都会发生这种情况)

其他人是否注意到了这一点,是否有希望解决它?我是否做错了什么?目前,我只确保在数据发生变化时更新复杂性,但这只是推迟问题,而不是解决问题

10月24日编辑

我在一个真正的手表上做了更仔细的测试,而之前由于某种原因我没有注意到与此相关的内存泄漏,现在我肯定看到了它的发生。真正的设备完全反映了在模拟器上看到的问题,只是有不同的初始内存分配量

同样,我所要做的就是在一个常量循环中调用ReloadTimeLineForComplexion,并使用缓存数据对象中的一行文本更新复杂度,否则复杂度控制器将被剥离到最小值。当复杂度从表面移除时,内存泄漏可预测地停止

我的主要项目是用ObjectiveC编写的,但我用Swift制作的测试项目重复了测试,没有区别。此外,最新的XCode 8.1 GM和随附模拟器的watchOS 3.1测试版以及安装了watchOS3.1的真实手表都存在问题

2017年1月24日编辑

不幸的是,这个问题在watchOS 3.1.3中仍然存在,完全没有改变。与此同时,我联系了苹果的代码级支持,向他们发送了示例代码,他们确认了问题的存在,并告诉我提交一份错误报告。我在大约两个月前提交了一份错误报告,但到目前为止它仍然没有分类,我想这意味着没有人知道我还没同意呢

2017年1月31日编辑


苹果已经修复了watchOS3.2 beta 1中的问题。我已经在模拟器和real watch上进行了测试。一切都很好,不再有内存泄漏或性能下降。最终,在他们决定修复之前,没有解决方法。我注意到,我所做的每件事都使用了本机日历ecomes非常迟钝,所以可能是新watch操作系统中的一个bug。
在使用日历复杂功能几天后,无法使用该手表表面。即使我更改为其他复杂功能并切换回日历复杂功能,也不会“重置”性能。唯一解决的问题是重新启动手表。(或者忘记日历,改为使用其他复杂功能)

苹果已经修复了watchOS3.2 beta 1中的问题。我已经在模拟器和真实手表上对其进行了测试。一切都很好,没有内存泄漏或性能下降。最终没有解决办法,直到他们决定修复它。

我注意到米老鼠手表表面似乎开始跳帧如果我使用time travel,在该手表表面激活一段时间后。我将尝试禁用日历复杂性,看看是否仍会发生。如果问题与我在应用程序中注意到的是同一件事,那么只需关闭并重新启动日历应用程序就足够了,而不必重新启动整个手表。我找到了一个“解决方案”所以你不必重新启动。我只需访问iPhone上的日历选项,然后将其更改为“自定义”,然后再更改为“镜像”。这似乎可以重置性能,但并不能解决问题。实际上,我真正的解决方案是使用名为EventsWidget的应用程序。它有一个很好且简单的日历复杂功能,运行平稳。