如何在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中以良好的性能填充屏幕中的矩形区域的主要内容,如果未能解决你的问题,请参考以下文章