2

この単純なCATiledLayerの例をご覧くださいhttps://github.com/seanhess/CATiledLayer-Example

これは、次のような階層を持つ1つの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になるようにオーバーライドされています。

リンクされたコードを実行すると、同じrectを持つタイルが複数回要求されていることがわかります。これは、最初にコードを実行したときとスクロールしたときの両方で発生します。

ブランチ「1列」に切り替えます。これはinitでのみ発生し、下にスクロールしたときには発生しません。

ブランチ「default-tile-size」に切り替えます-これはinitでのみ発生しますが、非常にまれです(発生する前に複数回実行する必要があります)

drawLayer:inContext:正しいデータを見つけて描画するコードを書き込もうとしています。それは高くつくかもしれません、そして私はそれを二度以上やりたくありません。

何が起こっているのか分かりますか?私は別の方法で何ができますか?

4

5 に答える 5

2

これはIOSのバグです。CPUがデュアルコアの場合に発生します。その場合、それぞれが各タイルを要求する2つのスレッドがあります。つまり、バグはシミュレーターとiPhone 4Sに存在しますが、他のiPhoneモデルには存在しません。デュアルコアiPadにも搭載されると思います。

私はこのバグをずっと前に(シミュレーターの場合)そして最近再び(iPhone 4Sの場合)Appleに報告しました。Appleは最近、IOS6でそれを解決したという印象を与えました。

于 2012-07-11T11:15:08.510 に答える
1

ここで非常によく解決されました:

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

問題は、(少なくとも私のテストでdrawRect:は)2つのスレッドで同時に呼び出されることです。ロギングすることで、コードの個々の行が2回実行されてから、次の行に進むことができます。次の行も2回実行されます。ロギングは、これは1つのスレッドが行を実行していて、別のスレッドが同じ行を実行しているためであることを示しています。その後、両方とも次の行に進みます。

これはそれが得るのと同じくらい厄介です。drawRect:解決策は、内部全体をdispatch_syncシリアルキューのにラップすることです。

于 2014-09-27T03:36:51.127 に答える
0

これは?によるものではありませんsetLevelsOfDetailBiasか?すべてを標準のままにすると、タイルは1回だけレンダリングされます(デバイスでのテスト)。しかし、levelofdetailbiasを2に設定すると、タイルが複数回読み込まれます。これは、デバイスがアイドル状態のときにCATiledLayerが追加の詳細レベルのキャッシュを開始するためだと思います。

于 2011-05-04T14:11:35.767 に答える
0

デバイスでコードを試しましたか?シミュレーターではこの動作が一貫して見られますが、iPad1では見られません。大きなタイル画像を表示しているアプリでこれを再試行しました。私のタイルサイズは256で、デバイスではdrawRect:メソッドが12回呼び出されています。これは、画面に表示されているタイルの数です。シミュレーターでは、メソッドは20〜23回呼び出され、最後の数タイルを除くすべてが2回描画されます。

于 2011-04-28T15:24:50.100 に答える
0

結局、答えはうまくいきませんでした。ただし、デリゲートメソッドにそのサイクルを描画したかどうかを認識させるのはかなり簡単です。

于 2011-11-09T00:31:38.093 に答える