0

加速度計の処理に関連するパフォーマンスのニュアンスのいくつかを把握するために、GLGravity の例で遊んでいます。

問題のコードは次のとおりです。

- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{
    static int accelCallCount;
    accelCallCount++;
    if (accelCallCount % 100 == 0) {
        NSLog(@"accelCallCount:%d", accelCallCount);
    }

    //Use a basic low-pass filter to only keep the gravity in the accelerometer values
    accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0 - kFilteringFactor);
    accel[1] = acceleration.y * kFilteringFactor + accel[1] * (1.0 - kFilteringFactor);
    accel[2] = acceleration.z * kFilteringFactor + accel[2] * (1.0 - kFilteringFactor);

    //Update the accelerometer values for the view
    [glView setAccel:accel];
}

このコードは非常にゆっくりと実行されます。視覚的には、ティーポットの動きが非常に遅くなり、ますます遅くなることがわかります。最終的に、ティーポットの動きは、実際にデバイスを動かした時間から簡単に 2 分以上遅れます。

Debugger Console の出力にも多少の遅延が見られますが、それほど大きくはありません。ほぼ(完全ではありませんが)2倍遅くなります。

2009-11-27 02:18:58.874 GLGravity[419:207] accelCallCount:100
2009-11-27 02:19:00.507 GLGravity[419:207] accelCallCount:200
2009-11-27 02:19:02.174 GLGravity[419:207] accelCallCount:300

ただし、加速度計のコールバックは、ある種のキューに蓄積されているようです。そのため、最初はそれほど悪くないと思っていたものが、すぐに耐えられないほど遅くなります。

ただし、accelCallCount の宣言をヘッダー ファイルに移動し、インスタンス var として宣言すると、この問題はなくなります。

int accelCallCount;

なぜこれが修正されるのですか?

関連する注意事項として、このコードを使用するか、「固定」(ivar としての accelCallCount) コードを使用するかに関係なく、画面に触れると全体が遅くなります。それはなぜでしょうか?

4

2 に答える 2

1

加速度計の周波数を下げます。

50.0 Hz に下げると、加速更新イベントの発生が停止したため、レンダリング速度が向上しました。50hz でアプリは完璧に動作します (iPhone は 100hz でレンダリングできません)。

#define kAccelerometerFrequency     50.0 // Hz
于 2010-01-05T17:49:36.457 に答える
0

多くのイベントが発生し、それらはすべて現在、メイン スレッドのデリゲート メソッド自体で処理されています。glView へのメッセージも高価な場合、システムはそれを処理し、着信イベントがキューに入れられます。

オプションとして、デリゲート呼び出しでイベントをバッチ処理し、定期的に処理して要約結果を取得し、表示を更新することができます。これにより、メイン スレッドがタッチ イベントを処理する時間も確保されます。

したがって、たとえば、デリゲート メソッドの配列にイベントを追加し、コードをできるだけ少なくして (ヘッド インデックスとテール インデックスを使用してループする配列の事前割り当てブロックを作成します)、n 個のイベントごとにスレッドを切り離します。それらを処理し、glView の更新値を使用してメイン スレッドにポスト バックするようにします (または、必要に応じてセマフォでデータを保護し、定期的に処理を行うバックグラウンド スレッドを維持することをお勧めします)。

また、accelerometer オブジェクトに updateInterval を設定することもできますが、速度を落とす必要があるだけでしょうか?

インスタンスとメソッド static については...私の推測では、インスタンス var はオーバーヘッドなしで常にアクセスできますが、メソッド内の static はアクセスに比較的コストがかかります。しかし、それは注目すべきことであり、私も注意しなければならないことです.

お役に立てれば。

于 2009-11-27T11:54:35.463 に答える