NSView 的 addSubview 方法天生就慢吗? (可可 OSX)

Posted

技术标签:

【中文标题】NSView 的 addSubview 方法天生就慢吗? (可可 OSX)【英文标题】:Is the method addSubview of NSView inherently slow? (Cocoa OSX) 【发布时间】:2010-03-12 19:50:41 【问题描述】:

我正在尝试加快加载大型项目时加载速度非常慢的 gui(gui 是组和子组的表示,由许多视图组成)。在此过程中,我查看了执行某些代码段需要多长时间,我发现大多数情况下调用 addsubview 需要 10 到 20 毫秒。我正在查看的子视图是一个披露按钮。我想知道这种方法是否天生就很慢,还是他们的其他一些因素在这里起作用?添加子视图所需的时间取决于子视图的复杂性还是不是一个因素?另外,是否有其他方法可用于添加可能更快的子视图?

【问题讨论】:

【参考方案1】:

你可以试试 -setSubviews: 它接受一个子视图数组。这可能比自己多次调用 -addSubview: 更快。

否则,-addSubview: 和 -addSubview:positioned:relativeTo: 是插入子视图的唯一其他方法。

不过,我很好奇,为什么单个子视图要慢 10 到 20 毫秒? 您要添加多少个子视图?

可能有一种使用 NSCell 的替代设计可能更快,但如果不了解有关您要完成的任务的更多详细信息,则很难知道。

【讨论】:

我的 GUI 是由视图层次结构组成的,它基本上是在尝试模仿 itunes GUI 界面的功能。我的组包含一个披露按钮、一个图像和一个文本字段(我添加了图像和文本字段,以及调用addsbubview 的按钮),然后每个组都有一个子组,它有一个图像和一个文本字段但没有按钮。此外,每个组和项目都包含在有助于检测何时选择组或项目的视图中。当我最初加载一个项目时会出现我的问题,该项目可能由许多组组成,每个组包含许多项目。 我相信您需要重新考虑您的实施。使用超过数百个单独的视图不会很好地工作。它会很慢。我建议如下: (1) 拿起 Aaron Hillegass 的“Cocoa Programming for Mac OS X (Third Edition)”的副本,并阅读自定义视图一章中的“For the More Curious: Cells”一节。这将为您简要解释细胞背后的动机。 (2) 拿起 Erik Buck 和 Donald Yacktman 的《Cocoa Design Patterns》,阅读 Flyweight 章节。我还建议阅读本书的其余部分。【参考方案2】:

重新排列视图层次结构并不是您通常会经常做的事情。您可以隐藏和取消隐藏它们,而不是添加和删除子视图。

【讨论】:

我实际上并没有删除和添加子视图,而是隐藏它们,然后像​​您描述的那样取消隐藏它们。当我最初加载我的 GUI 时添加多个子视图时,速度会变慢。当您一次只添加一项时,gui 可以正常工作。

以上是关于NSView 的 addSubview 方法天生就慢吗? (可可 OSX)的主要内容,如果未能解决你的问题,请参考以下文章

没有人天生就会Linux

Windows 上的系统调用天生就比 Linux 慢吗?

天生就慢的DOM如何优化?

没有人天生就会Linux

当 Node.js 在内部仍然依赖于 Threads 时,它如何天生就更快?

人天生就会除法,宾大最新研究:儿童啥都不学也能算出来