10

これはシミュレーターの問題ではないかと思いますが、Retina 対応のアプリを既に提出しており、16 日までテストする方法がないため、もちろん心配しています。

非常に大きなマップを表示するために、アプリに CAtiledLayer を実装しました。マップのタイルはインターネットから取得されますが、キャッシュも取得されるため、通常、実際にはデバイスから直接読み込まれます。

iPad 1 と iPad2 では美しく動作します。タイルがインターネットから来ている場合でも、iPad 2 でレンダリングされていることはほとんどわかりません。

iPad シミュレーターでは美しく動作します。

私の問題は、iPad Retina シミュレーターです。視覚的には、問題ないように見えます。マップのサイズは適切で、データ オーバーレイを表示するために使用する別のレイヤーと一致していますが、読み込みが非常に遅いです。ほとんどの場合、スクロールを開始するまでタイルをまったくロードしません。その後、タイルをロードしているとき、おそらく 1 秒あたり 1 回実行され、ひどく見えます。

Retina 上で標準解像度の画面とは異なる動作をするコードはないので、これがシミュレーターの問題に過ぎないことを願っていますが、まだ心配です。

他の誰かが自分のアプリでこれを見たことがありますか?

4

4 に答える 4

14

タイル サイズを大きくするとうまくいきましたが、CATiledLayer の levelsOfDetailBias プロパティを調整すると、小さなタイルの作成に戻り、読み込みに時間がかかりました。ビューをズームインするとシャープに見える必要があるため、細部のバイアスをオフにすることは受け入れられませんでした。 /ios/samplecode/ZoomingPDFViewer/Listings/Classes_PDFScrollView_m.html- そして彼らの提案の 1 つは、タイル ビューの layoutSubviews メソッドをオーバーライドして、常に contentScaleFactor = 1 を設定することでした。これは、UIScrollView を使用していることを前提としています。iPad (第 3 世代) と iPad2 でこれをテストしましたが、どちらも非常にうまく機能しているようです。それが役立つことを願っています。

コード例 - UIView をサブクラス化し、ビューのバッキング レイヤーを CATiledLayer でオーバーライドすると仮定します -

     -(void)layoutSubviews{
        [super layoutSubviews];
        /* 
           EDIT: After some additional experimentation, 
           I Have found that you can modify this number to .5 but you need
           to check to make sure you are working on a 3rd gen iPad. This
           seems to improve performance even further.
        */

        // Check if app is running on iPad 3rd Gen otherwise set contentScaleFactor to 1
        self.contentScaleFactor = .5;
    }

次に、View ControllerがUIScrollViewDelegateとして設定されていると仮定します-

    -(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale{
        //do any other stuff you may need to do.
       [view setNeedsLayout];
    }
于 2012-03-20T12:47:15.730 に答える
4

すべてのTiledLayersのiPad3でのパフォーマンスは、iPad2よりも劣っています。これはGoogleMapsアプリでも確認できます。

ただし、CATiledLayerを使用するUIViewクラスに次の変更を追加すると、最高のパフォーマンスが得られます。

- (id)initWithFrame:(CGRect)frame tileSize:(CGSize)tileSize
{
    self = [super initWithFrame:frame];
    if(self)
    {
        CATiledLayer *animLayer = (CATiledLayer *) self.layer;
        animLayer.levelsOfDetail = 5;
        animLayer.levelsOfDetailBias = 3;
        animLayer.tileSize = tileSize;

        // adjustments for retina displays
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00)
        {
            animLayer.contentsScale = 1.0;
            self.contentScaleFactor = .5;
            animLayer.shouldRasterize = NO;
            animLayer.levelsOfDetailBias ++;
        }
    }
    return self;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] == YES && [[UIScreen mainScreen] scale] == 2.00)
    {
        self.contentScaleFactor = .5;
    }
}

同じ結果を視覚的に実現する他のオプションがあります。つまり、tileSizeを大きくしますが、パフォーマンスは大幅に低下します。

于 2012-06-16T06:26:02.110 に答える
3

シミュレーターでの CAtiledLayer のパフォーマンスは、実際の新しい iPad でのパフォーマンスとはまったく異なります。実際のハードウェアでテストします。

CATiledLayer は、同じ設定を使用した場合でも、古いデバイスよりも新しい iPad でより多くのタイルを生成します。現時点では、(CALayer の contentScale プロパティを介して) コードがハイレゾ画面で実行されているかどうかを検出し、実行されている場合は、より大きなタイル サイズを設定します。

私はさらに実験を行い、重要な発見があればここに投稿します。

于 2012-03-18T20:22:59.883 に答える
0

これは単なるシミュレーターであり、ソフトウェアで高速化されている可能性が高いことを忘れないでください。一方、デバイスはハードウェアアクセラレーションされており、検索するターゲットGPUが少ないため、CoreAnimationは高度に最適化されています。

新しいiPad自体でパフォーマンスを確認するまで、シミュレーターの結果は気になりません。

于 2012-03-13T21:30:59.477 に答える