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