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