2

请看这个简单的 CATiledLayer 示例https://github.com/seanhess/CATiledLayer-Example

它由一个具有如下层次结构的 viewController 组成:

view: (frame = window size)
    scrollView: (frame = window size, content size = 200 x 4000)
        contentView: (frame = content size = 200 x 4000, tile size = 100 x 100)

内容视图的图层已被覆盖为 CATiledLayer。

如果您运行链接代码,您会看到多次请求具有相同矩形的图块。它在您第一次运行代码和滚动时都会发生。

切换到分支“单列” - 它只发生在 init 上,永远不会在您向下滚动时发生。

切换到分支“default-tile-size”——它只发生在 init 上,但很少发生(你必须在它发生之前多次运行它)

我正在尝试编写一些代码drawLayer:inContext:来定位正确的数据并绘制它。它可能很昂贵,我不想多次这样做。

知道发生了什么吗?我能做些什么不同的事情?

4

5 回答 5

2

这是IOS中的一个错误。当 CPU 是双核时会发生这种情况,在这种情况下,有两个线程分别请求每个 tile。这意味着该错误存在于模拟器和 iPhone 4S 上,但不存在于其他 iPhone 型号上。我认为它也将出现在双核 iPad 上。

我很久以前(针对模拟器)和最近(针对 iPhone 4S)向 Apple 报告了这个错误。苹果最近给人的印象是他们已经在 IOS 6 中解决了这个问题。

于 2012-07-11T11:15:08.510 回答
1

在这里很好地解决了:

https://stackoverflow.com/a/8783396/341994

问题是(至少在我的测试中)drawRect:在两个线程上同时调用。通过记录,我可以看到我的代码的各个行在我们继续执行下一行之前被执行了两次,这也被执行了两次!日志显示这是因为一个线程正在执行一行,然后另一个线程正在执行同一行 - 然后它们都继续下一行。

这是最讨厌的。解决方案是将整个内部包装drawRect:dispatch_sync一个串行队列中。

于 2014-09-27T03:36:51.127 回答
0

您是否在设备上尝试过您的代码?我一直在模拟器中看到这种行为,但在我的 iPad 1 上没有。我刚刚在一个显示大平铺图像的应用程序中再次尝试了这个。我的图块大小是 256,在设备上我的 drawRect: 方法被调用了 12 次,这是屏幕上的图块数量。在模拟器中,该方法被调用了 20 到 23 次,除了最后几个图块之外的所有图块都被绘制了两次。

于 2011-04-28T15:24:50.100 回答
0

最后,答案没有奏效。但是,让您的委托方法知道它是否已经绘制了该循环是相当简单的。

于 2011-11-09T00:31:38.093 回答
0

这不是因为setLevelsOfDetailBias吗?当我将所有内容保持标准时,瓷砖只会渲染一次(在设备上进行测试)。但是当我将 levelofdetailbias 设置为 2 时,瓷砖会被多次加载。我认为这是因为 CATiledLayer 只是在设备空闲时才开始缓存额外的细节级别。

于 2011-05-04T14:11:35.767 回答