针对大型数据集的每帧优化

时间:2011-02-06 19:44:03

标签: objective-c cocoa-touch optimization core-data binary-tree

摘要

iPhone编程新手,我无法选择正确的优化策略来过滤包含大量内容的滚动视图中的一组视图组件。我的应用程序将在哪个领域获得最佳性能?

简介

我目前正在使用的iPad应用程序让用户可以探索相当大的二叉树结构。这些树包含30到900个节点,当在滚动视图中绘制(有限缩放)时,它看起来像这样。

Screenshot of tree exploration app

节点的内容存储在SQLite支持的Core Data模型中。它是一个二叉树,如果一个节点有子节点,总会有两个。 x和y位置是模型的一部分,节点连接的尺寸也是如此,如虚线所示。

优化

在任何给定时间,只有大约50个节点适合屏幕。由于最大的树包含多达900个节点,因此无法将所有内容放在受滚动视图控制和缩放UIView中,这是崩溃的秘诀。所以我必须对节点进行每帧过滤。

这就是我的烦恼开始的地方。我没有经验可以在可能的过滤选项之间做出有根据的决定,此外我可能不知道在Objective-C或Cocoa Touch中埋藏的真正快速的特殊魔法。由于后备存储的大小接近200 MB(数百棵树中有大约90,000个节点),因此测试iPad设备上的每个树都非常耗时。这就是为什么我想问你们的建议。

对于我的所有尝试,我在scrollViewDidScroll:和scrollViewDidZoom:中放置了一个过滤器方法。我也用过滤器阻止了主线程,因为无论如何我都无法显示没有节点的内容。但也许有人在那个领域有一个想法?

因为Core Data模型中存在所有定位,所以我可能会使用NSFetchRequest来进行过滤。这真的很快吗?我认为这不是一个非常优化的方法。

根据我的尝试,故障的托管对象似乎同时适合内存,但是一旦内容开始触发故障,对于较大的树可能会很棘手。循环遍历节点的NSSet并查看屏幕上应该有哪些项目是一个好主意吗?

还有其他技巧可以获得性能吗?你会看到我可以使用多线程来更快地获得显示集的方法,即使模型的上下文是在主线程上创建的吗?

感谢您的建议, EP。

1 个答案:

答案 0 :(得分:0)

具有讽刺意味的是,您的二叉树可以使用在二维中完成的Binary Space Partitioning进行划分,因此渲染速度非常快,并且需要进行大量的检查。