gpt4 book ai didi

ios - 在 iOS 上,缓存绘制的屏幕图像并显示它的最快方法是什么?

转载 作者:可可西里 更新时间:2023-11-01 03:27:02 27 4
gpt4 key购买 nike

与其让 drawRect 每次重绘数千个点,我认为有几种方法可以“在屏幕上缓存图像”和任何额外的绘图,我们将添加到该图像,并仅显示drawRect 时的那个图像:

  1. 使用 BitmapContext 绘制位图,然后在 drawRect 中绘制此位图。

  2. 使用CGLayer 并在drawRect 中绘制CGLayer,这可能比方法1 更快,因为此图像已缓存在显卡中(它不会计入 iOS 上“内存警告”的 RAM 使用量?)

  3. 绘制到 CGImage,并使用 View 层:view.layer.contents = (id) cgimage;

所以好像有3个方法,我觉得方法(3)中的CALayer只能用一个CGImage来实现。 CALayer 本身不能缓存屏幕图像,不像 (2) 中的 CGLayer

方法 (2) 是这三种方法中最快的吗?还有其他方法可以做到这一点吗?我实际上计划制作一些屏幕图像的动画(循环播放其中的 5 或 6 张),并将尝试使用 CADisplayLink 来尝试 60fps 的最高帧速率。方法 (1)、(2) 或 (3) 中的任何一种是否会使用显卡中的内存,因此不使用 RAM,因此也不太可能从 iOS 收到内存警告?

最佳答案

根据您提出的最后几个问题,您似乎完全混淆了 CGLayers 和 CALayers。它们是不同的概念,彼此之间并没有真正的联系。 CGLayer 是一种 Core Graphics 构造,它有助于在 Core Graphics 上下文的 Canvas 内重复呈现内容,并且被限制在单个 View 、位图或 PDF 上下文中。我很少需要使用 CGLayer。

CALayer 是一个核心动画层,iOS 中的每个 UIView 都有一个支持层(在 Mac 上支持层支持的 NSViews)。你在 iOS 上一直要处理这些,因为它们是 UI 架构的基本组成部分。每个 UIView 实际上是 CALayer 的轻量级包装器,而每个 CALayer 又是 GPU 上纹理四边形的有效包装器。

在屏幕上显示 UIView 时,第一次需要渲染内容(或触发完全重绘时)Core Graphics 用于绘制线、弧和其他矢量绘图(有时包括光栅位图,以及) 并将它们栅格化为位图。然后通过您的 CALayer 将此位图上传并缓存在 GPU 上。

对于界面的变化,比如 View 被左右移动、旋转、缩放等,这些 View 或图层不需要重新绘制,这是一个昂贵的过程。相反,它们只是在 GPU 上进行转换并在新位置合成。这就是在整个 iOS 界面中看到流畅的动画和滚动的原因。

因此,如果您想获得最佳性能,您将希望避免使用 Core Graphics 重绘任何内容。在 CALayers 或 UIViews 中缓存场景的哪些部分。想一想旧式动画如何使用 cels 来包含他们将移动的场景部分,而不是让动画师重新绘制场景中的每一个变化。

您可以轻松获得数百个 CALayer,以便在现代 iOS 设备上流畅地围绕屏幕制作动画。但是,如果您想为粒子系统之类的东西做数千个点,那么通过为此移动到 OpenGL ES 并使用 GL_POINTS 进行渲染,您将获得更好的服务。这将需要更多的代码来设置,但这可能是获得您所询问的“数千点”可接受性能的唯一方法。

关于ios - 在 iOS 上,缓存绘制的屏幕图像并显示它的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10776321/

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