0

我有以下代码从二维向量矩阵进行双线性插值,每个单元格都有向量的 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 代码

4

1 回答 1

0

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

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

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

但总的来说,这些东西不会有太大帮助,除非每帧调用这个函数很多很多次。在这种情况下,每一件小事都会有所帮助。

于 2012-11-21T19:44:51.797 回答