在我的应用中,我必须将路径点存储到数组中,然后按照这些点进行操作。为了获得更顺畅的运行,我通常必须将路径转换为5k点。这意味着我必须存储10k浮点数 - 用于x的5k和用于y坐标的5k。现在这就是我正在做的事情:
1.在视图加载中,我用这样的10k数字初始化一个NSArray:
pathPoints=[NSArray arrayWithObjects:[NSNumber numberWithFloat:-134.8427], [NSNumber numberWithFloat:148.8433], ....... and so on];
然后我就这样读了:
int currentXIndex = .. ////
[[pathPoints objectAtIndex:currentXIndex] floatValue];
[[pathPoints objectAtIndex:currentXIndex + 1] floatValue];
正如你所看到的,每当我需要下一个位置时?我必须拆箱(将它从NSNumber转换为浮动)。我相信这会带来很大的表现。任何建议我如何能够以另一种更高效的方式做到这一点?
答案 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>
如果其他所有方法都失败了,请通过隐藏CGPoint
和malloc
调用隐藏在一个漂亮的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)