绘画应用程序与巨大的画布

时间:2012-04-20 19:31:32

标签: ios cocos2d-iphone

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

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

  1. 拥有64x64(或其他)" tile"绘制,然后滚动只需加载新的瓷砖。
  2. 记录所有用户笔划(点)和滚动计算指定区域,并仅使用屏幕大小的画布绘制它们。
  3. 如果这很重要,我使用cocos2d作为原型。

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:2)

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

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

这可能是最有效的方式。 64x64磁贴实际上太小了,效率很低,因为“绘制磁贴”调用会有大量的重复开销。

答案 2 :(得分:1)

Apples ScrollViewSuite中有一个平铺示例与绘图部分没有任何关系,但它可能会为您提供有关如何管理平铺部分内容的一些想法。

答案 3 :(得分:1)

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

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