当CollapseLayers = true时,iOS中的核心绘图性能

时间:2014-02-21 01:54:18

标签: ios performance xamarin.ios core-plot

在我的iOS应用程序中,我使用UIScrollView和UIPageControl显示不同时间段的三个CPTXYGraph图,即一个显示最近30天的数据,下一个显示最后90天,第三个显示最后六个月的数据。

即上个月 enter image description here

去年90 enter image description here

UIScrollView和UIPageControll的组合允许我加载每个图形,然后让用户从图形滑动到图形以查看不同的时间段。

在我尝试将我的应用程序设为通用应用程序并试图在iPad上运行之前,一切都运行良好。当我旋转iPad时,应用程序会崩溃并导致iPad进行软重置。虽然连接到调试器,但iPad会在崩溃之前报告低内存警告。

我发现在CPTGraphHostingView上设置CollapseLayers = true然后我可以在iPad上运行应用程序而不会崩溃,但是在其他页面上加载额外的图形比我在iPhone上可以做的要慢几个数量级。虽然我使用的是iPhone 5s和iPad3,但我没想到像我看到的那样意外放缓。

困惑,我将应用程序重新加载到iPhone上并且仍设置了CollapseLayers = true,并注意到iPhone已经放慢了显着加载水平图形的速度。请参阅下面的仪器捕获

首先使用CollapseLayers = false enter image description here

第二个是CollapseLayers = true enter image description here

在每次捕获中,我在iPhone上执行相同数量的“工作”,启动应用程序并旋转。请注意,当CollapseLayers = true时,CPU占用100%的时间明显长于CollapseLayers = false,但内存使用量要少得多,大约38MB对199MB。

有关如何减少内存使用量的建议,因此我不需要设置CollapseLayers = true,或者如何使用CollapseLayers = true来提高性能?

更新

我找到了一个讨论这个主题的讨论:

https://groups.google.com/forum/m/#!topic/coreplot-discuss/LqMJEPyuR1o

来自帖子

渲染速度受CPU限制,所以不幸的是,更高的分辨率要求工作量增加4倍,这与你所看到的一致。

这至少可以解释为什么我在iPad3和iPhone上看到了这样的性能。

尝试从我的图表中移除主题并离开CollapseLayers = false,遗憾的是这仍然会使iPad崩溃。

3 个答案:

答案 0 :(得分:1)

设置collapsesLayers = YES告诉Core Plot将整个图形绘制到单个Core Animation层中,而不是为所有各种元素(轴,图,标签等)使用单独的图层。 。这会减少内存使用量,但会强制整个图形重绘,如果有任何更改,而不是仅重新绘制更改的部分。创建后,确保图形不会重绘多次。请记住,任何更改图表或托管视图会强制它在显示后重绘。

答案 1 :(得分:0)

对于将来发现此问题的任何人,我现在的解决方案是更改图形框架。我不确定我是否遇到了使用Xamarin.iOS中的核心情节的问题,这是否有助于解决问题,但是尝试所有其他问题的答案和其他研究我无法提高性能/减少iPad上的内存使用量。

现在我已经开始使用OxyPlot https://oxyplot.codeplex.com了。

性能和内存使用量只是核心情节的一小部分,为我提供了前进的道路。

答案 2 :(得分:0)

如果您使用表格视图在多个图表中显示相同的CPTGraphHostingView,则它在其委托方法中绘制的每个图层都会保留在内存中...这会不断增加,我猜这是CorePlot库中的问题

所以我找到了一个更好的选择: 在你的表视图的cellForRowAtIndexPath方法中创建类似的东西      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GraphCell" forIndexPath:indexPath];
if(cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"GraphCell"];
}
for (id v in cell.contentView.subviews)
{
    if ([v isKindOfClass:[CPTGraphHostingView class]])
    {
        [v removeFromSuperview];
    }
}

self.hostView = [(CPTGraphHostingView *) [CPTGraphHostingView alloc] initWithFrame:cell.contentView.bounds];
self.hostView.allowPinchScaling = NO;
[cell.contentView addSubview:self.hostView];