как я могу сделать это уравнение быстрее - PullRequest
0 голосов
/ 27 января 2010

сейчас у меня в программе горлышко бутылки, которое я пытаюсь написать. я пытаюсь использовать жест щепотку, чтобы контролировать масштаб UIImage. это вычисление масштаба, который заставляет программу замедляться и становиться изменчивой. ниже приведено уравнение.

currentScale = (currentDistance / initialDistance) * scaleMod;

scaleMod - это то, чем всегда был текущий масштаб, когда пользователь убирал пальцы с экрана. поэтому в следующий раз, когда пользователь ущипнет старую шкалу, это, по сути, отправная точка нового действия масштабирования.

Ответы [ 6 ]

2 голосов
/ 27 января 2010

Для любого типа трех переменных этот расчет может быть легко выполнен миллионы раз в секунду с минимальным влиянием на производительность. Ваша проблема в другом месте.

2 голосов
/ 27 января 2010

1) Разве вы не можете рассчитать scaleMod / initialDistance один раз, когда currentDistance меняется. Таким образом, вы можете использовать только это значение, умноженное на currentDistance, что устраняет деление.

2) Убедитесь, что это действительно узкое место. Скорее всего, нет, если вы не делаете что-то действительно не так.

1 голос
/ 27 января 2010

Если вы устанавливаете scaleMod и initialDistance на степени 2, вы можете использовать сдвиги для более быстрого умножения и деления.

См. здесь для справки .

0 голосов
/ 28 января 2010

Проверьте, что InitialDistance! = 0 первым! :)

0 голосов
/ 27 января 2010

если вы выполняете вычисления с int (или другим целым числом), посмотрите, может ли он сделать это, используя точность с плавающей точкой. Деление с плавающей запятой происходит быстрее, чем целое число (меньше битов для деления, при условии, что ваш ЦП) имеет единицу с плавающей запятой).

также попробуйте вычленить деление как умножение на обратное значение.

0 голосов
/ 27 января 2010

Вы можете хранить scaleMod / initialDistance. Когда масштабирование активно (пальцы пользователя все еще находятся на экране), умножьте это значение на currentDistance по мере необходимости.

После того, как пользователь закончил зажимать, сохраните новое значение scaleMod / initialDistance для следующего зажима.

...