- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
与其让 drawRect
每次重绘数千个点,我认为有几种方法可以“在屏幕上缓存图像”和任何额外的绘图,我们将添加到该图像,并仅显示drawRect
时的那个图像:
使用 BitmapContext 绘制位图,然后在 drawRect
中绘制此位图。
使用CGLayer
并在drawRect
中绘制CGLayer
,这可能比方法1 更快,因为此图像已缓存在显卡中(它不会计入 iOS 上“内存警告”的 RAM 使用量?)
绘制到 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/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!