Я играю с примером 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+ минуты с того момента, когда я на самом деле переместил устройство.
Вывод в консоли отладчика также показывает некоторую задержку, но это не слишком много. Это почти (но не совсем) в два раза медленнее, чем должно быть.
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;
Почему это исправить?
В связанной заметке, использую ли я этот код или «фиксированный» (accelCallCount как ivar) код, все это также замедляется, если я касаюсь экрана. Почему это может быть?