Всегда ли точно совпадают ключевые кадры в CAKeyframeAnimation?

Может ли кто-нибудь сказать мне, всегда ли гарантируется, что ключевые кадры в CAKeyframeAnimation будут поражены их точными значениями при запуске анимации? Или... они действуют только как направляющие для интерполяции? например Если я укажу, скажем, 3 точки на пути для какого-то произвольного свойства, чтобы следовать за ним — назовем его «позиция», — и я укажу время выполнения 0,3f секунды, в то время как (очевидно) точки 1 и 3 должны быть затронуты (поскольку они являются конечными точками) могу ли я гарантировать, что точка 2 будет оцениваться точно так, как указано в массиве ключевых кадров? Удивительно, но я не нашел ни одного документа, который дает адекватный ответ. Я спрашиваю об этом, потому что пишу синхронизатор звуковых эффектов OpenAL, который использует путь анимации ключевого кадра для запуска различных коротких звуков по его длине, и хотя большинство из них выполняются, время от времени некоторые этого не делают, и я не знаю если это моя логика неверна или мой код. Заранее спасибо.


person VectorVictor    schedule 20.05.2011    source источник
comment
Очень интересно! У нас похожая проблема. Вам с этим повезло? Любые советы о том, как синхронизировать звук с ключевыми кадрами, которыми вы хотели бы поделиться?   -  person Max MacLeod    schedule 27.05.2011


Ответы (1)


В общем, полагаться на «точность» значения с плавающей запятой, которое является результатом вычисления, чревато опасностью. Так, например, следующий код:

CGFloat x1 = some_function();
CGFloat x2 = some_other_function();
if(x1 == x2)
{
    // do something
}

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

Должен быть:

CGFloat x1 = some_function();
CGFloat x2 = some_other_function();
CGFloat tolerance = 0.1; // or some tolerance suitable for the calculation.
if(fabsf(x1 - x2) < tolerance)
{
    // do something
}

где допуск – это некоторое значение, подходящее для выполняемого расчета.

Итак, не зная внутренностей CAKeyframeAnimation, я могу сказать вам, что любой код, который ожидает точных значений, будет по своей сути «хрупким». Это не означает, что вы не получите точных значений, вы можете это сделать, но это будет сильно зависеть от входных данных.

Надеюсь, это поможет.

person idz    schedule 20.05.2011
comment
Спасибо idz! На самом деле я использовал допуск, но, возможно, мой уровень допусков все еще слишком жесткий. Однако вы дали мне пищу для размышлений о другом в том же наборе. Странная вещь в моем «Audimator» заключается в том, что запуск одной и той же анимации последовательно без какого-либо другого кода приводит к тому, что иногда проигрываются все звуки, а иногда один (даже не один и тот же) пропускается — но это никогда не происходит. терминальные звуки. Скоро я получу новый iPhone 4, поэтому посмотрю, проявится ли это явление на устройстве. Большое спасибо за вашу помощь. - person VectorVictor; 22.05.2011
comment
Я все еще изучаю, как работает этот форум, и спасибо за совет. Я вернусь и подтвержу свои предыдущие ответы. Еще раз спасибо за наводку! Снижение активности ключевых точек, по-видимому, является функцией загрузки ЦП. Если я запускаю свои тесты с кучей приложений, работающих вместе с моим тестом, ключевые точки пропускаются слева, справа и по центру и в произвольном порядке. Причиной может быть интеллектуальное отбрасывание кадров. - person VectorVictor; 31.05.2011
comment
@VectorVictor, не беспокойтесь, я сам здесь довольно новичок, поэтому еще не уверен во всех веревках. Я подозреваю, что вы можете быть правы насчет потери кадров. - person idz; 31.05.2011