需要一种更高效的方法将大量浮动数据存储到数组中并将其读回

时间:2012-11-10 17:26:07

标签: objective-c ios arrays

在我的应用中,我必须将路径点存储到数组中,然后按照这些点进行操作。为了获得更顺畅的运行,我通常必须将路径转换为5k点。这意味着我必须存储10k浮点数 - 用于x的5k和用于y坐标的5k。现在这就是我正在做的事情:

1.在视图加载中,我用这样的10k数字初始化一个NSArray:

pathPoints=[NSArray arrayWithObjects:[NSNumber numberWithFloat:-134.8427],  [NSNumber numberWithFloat:148.8433], ....... and so on];
  1. 然后我就这样读了:

    int currentXIndex = .. ////

    [[pathPoints objectAtIndex:currentXIndex] floatValue];

    [[pathPoints objectAtIndex:currentXIndex + 1] floatValue];

  2. 正如你所看到的,每当我需要下一个位置时?我必须拆箱(将它从NSNumber转换为浮动)。我相信这会带来很大的表现。任何建议我如何能够以另一种更高效的方式做到这一点?

4 个答案:

答案 0 :(得分:2)

对于一个简单的容器,我使用C数组并遍历指针。请记住,Objective C是C的超集,因此您可以在需要时随时获取所有内容。

修改;示例代码:

你不必存储所有号码'赤裸',struct没有任何开销:

typedef struct tCoords {
    float x, y;
} tCoords;

然后只需malloc()所需的尺寸:

arraySize = 5000;
tCoords *array = malloc(arraySize * sizeof(tCoords));

并像任何简单的数组一样迭代:

tCoords *end = array+arraySize;

for (tCoords *p = array; p<end; ++p) {
    float x = p->x;
    float y = p->y;
}

如果你不喜欢代码的“旧C”外观,很容易将所有这些封装在一个“拥有”数组的类中(处理后不要忘记free())< / p>

答案 1 :(得分:1)

使用[NSValue valueWithPOint:(CGPoint...)]方法将一对坐标作为一个 id 对象而不是两个坐标,可以合理地降低一半的包装量。这也应该减少存储对所需的内存。

如果这还不够,您可以在一个包装器中“捆绑”更多元素。例如,如果您知道路径是以32点为一组创建的,则可以存储包含在CGPoint中的32 NSData个对象的数组(使用[NSData dataWithBytes:.. length:..]方法)。如果您需要索引为i的点,请从i/32抓取索引为NSArray的论坛,从NSData展开,然后在i%32处取元素。< / p>

如果其他所有方法都失败了,请通过隐藏CGPointmalloc调用隐藏在一个漂亮的Objective C接口后面来创建一个表示free结构数组的类。

答案 2 :(得分:1)

使用普通数组而不是NSArray?

float *pathPoints;
pathPoints = new float[10000];
...
...
delete [] pathPoints;

或者是一个常数数组

float pathPoints [] = {-134.8427,148.8433, ... and so on};

答案 3 :(得分:0)

你可以使用C数组浮点数......

有关C数组的信息:

  

Resizing an array with C