Выполнение математических функций? - PullRequest
4 голосов
/ 06 октября 2009

Я работаю с графиком данных акселерометра и пытаюсь исправить гравитацию. Для этого я получаю вектор ускорения в сферических координатах, уменьшаю радиус на 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:&current 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: осуществлено.

Ответы [ 12 ]

0 голосов
/ 06 октября 2009

Кроме того, что другой комментатор использует плавающую точку (в отличие от двойных операторов), выполнение всего этого _dataHistoryBuffer будет причиной того, что убьет ваше приложение. Это увеличит объем памяти, как будто завтра не наступит, и, поскольку вы используете NSValue, все эти объекты будут добавлены в пул автоматического выпуска, что увеличит потребление памяти. Вам гораздо лучше избегать хранения списка значений, если он вам действительно не нужен - и если да, то найти более подходящий (читай: фиксированный размер, необъектный) механизм для их хранения. Даже круговой буфер структуры (например, массив из 10 структур, а затем счетчик, который делает i ++% 10 для индексации в нем) было бы лучше.

0 голосов
/ 06 октября 2009

Эти математические строки выглядят хорошо. Я не знаю достаточно Цели C, чтобы знать, что делает строка current = .... Может ли это быть выделением памяти в куче, которая не восстанавливается? Что произойдет, если вы просто закомментируете это? Наблюдали ли вы за выполнением процессов с помощью top, чтобы увидеть, начинает ли он затрачивать больше ресурсов процессора или памяти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...