1

我有一个应用程序,它具有三个嵌套视图,这些视图在机械上很重要,但没有视觉元素:

  • 没有任何内容的 vanila UIView,仅用作 CALayers 的主机。
  • 一个 UIScrollView (查询它的来源并用于在 3d 中定位 CALayers:我真的只使用这个视图来忠实地复制滚动视图的“机制”),
  • 滚动视图的内容:一个 UIView 子类。它只是拾取触摸事件并将它们传递给委托 - 重要的是它的 UIResponder 机制。

承载 CALayers 的 UIView 是 UIImageView 的兄弟,它是绘制 CALayers 的背景图像。

我真的很想确保这些空的 UIView 没有任何与它们相关的绘图或合成开销(在时间或存储上),或者如果这不可能,则尽可能少地获得这个开销,并理解它我也许可以决定是否应该尝试不同的方法。

在界面生成器中,我已将所有视图设置为在绘制之前不清除它们的上下文。我没有将它们设置为不透明,因为它们绝对不是不透明的——它们是完全透明的。我发现我需要给滚动视图内容一个透明的清晰颜色(再次在 IB 中通过将背景颜色的不透明度设置为零),这表明它正在被绘制,这是我不想要的。

所以,简而言之,我不太了解什么是被绘制的,什么不是被绘制的(有人知道像 Quartz Debug for iPhone / 模拟器这样的工具吗?),或者如何阻止事情被绘制。

建议将非常受欢迎!谢谢,本约翰

4

2 回答 2

1

除了我不能说的 UIScrollView 之外,除非您手动调用 setNeedsDisplay 或将其图层的 needsDisplayOnBoundsChange 属性设置为 YES,否则您的其他视图不应该有太多的绘制开销。视图绘制一次并将其图层缓存在 GPU 上。重绘很昂贵,但只有当您通过我上面描述的方式手动触发它时才会发生这种情况。这些视图和层将使用内存,因此这是一个问题,尤其是当封闭视图变得非常大时(尤其是在 2048 x 2048 纹理限制大小附近)。不幸的是,您对此无能为力。

作为建议,如果您所做的只是在 3-D 中旋转和缩放图层,我可能会建议您查看我为使用 Core Animation 在 iPhone 上进行 3-D 旋转和缩放而编写的一些示例代码. 它基于Bill Dudney 编写的代码,其中触摸事件被处理为单点触摸移动和两指捏合手势,然后用于操作 3-D 图层。这可以通过消除对 UIScrollView 和您的自定义内容视图的需要来简化您的代码。

于 2009-05-27T13:33:02.220 回答
0

实际上,您可以使用带有 Core Animation 工具的 Instruments 来查看正在绘制的内容(请务必在退出之前禁用闪烁,因为它是您设备上的全局设置)。

于 2009-12-14T01:05:53.417 回答