【发布时间】:2014-12-19 01:09:59
【问题描述】:
我正在开发各种 iOS 应用,我需要一个具有以下功能的界面:
我有一个可以双向滚动的滚动视图(覆盖大部分屏幕)
这个可滚动的视图包含很多矩形。这些矩形是难以处理的。用户可以修改它们、移动它们、创建和删除它们。所以理想情况下,它们都是 CALayers 或 UIViews。
问题是因为一次显示可能有 100 或 1000 个,CALayers 或 UIViews 可能效率不高。
滚动视图可能比屏幕大小本身大 10-20 倍。并完全覆盖了这些形状。因此,当用户滚动时,它不应该看到滚动完成后出现任何闪烁或形状。例如如果我使用 CATiledLayer 和用户滚动,您可以在滚动完成后看到绘制的内容。
平滑缩放。缩小尤其具有挑战性,因为需要在将变得可见的视图部分上绘制形状。此外,理想情况下,我宁愿不使用 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