加速度計の処理に関連するパフォーマンスのニュアンスのいくつかを把握するために、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) コードを使用するかに関係なく、画面に触れると全体が遅くなります。それはなぜでしょうか?