【问题标题】:Empty UIView with minimal drawRect: overhead具有最小 drawRect 的空 UIView:开销
【发布时间】:2010-10-29 05:27:41
【问题描述】:

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

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

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

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

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

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

非常欢迎提供建议!谢谢,本约翰

【问题讨论】:

    标签: iphone uiview drawing compositing


    【解决方案1】:

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

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

    【讨论】:

    • 在这种情况下,我正在左右平移 3D 内容,但感谢您提供的链接和其他建议。你能提供一个关于视图的绘图和缓存行为的链接吗?那将非常有用。最后,我通过以下方式删除了三个视图中的两个: * 在另一个视图上托管我的图层, * 子类化滚动视图以获取触摸事件并将它们传递给委托。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多