【问题标题】:How to fil rectangular ares in the screen with good performance in ios如何在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 调用,而且性能也很差。
有什么想法可以在屏幕上填充矩形吗?
【问题讨论】:
标签:
ios
objective-c
uiview
drawing
calayer
【解决方案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 对这两者都有本机支持。