6

私のアプリケーションでは、iPhone 5でテーブルビューをスクロールしながら、コアアニメーションツールでfpsが60を超えるように取り組んでいます。GPUがタップアウトされておらず、速度を上げたものを実際に特定できませんでした。 (コメントアウトするか、ペン先のビューを削除します)。

数時間後、私はついに興味を持ち、同じセルを何度も吐き出すUITableViewControllerだけで新しいジャンクアプリケーションを開始しました。スクロールしながら1000行でこれをプロファイリングしましたが、それでも50代の高さでしか得られませんでした。

ここで何が欠けていますか?それが正しい方法はありません。これは、次のように表示されるまっすぐなテーブルよりも単純なものではありません。

テーブルビュー

ここに必要最低限​​のアプリをアップロードしました。

誰かが私が狂っていないことを確認できますか?

アップデート

iPhoneで取得できる最大値は60fpsですか?コアアニメーションはそれよりも速くなるでしょうか?

4

3 に答える 3

8

いくつかの考え:

  1. 私はこれに非常に敏感ですが、私の意見では、高い50代が優れています。

  2. コード(Instrumentsよりも正確)を使用してこれをベンチマークしたとき、iPhone5のプレーンテキストのテーブルビューは60.0fpsでロックされていたため、「50代の高さ」の数値には懐疑的です。次の場合、パフォーマンスが低下する可能性があります。

    • 機器を介して測定した場合;

    • デバッグビルドでテストを行いました。また

    • デバイス自体からアプリを起動するのではなく、Xcodeからアプリを起動しました。

  3. さまざまなフレームレートでUXの定性的な感覚を少し得るために、テーブルビューのバックグラウンドで画像の読み込みを行うことでパフォーマンスを徐々に低下させ、次にこの計算コストの高いプロセスをフォアグラウンドで実行することでさらに低下させました。厄介な詳細は割愛しますが、私の意見では、50年代半ば以降のフレームレートはすべて滑らかで滑らかでしたが、30に低下したため、フレームレートに気づき始めました(恐ろしいことではありませんでした)。 -40 fpsで、フレームレートが5〜15 fpsに低下すると、UXは完全に受け入れられなくなりました。自分で実験する必要がありますが、優れたデザインを使用すれば、50代後半にとどまることができるはずですが、50代半ばまではおそらく問題ありません。

  4. 計器はあなたに最も正確な測定を与えないかもしれません。私はそれをコードで測定するかもしれません。fpsLabel画面の予備の場所にを置きます。これは、1秒に1回更新されますCADisplayLink(または、カスタムの描画ルーチンがある場合は、そこで独自のfps計算を実行できます)。

    @interface ViewController () <UITableViewDataSource>
    
    @property (nonatomic) CFTimeInterval previousTimestamp;
    @property (nonatomic) NSInteger frameCount;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.previousTimestamp = CFAbsoluteTimeGetCurrent();
    
        CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
        [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    }
    
    - (void)handleDisplayLink:(CADisplayLink *)displayLink;
    {
        CFTimeInterval now = CFAbsoluteTimeGetCurrent();
        CFTimeInterval elapsed = now - self.previousTimestamp;
        self.frameCount++;
    
        if (elapsed > 1.0)
        {
            CGFloat fps = self.frameCount / elapsed;
            dispatch_async(dispatch_get_main_queue(), ^{
                self.fpsLabel.text = [NSString stringWithFormat:@"%.1f fps", fps];
            });
            self.previousTimestamp = now;
            self.frameCount = 0;
        }
    }
    

結論として、リリースビルド条件(つまり、コンピューターにリンクされていない、非デバッグビルドを実行している)での(コードを介した)より正確な測定の組み合わせで、iPhone5のテーブルビューのパフォーマンスが優れていることがわかると思います。 60fpsでロックイン。しかし、UIが50年代半ばまで下がったとしても、個人的にはそれでも問題ないと思います。

于 2013-02-14T07:13:11.350 に答える
0

60Hzを超えるアニメーションは、バッテリーの無駄になります。画面はそれより速く更新されず、目は60Hzを超える動きを区別できません。

于 2013-02-14T06:01:29.443 に答える
0

ですから、ここでの答えは、私の期待が間違っていたということだと思います。

私が読んだすべてのことは、あなたがあなたのアプリを60fpsにしたいと言っているようでした。それが実際に最大fpsであり、基本的に60fpsが確実に得られることはないことを私は知りませんでした。

インストルメントで他の多くのアプリをプロファイリングした後(アプリストアから他の人のアプリで実行できることに気づいていませんでした)、ほとんどのアプリ(最もよく構築されたアプリ)のテーブルビューは50年代の低から高に浮かんでいるようですスクロール。パスは私がこれまでに見つけた唯一の例外であり、59または60のいずれかでほとんどロックインします。これは、レンダリングしているすべてのもので信じられないほどです。

したがって、実際には50fps以上でかなり満足しているはずです。

于 2013-02-14T07:10:50.127 に答える