gpt4 book ai didi

ios - 如何加快 UIImage 的绘制速度?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:53:27 26 4
gpt4 key购买 nike

我最近遇到一种情况,我必须在屏幕上绘制许多 2D 图像。有时需要绘制大约 200 个小图像。我曾经调用UIImage.draw(in:)用于该目的的方法,但很快了解到(通过分析)它相当慢。我可以通过缩小图像来加快速度,即使用正确的图像尺寸,而不是太大而必须按比例缩小的图像(这是我以后无论如何都会做的事情,但在开发过程中你想快速尝试一下。)这将它从大约 400 毫秒加速到 100 毫秒。还是太慢了。我还可以通过只绘制屏幕上实际发生变化的部分来使其更快。这有帮助,除非我必须绘制大部分屏幕。它仍然很慢:我的意思是,许多现代 3D 游戏可以在 iPhone SE 上每帧绘制超过 10000 个三角形,具有高清纹理和每秒 60 帧;所以我很确定有一种方法可以在 1 毫秒内将 100 张图像绘制到 iPhone 7 的屏幕上。

我考虑过在 OpenGL ES、Metal 或使用 SpriteKit 中重写 View ,但我想知道这是否有点矫枉过正。

对于我正在开发的游戏,我最多需要绘制 15 张不同的图像,每张图像都需要绘制多次。一次最多绘制 1000 张图像。图片的最大分辨率为120*120像素。

将图像绘制到屏幕的足够快的方法是什么?设置阶段可能需要 300 毫秒,并且会将所有图像数据复制到图形内存中,或者类似的东西。不过,快速替换 UIImage 将是最方便的。

最佳答案

正如您已经发现的那样,自己绘制 UIImage 对象并不是很快。我在以前的项目中有类似的要求,并进行了各种测试以尝试找到一种足够有效的方法来在屏幕上获得相当小的位图。虽然我绝不会声称知道该主题的全部真相,但我认为我有一些同样有趣的信息可以分享。

CALayer + 内容
我发现(正如 Palle 在他的简短评论中所说)将位图设置为其 contents 属性的 CALayer 是最快的方法。可能不如金属或 OpenGL 快,但比 draw 快很多。似乎当您向屏幕添加一个图层时,它最终会进入 GPU 内存,因此在屏幕上(或屏幕外)重新定位这些图层非常。您还可以在这些层上进行变换(3D),而不会受到任何损失。此外,据我了解,使用与 contents 相同的位图用于许多层实际上也会共享 GPU 上的内存。
如果您之前没有使用过图层,那么它相当简单。在 iOS 上,每个 UIView 都由一个 CALayer 支持,实际上这意味着您只需执行 view.layer 即可轻松访问图层。

创建位图支持层很简单,只需实例化它并设置内容,然后将它添加到 View Controller 的层(或任何你想要的地方)。

CALayer *layer = [CALayer layer];
layer.contents = [UIImage imageNamed:@"yourImage"].CGImage;
[self.view.layer addSublayer:layer];

关于使用图层的最后说明。默认情况下,所有 CALayer 对象都附加了动画以进行各种属性更改。例如,如果您想要为对象的移动设置动画,这会很方便,因为您所要做的就是设置新位置。 但是,如果您正在制作自己的风景,并且可能使用 CADisplayLink 制作动画,这可能不是您想要的。在这种情况下,您必须删除这些默认动画,否则它们会干扰您的更新。

从 CALayer 对象中移除隐式动画

- (void)removeAnimationFromLayer:(CALayer *)layer {
layer.actions = @{ @"contents": [NSNull null], @"position": [NSNull null],
@"frame": [NSNull null], @"opacity": [NSNull null],
@"bounds": [NSNull null], @"affineTransform": [NSNull null],
@"sublayerTransform": [NSNull null], @"transform": [NSNull null],
@"zPosition": [NSNull null], @"anchorPoint": [NSNull null],
@"cornerRadius": [NSNull null], @"sublayers": [NSNull null],
@"onLayout": [NSNull null], };
}

UIImageView
在正确使用时,图层几乎与 UIImageView 对象一样快(也许令人惊讶)。它们似乎也经过了高度优化,并且可以非常快速地在屏幕上移动。我的经验是,您应该尽量不要在 UIImageView 上重新分配图像,而应该为不同的图像使用单独的 UIImageView 对象。与层一样,您应该尝试仅对对象进行定位和变换以保持速度。
UIImageViewCALayer 之间的显着区别是 CALayer 仅用于输出,而 UIImageView 作为后代UIViewUIResponder 也处理输入。如果您需要,这可能是值得的权衡。另一个区别是 UIImageView 通常更容易使用。

我建议您自己做一些测试,看看您获得了什么样的性能。 UIImageView 可能会助您一臂之力!

CALayer contents property

关于ios - 如何加快 UIImage 的绘制速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845856/

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