【问题标题】:Vector Math Functions for S-CurveS 曲线的向量数学函数
【发布时间】:2013-11-30 13:49:21
【问题描述】:

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

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

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

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

其中 firstControlPoint 等于 0.0,secondControlPoint 等于 1.0。

【问题讨论】:

    标签: objective-c math vector curve


    【解决方案1】:

    您可能对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 编程完全不同。如果你可以在某个点插入一个内在函数并让它运行得更快,那么编译器已经做到了(事实上它确实做到了)。

    • 如果您在进行浮点数学运算,并且只需要结果“几乎完全正确且非常适合绘图和动画”,而不是“根据 IEEE 规则完全正确且可重现”,那么您应该转向关于快速数学。最简单的方法是将编译器优化从“Fastest, Smallest”切换到“Fastest, Aggressive Optimizations”。很难想象这不是 iOS 应用程序的正确设置,而且它几乎总是 Mac 应用程序的正确设置。此设置还会打开额外的矢量化,这可以对您的循环产生很大影响。

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

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

    对于其中的一些实践示例,您可能会发现 iOS Pushing the Limits 中的 CurvyText 示例很有用。它计算 Bézier 点及其斜率以沿移动曲线执行文本布局。

    【讨论】:

      【解决方案2】:

      您的 S 曲线是贝塞尔曲线,因此您可以使用 De Casteljau's algorithm

      q0 = t * p0 + (1 - t) * p1
      q1 = t * p1 + (1 - t) * p2
      q2 = t * p2 + (1 - t) * p3
      r0 = t * q0 + (1 - t) * q1
      r1 = t * q1 + (1 - t) * q2
      s0 = t * r0 + (1 - t) * r1
      

      然后您可以使用 SSE/AVX-intrinsics 来计算具有单个指令流的多条曲线(2 -> 128 位,4 -> 256 位)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        相关资源
        最近更新 更多