Я работаю с графиком данных акселерометра и пытаюсь исправить гравитацию. Для этого я получаю вектор ускорения в сферических координатах, уменьшаю радиус на 1 г и конвертирую обратно в декартову. Этот метод вызывается по таймеру каждые 0,03 секунды:
//poll accleration
ThreeAxisAcceleration current = self.accelerationData;
//math to correct for gravity:
float radius = sqrt(pow(current.x, 2) + pow(current.y, 2) + pow(current.z, 2));
float theta = atan2(current.y, current.x);
float phi = acos(current.z/radius);
//NSLog(@"SPHERICAL--- RADIUS: %.2f -- THETA: %.2f -- PHI: %.2f", radius, theta, phi);
radius = radius - 1.0;
float newX = radius * cos(theta) * sin(phi);
float newY = radius * sin(theta) * sin(phi);
float newZ = radius * cos(phi);
current = (ThreeAxisAcceleration){newX, newY, newZ};
//end math
NSValue *arrayVal = [NSValue value:¤t withObjCType:@encode(ThreeAxisAcceleration)];
if ([_dataHistoryBuffer count] > self.bounds.size.width) {
[_dataHistoryBuffer removeObjectAtIndex:0];
}
[_dataHistoryBuffer addObject:arrayVal];
[self setNeedsDisplay];
Каким-то образом, добавление гравитационной коррекции постепенно ужасно замедляет мой код. Мне трудно поверить, что эта математика может замедлить работу программы, но без нее она все равно может проходить через весь мой метод отображения, который довольно длительный. Есть ли варианты, которые я могу рассмотреть здесь, чтобы избежать этого? Я что-то упустил или математика так медленно? Я могу закомментировать теги // math и // end math и все будет в порядке.
Спасибо за любую помощь.
P.S. В случае, если это может иметь значение, кого это может заинтересовать, я программирую на какао, и этот метод принадлежит подклассу CALayer, с -drawInContext: осуществлено.