Всегда ли ключевые кадры в CAKeyframeAnimation всегда попадают точно? - PullRequest
2 голосов
/ 20 мая 2011

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

1 Ответ

3 голосов
/ 21 мая 2011

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

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, я могу сказать вам, что любой код, который ожидает точные значения, будет по своей природе "хрупким".Это не означает, что вы не сможете получить точные значения, возможно, но это будет во многом зависеть от входных данных.

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

...