旧iOS设备上的快速双线性插值

时间:2012-10-20 19:59:11

标签: ios performance interpolation

我有以下代码从2D矢量矩阵进行biliner插值,每个单元格都有向量的x和y值,函数接收k和l索引,告诉左下角最近的位置基质

// p[1]                     returns the interpolated values
// fieldLinePointsVerts     the raw data array of fieldNumHorizontalPoints x fieldNumVerticalPoints
//                          only fieldNumHorizontalPoints matters to determine the index to access the raw data
// k and l                  horizontal and vertical indices of the point just bellow p[0] in the raw data

void interpolate( vertex2d* p, vertex2d* fieldLinePointsVerts, int fieldNumHorizontalPoints, int k, int l ) {

    int index = (l * fieldNumHorizontalPoints + k) * 2;

    vertex2d p11;
    p11.x = fieldLinePointsVerts[index].x;
    p11.y = fieldLinePointsVerts[index].y;

    vertex2d q11;
    q11.x = fieldLinePointsVerts[index+1].x;
    q11.y = fieldLinePointsVerts[index+1].y;

    index = (l * fieldNumHorizontalPoints + k + 1) * 2;

    vertex2d q21;
    q21.x = fieldLinePointsVerts[index+1].x;
    q21.y = fieldLinePointsVerts[index+1].y;

    index = ( (l + 1) * fieldNumHorizontalPoints + k) * 2;

    vertex2d q12;
    q12.x = fieldLinePointsVerts[index+1].x;
    q12.y = fieldLinePointsVerts[index+1].y;

    index = ( (l + 1) * fieldNumHorizontalPoints + k + 1 ) * 2;

    vertex2d p22;
    p22.x = fieldLinePointsVerts[index].x;
    p22.y = fieldLinePointsVerts[index].y;

    vertex2d q22;
    q22.x = fieldLinePointsVerts[index+1].x;
    q22.y = fieldLinePointsVerts[index+1].y;

    float fx = 1.0 / (p22.x - p11.x);
    float fx1 = (p22.x - p[0].x) * fx;
    float fx2 = (p[0].x - p11.x) * fx;

    vertex2d r1;
    r1.x = fx1 * q11.x + fx2 * q21.x;
    r1.y = fx1 * q11.y + fx2 * q21.y;

    vertex2d r2;
    r2.x = fx1 * q12.x + fx2 * q22.x;
    r2.y = fx1 * q12.y + fx2 * q22.y;

    float fy = 1.0 / (p22.y - p11.y);
    float fy1 = (p22.y - p[0].y) * fy;
    float fy2 = (p[0].y - p11.y) * fy; 

    p[1].x = fy1 * r1.x + fy2 * r2.x;
    p[1].y = fy1 * r1.y + fy2 * r2.y;
}

目前,此代码需要在旧iOS设备中的每一帧运行,例如具有arm6处理器的设备

我从维基百科方程http://en.wikipedia.org/wiki/Bilinear_interpolation

中取得了数字子索引

我会对性能优化提出任何意见,甚至是普通的asm代码

1 个答案:

答案 0 :(得分:0)

如果每帧只运行一次,则此代码不应导致您的速度减慢。但是,如果它每帧运行多次,很容易就可以。

我会使用分析器运行您的应用程序,以查看真正的性能问题所在。

这里有一些优化空间:a)某些索引计算可以被分解并在后续计算中重复使用),b)您可以将fieldLinePointsVerts数组解除引用一次并重新使用它,而不是索引每个指数两次......

但一般情况下这些事情都没有多大帮助,除非每帧多次调用此函数。在这种情况下,每件小事都会有所帮助。