objective-c - S 曲线的向量数学函数

标签 objective-c math vector curve

我需要一种比下面的方法更好的计算 S 曲线的方法。我使用它在 drawRect 方法中绘制 S 曲线,并计算音乐文件音量的缓入/缓出以进行淡入淡出。

我需要一种改进的方法来执行此操作,因为它在循环中被调用大约 100 次来计算曲线,并且是高度 CPU 密集型的。

我希望加速框架中的一个或几个向量数学函数可能会有所帮助,但我不知道从哪里开始。

3 * position * (1 - position) * (1 - position) * firstControlPoint + 3 *
position * position * (1 - position) * secondControlPoint +
position * position * position * 1.0;

其中第一个控制点等于 0.0,第二个控制点等于 1.0。

最佳答案

您可能对 Even Faster Bézier 上的这篇文章感兴趣,但是 100 次计算并不算很多。我在第一代 iPad 上每帧运行了数千次这样的计算。对于如此小的集合,you're unlikely to get much benefit from Accelerate (对于小数据集,Accelerate 可能比简单的 C 慢得多)。

不过,有几件事需要考虑:

  • 如果控制点不变,您应该能够预先计算所有位置的值并将其粘贴在表格中。这将显着提高性能。如果它们的变化频率小于您绘制的频率,那么每当输入发生变化时仍然值得预先计算表格。另外,请确保您计算这些值的频率没有超过您实际需要的频率(如果输入值变化很快,您可能需要等待输入稳定后再重新计算任何内容)。

  • 如果这是 NEON 设备(即 iPhone 或 iPad),intrinsics are almost never a win (随着 Clang 变得更好,这可能会改变,但这是我在 2012 年的发现)。如果你真的需要性能,手工编码的 NEON 绝对是一个胜利,但编程很头疼,所以我会先看看其他地方。汇编编程与 C 编程完全不同。如果您可以在某个点放入一个内在函数并使其运行得更快,那么编译器已经这样做了(事实上它确实这样做了)。

  • 如果您正在做 float 学,并且您只需要结果“对于绘图和动画来说几乎完全正确且完美”,而不是“根据 IEEE 规则完全正确且可重现”,那么您应该转向关于快速数学。最简单的方法是将编译器优化从“最快、最小”切换为“最快、积极优化”。很难想象这对于 iOS 应用程序来说不是正确的设置,但对于 Mac 应用程序来说它几乎总是正确的设置。此设置还会打开额外的矢量化,这可以使您的循环产生很大的差异。

  • 您绝对应该查看 WWDC 2013 中的使用 LLVM 优化您的代码。它涵盖了如何构建代码以使编译器为您提供最大帮助。您可能还想观看同一视频中的 Accelerate 框架,但 Accelerate 不太可能是解决此问题的正确工具。

  • 与其自己计算,不如考虑使用 CAPropertyAnimation具有自定义定时功能。这些可用于设置任何值;不仅仅是图层动画。要绘制曲线,请考虑使用 UIBezierPath而不是手动计算曲线。

有关实践中的一些示例,您可能会发现 CurvyText iOS Pushing the Limits 中的示例非常有用。它计算贝塞尔点及其斜率,以沿移动曲线执行文本布局。

关于objective-c - S 曲线的向量数学函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20030383/

相关文章:

algorithm - 如何找到 3D 空间中的点是否位于半球内?

c++ - 没有 math.h 的 sin & cos 函数

ios - 点击时如何在 UITableView 中拖动右侧的单元格,就像在 Snapchat 中一样?

objective-c - 将字符串更改为数组并与内容交互

r - 平均方差优化

c++ - 为什么 C++ 用零初始化 std::vector 而不是 std::array?

c++ - 删除 vector 中的最后一个元素时出现段错误

c++ - 使用模板和 vector 时出现编译错误

ios - 获取 UISplitViewController 的 masterview Controller 的显示隐藏事件

ios - CoreData 一次又一次地向数据库中添加数据