2

我正在开发另一个使用比屏幕大很多倍的画布的绘图应用程序。我需要一些关于如何做到这一点的建议/指导。

基本上我想要的是在这个大画布上滚动,只在可见区域绘制。我在想两种方法:

  1. 有 64x64(或其他)“图块”可供绘制,然后在滚动时加载新图块。
  2. 记录所有用户笔画(点)并滚动计算指定区域中的哪些笔画,并仅使用屏幕大小的画布绘制它们。

如果这很重要,我正在使用 cocos2d 作为原型。

4

4 回答 4

5

忘记 2000x200 的限制,我有一个开源项目,它绘制 18000 x 18000 NASA 图像。

我建议你把这个任务分成两部分。首先,滚动。正如 CodaFi 所建议的,当您滚动时,您将提供 CATiledLayers。每一个都将是您创建的 CGImageRef - 您真正巨大的画布的子图像。然后,您可以轻松支持放大和缩小。

第二部分是与用户交互以绘制或以其他方式影响画布。当用户停止滚动时,然后创建一个不透明的 UIView 子类,将其作为子视图添加到主视图,覆盖托管 CATiledLayers 的视图。在您需要显示此视图的那一刻,您使用适当的信息填充它,以便它可以正确绘制较大画布的那部分(例如在某个颜色的这一点上画一个圆圈等)。

您将使用此覆盖视图的 drawRect: 方法进行绘图。因此,当用户采取更改视图的操作时,您可以根据需要执行“setDisplayInRect:”来强制 iOS 调用您的 drawRect:。

当用户决定滚动时,您需要使用用户所做的任何更改来更新您的大画布模型,然后移除不透明的覆盖,并让 CATiledLayers 绘制大图像的适当部分。这种过渡可能是避免视觉故障的过程中最棘手的部分。

假设您有大量用于画布的对象定义。当您需要为图块创建 CGImageRef 时,您可以扫描它以寻找对象框架和图块框架之间的重叠,然后才绘制该图块所需的那些项目。

于 2012-07-15T15:20:46.417 回答
2

许多移动设备不支持超过 2048x2048 的纹理。所以我会推荐:

  • 用 2048x2048 的大瓷砖制作您的大表面
  • 仅将当前可见图块的可见部分绘制到屏幕上
  • 您将需要每帧最多绘制 4 个图块,以防用户滚动到四个图块的一角,但如果只有一个可见图块,请确保不要绘制任何额外内容。

这可能是最有效的方式。64x64 瓦片真的太小了,而且效率很低,因为“绘制瓦片”调用会产生很大的重复开销。

于 2012-07-12T11:31:24.260 回答
1

Apples ScrollViewSuite中有一个平铺示例与绘图部分没有任何关系,但它可能会给您一些关于如何管理事物平铺部分的想法。

于 2012-07-09T19:06:10.993 回答
1

您可以使用 CATiledLayer。见 WWDC2010 会议 104

但是对于 cocos2d,它可能不起作用。

于 2012-07-13T06:00:01.593 回答