如何在ios中以良好的性能填充屏幕中的矩形区域

Posted

技术标签:

【中文标题】如何在ios中以良好的性能填充屏幕中的矩形区域【英文标题】:How to fil rectangular ares in the screen with good performance in ios 【发布时间】:2017-12-30 12:45:17 【问题描述】:

我正在制作简单的数字着色游戏(如沙盒、像素艺术、独角兽等),但遇到了一个问题。我尝试了各种在屏幕上填充矩形的方法。

    起初我创建了一个 backgroundView(一个简单的 UIView),它有 2500 个子视图(也是 UIViews),每个子视图都有size = (CGSize)50,50。添加了一个轻击手势识别器,检测应该填充哪个视图,并简单地更改该视图的背景颜色。但是当我将 backgroundView 放在 scrollView 中时,滚动和缩放很糟糕。

    尝试了同样的事情,但这次每个矩形都是CALayer。所以一个 backgroundView,它有 2500 个子层(每个子层都是 CALayer,大小为 50,50) - 缩放和滚动也很糟糕。

    厌倦了在UIView子类或CALayer子类中使用覆盖drawRect方法的自定义绘图(我正在用CGContext填充矩形),这次问题也是由缩放和滚动引起的。因为我需要在用户缩放时更新每个矩形,所以会触发很多 drawRect 调用,而且性能也很差。

有什么想法可以在屏幕上填充矩形吗?

【问题讨论】:

如果您不提供代码,我们将无法帮助您修复代码。 【参考方案1】:

说明

是的!向滚动视图添加 2,500 个微小的 UIView 会破坏性能。我不会使用这种方法,但如果你这样做,至少要确保所有子视图上的 subview_N.opaque = YES; 禁用合成。

您描述的CALayer 方法与UIView 方法基本相同,因为视图由CoreAnimation 层支持(请参阅-[UIView layer])。

在不降低帧速率的情况下,在 ios 上将数千个矩形绘制到屏幕上的最佳选择是使用以下方法之一:

    直接使用 CoreGraphics 绘图 直接使用 OpenGL 进行绘制(参与度极高) 使用布局引擎,例如UICollectionViewLayout

现在,您说您已尝试覆盖 -[UIView drawRect:],但您没有提供任何示例代码供我们检查。 如果您需要更具体的反馈,请使用方法 #3 的实际代码更新您的问题。 您创建的 drawRect 代码很可能有问题。 CoreGraphics 绝对可以在屏幕上绘制数千个正方形,而不会严重降低帧速率。

一个解决方案

我最近发布了一个项目YMTreeMap,它将数千个矩形绘制到UIView 中以创建金融树图。它在 Swift 中,而不是在 Objective-C 中,但基本概念是相同的。为此,我创建了一个自定义 UICollectionViewLayout,让 Apple 经过良好测试的 UICollectionView 类处理选择性绘图、缩放和动画的细节。

YMTreeMap 项目中的example UIViewController 代码展示了如何在屏幕上绘制数千个彩色矩形,前提是您只知道它们的位置和大小。这听起来像你在做什么。由于您还要滚动和缩放,因此此解决方案可能非常适合您,因为 UICollectionView 对这两者都有本机支持。

【讨论】:

以上是关于如何在ios中以良好的性能填充屏幕中的矩形区域的主要内容,如果未能解决你的问题,请参考以下文章

为啥CGContextSetFillColorWithColor在ios中的矩形区域填充错误的颜色

如何填充 UIBezierPath 中的重叠部分?

如何在 iOS 上删除 UIImage 中的矩形?

如何在 iOS 中裁剪非矩形区域

如何保存在pygame中代替矩形的所有像素?

当鼠标悬停在该特定区域上时,如何为列表中的一个矩形填充不同的颜色?