【问题标题】:Efficient way to draw many shapes on UIScrollView, scrollable and zoomable在 UIScrollView 上绘制许多形状、可滚动和可缩放的有效方法
【发布时间】:2014-12-19 01:09:59
【问题描述】:

我正在开发各种 iOS 应用,我需要一个具有以下功能的界面:

  1. 我有一个可以双向滚动的滚动视图(覆盖大部分屏幕)

  2. 这个可滚动的视图包含很多矩形。这些矩形是难以处理的。用户可以修改它们、移动它们、创建和删除它们。所以理想情况下,它们都是 CALayers 或 UIViews。

  3. 问题是因为一次显示可能有 100 或 1000 个,CALayers 或 UIViews 可能效率不高。

  4. 滚动视图可能比屏幕大小本身大 10-20 倍。并完全覆盖了这些形状。因此,当用户滚动时,它不应该看到滚动完成后出现任何闪烁或形状。例如如果我使用 CATiledLayer 和用户滚动,您可以在滚动完成后看到绘制的内容。

  5. 平滑缩放。缩小尤其具有挑战性,因为需要在将变得可见的视图部分上绘制形状。此外,理想情况下,我宁愿不使用 CGAffineTransform 之类的东西来执行缩放,我喜欢像素精确的缩放。

我尝试了各种方法,但即使在 iPhone 6 上我似乎也无法获得不错的帧速率。甚至尝试绘制每一帧,但 Core Graphics 太贵了,无法处理。是否有代码示例有人试图做类似的事情或开源库?我正在尝试不使用 OpenGL,我觉得这有点矫枉过正,但如果必须,我会尝试。仅供参考,我还没有 OpenGL 的经验。

Procreate for iPad 完美地完成了我想要做的事情,它反应灵敏,缩放精确到像素。我知道他们使用 OpenGL,而我没有制作绘图应用程序。我之所以提到它,是因为它表明我正在尝试做的事情是可能的。

【问题讨论】:

  • 您能否在这些“矩形”及其内容上添加更多数据。它们只是带有颜色的字段还是有一些图形内容,例如图像、子视图或子矩形?你期望一些透明度吗?它们有圆角之类的奇怪形状吗?在某些情况下,即使是openGL也可能无法拯救你。
  • 它们是具有单一填充颜色的普通矩形。没有圆角、奇怪的形状、没有内容或子视图。这有点像在 GarageBand (iOS) 中打开 MIDI 片段进行编辑时所得到的。
  • 我创建了一个内容大小为 10kx10k 的全屏滚动视图,并在内容视图内的随机位置添加了 2000 个子视图,每个维度的大小为 200 到 400 点,颜色随机,并在 iPhone5 上运行它,只有一个完全缩小时的小滞后。这似乎是一个很大的数字。核心图形很可能比那慢,而且是个坏主意;平铺永远不会有更好的性能,只是可能会减少内存占用,但在您的情况下则不然。我想使用 openGL 应该会更快,但不要指望魔术会自行发生。
  • 为尝试而干杯。过去几天我一直在尝试使用 OpenGL 和 Metal,似乎需要做很多工作才能获得基础知识。但我承认,使用这些 API 进行的每帧渲染使其成为一个有吸引力的选择。话虽如此,我刚刚发现 CALayer 具有 drawsAsynchronously 属性。因此,我将了解如何将 CALayers 添加到仅可见区域并在它们离开屏幕时删除它们。希望它不会闪烁太多。
  • 您可以在 UIView 上通过隐藏它们甚至将它们从超级视图中移除来做到这一点。很抱歉让你失望了,但这样你不会获得太多的表现。问题在于,要绘制 N 个视图,您需要 N 个绘制调用(可以使用 openGL 进行优化)。然后对于屏幕上的每个视图,您都有与可见像素一样多的片段(很多),这可以使用 UIView 或 openGL 进行优化,但非常困难,因为您需要创建一个检测重叠和仅绘制子矩形。

标签: ios opengl-es uiscrollview core-graphics calayer


【解决方案1】:

我认为你需要从 UIKit 迁移到一些 2d 或 3d 引擎:

  • Cocos2D
  • 麻雀
  • 团结
  • 乌龙

【讨论】:

  • 在轻量级应用中使用游戏引擎肯定是大材小用。
猜你喜欢
  • 1970-01-01
  • 2014-12-20
  • 2022-11-06
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多