0

在我的应用程序中,我必须将路径点存储到一个数组中,然后遵循这些点。为了获得更顺畅的运行,我通常必须将路径转储到 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];

如您所见,每次我需要下一个位置时?我必须拆箱(将其从 NSNumber 转换为浮动)。我确信这需要大量的性能。有什么建议可以让我以另一种更高效的方式做到这一点吗?

4

4 回答 4

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()它)

于 2012-11-10T17:32:10.717 回答
1

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

如果这还不够,您可以将更多元素“捆绑”在一个包装器中。例如,如果您知道您的路径是以 32 个点为一组创建的,则可以存储包含 32 个CGPoint对象的数组NSData(使用[NSData dataWithBytes:.. length:..]方法)。当您需要在 index 处的点时,在 index fromi处获取一个组,从 处解包,然后在 at 处获取元素。i/32NSArrayNSDatai%32

如果其他一切都失败了,则通过隐藏对漂亮的 Objective C 接口的CGPoint调用malloc和在其后面创建一个表示结构数组的类。free

于 2012-11-10T17:31:53.913 回答
1

使用普通数组而不是 NSArray?

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

或者对于一个常量数组

float pathPoints [] = {-134.8427,148.8433, ... and so on};
于 2012-11-10T17:33:58.757 回答
0

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

有关 C 数组的信息:

用 C 调整数组大小

于 2012-11-10T19:59:40.943 回答