• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:32:28 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

我曾想过用 OpenGL ES、Metal 或可能使用 SpriteKit 重写 View ,但我想知道这是否有点矫枉过正。

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

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



Best Answer-推荐答案


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

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

创建位图支持层很容易,只需实例化它并设置 contents,然后将其添加到 View Controller 的层(或任何您想要的位置)。

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

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

从 CALayer 对象中移除隐式动画

- (void)removeAnimationFromLayerCALayer *)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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap