我正在使用 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)代码,如果我触摸屏幕,整个事情也会变慢。为什么会这样?