gpt4 book ai didi

iphone - drawRect 或不 drawRect(什么时候应该使用 drawRect/Core Graphics vs subviews/images,为什么?)

转载 作者:IT王子 更新时间:2023-10-29 07:27:19 27 4
gpt4 key购买 nike

为了澄清这个问题的目的:我知道如何使用 subview 和使用 drawRect 创建复杂的 View 。我试图完全理解何时以及为什么使用一个而不是另一个。

我也明白提前优化并在进行任何分析之前以更困难的方式做一些事情是没有意义的。考虑到我对这两种方法都很满意,现在真的想更深入地了解。

我的很多困惑来自于学习如何使表格 View 滚动性能真正平滑和快速。当然这个方法的原始出处来自author behind twitter适用于 iPhone(以前的推特)。 基本上它说要使表格滚动平滑,秘诀是不要使用 subview ,而是在一个自定义 uiview 中进行所有绘图。 从本质上讲,使用大量 subview 似乎会减慢渲染速度,因为它们有很多开销,并且不断在其父 View 上重新合成。

公平地说,这是在 3GS 非常新的时候写的,从那时起,iDevices 变得更快了。还在 this methodregularly suggestedinterwebs和其他地方的高性能表。事实上,这是 Apple's Table Sample Code 中的建议方法。 , 已在多个 WWDC 视频 ( Practical Drawing for iOS Developers ) 和许多 iOS programming books 中被建议.

甚至还有awesome looking tools设计图形并为它们生成 Core Graphics 代码。

所以一开始我相信“Core Graphics 存在是有原因的。它很快!”

但是一旦我想到“尽可能使用核心图形”的想法,我就开始发现 drawRect 通常是导致应用程序响应性差的原因,在内存方面非常昂贵,并且确实对 CPU 造成负担。基本上,我应该“Avoid overriding drawRect”(WWDC 2012 iOS App Performance: Graphics and Animations)

所以我想,就像所有事情一样,它很复杂。也许您可以帮助自己和其他人了解使用 drawRect 的时间和原因?

我看到了使用 Core Graphics 的几种明显情况:

  • 您有动态数据(Apple 的股票图表示例)
  • 您有一个灵活的 UI 元素,无法通过简单的可调整大小的图像来执行
  • 您正在创建一个动态图形,一旦渲染在多个地方使用

  • 我看到避免核心图形的情况:
  • 您的 View 属性需要单独设置动画
  • 您的 View 层次结构相对较小,因此任何使用 CG 的额外努力都不值得获得
  • 您想在不重绘整个 View 的情况下更新 View 的各个部分
  • 当父 View 大小改变时, subview 的布局需要更新

  • 所以请赐予你的知识。在什么情况下你会用到 drawRect/Core Graphics(也可以用 subview 来完成)?是什么因素导致你做出这个决定?如何/为什么推荐在一个自定义 View 中绘制用于平滑的表格单元格滚动,但 Apple 建议出于性能原因一般反对 drawRect?简单的背景图像怎么样(你什么时候用 CG 和使用可调整大小的 png 图像创建它们)?

    制作有值(value)的应用程序可能不需要深入了解这个主题,但我不喜欢在无法解释原因的情况下在技术之间进行选择。我的大脑生我的气。

    问题更新

    谢谢大家的信息。这里有一些澄清问题:
  • 如果您正在使用核心图形绘制某些内容,但可以使用 UIImageViews 和预渲染的 png 完成相同的事情,您是否应该始终走这条路?
  • 一个类似的问题:尤其是 badass tools like this ,什么时候应该考虑在核心图形中绘制界面元素? (可能当你的元素的显示是可变的。例如一个按钮有 20 种不同的颜色变化。还有其他情况吗?)
  • 鉴于我在下面的回答中的理解,是否可以通过在复杂的 UIView 渲染本身之后有效地捕获单元格的快照位图并在滚动和隐藏复杂 View 时显示它来获得与表格单元格相同的性能提升?显然,必须要解决一些问题。只是我有一个有趣的想法。
  • 最佳答案

    尽可能坚持使用 UIKit 和 subview 。您可以提高工作效率,并利用所有易于维护的 OO 机制。当您无法从 UIKit 中获得所需的性能时,请使用 Core Graphics,或者您知道尝试在 UIKit 中组合绘图效果会更复杂。

    一般的工作流程应该是用 subview 构建表 View 。使用 Instruments 来测量您的应用程序将支持的最旧硬件上的帧速率。如果您无法获得 60fps,请下拉至 CoreGraphics。当你这样做一段时间后,你就会意识到 UIKit 可能是在浪费时间。

    那么,为什么 Core Graphics 速度快?

    CoreGraphics 并不是很快。如果它一直被使用,你可能会变慢。它是一个丰富的绘图 API,它需要在 CPU 上完成它的工作,而不是将大量 UIKit 工作卸载到 GPU 上。如果您必须为在屏幕上移动的球设置动画,那么每秒 60 次在 View 上调用 setNeedsDisplay 将是一个糟糕的主意。因此,如果您的 View 的子组件需要单独设置动画,则每个组件都应该是一个单独的层。

    另一个问题是,当你不使用 drawRect 进行自定义绘图时,UIKit 可以优化库存 View ,因此 drawRect 是一个空操作,或者它可以通过合成走捷径。当你覆盖 drawRect 时,UIKit 必须走慢路径,因为它不知道你在做什么。

    在表格 View 单元格的情况下,这两个问题可以被好处所抵消。当 View 第一次出现在屏幕上时调用 drawRect 后,内容被缓存,滚动是由 GPU 执行的简单转换。因为您正在处理单个 View ,而不是复杂的层次结构,所以 UIKit 的 drawRect 优化变得不那么重要。因此瓶颈变成了您可以优化 Core Graphics 绘图的程度。

    只要有可能,就使用 UIKit。做最简单的实现。简介。当有激励时,优化。

    关于iphone - drawRect 或不 drawRect(什么时候应该使用 drawRect/Core Graphics vs subviews/images,为什么?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659563/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com