用最小的drawRect清空UIView:开销

时间:2009-05-27 09:33:34

标签: iphone uiview drawing compositing

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

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

主持CALayers的UIView是UIImageView的兄弟,它是一个背景图像,用于绘制CALayers。

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

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

所以,简而言之,我不太了解什么是和不是被绘制(任何人都知道像Quartz Debug for iPhone / simulator这样的工具?),或者如何阻止绘制内容

建议非常欢迎!谢谢,Benjohn

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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