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

Objective c 需要一种更高效的方法将大量浮点存储到数组中并将其读回,objective-c,ios,arrays,Objective C,Ios,Arrays,在我的应用程序中,我必须将路径点存储到数组中,然后跟踪这些点。为了跑得更平稳,我通常必须把一条路倒进5公里的点。这意味着我必须存储10k浮点值,x坐标为5k,y坐标为5k。现在我正在做的就是: 1.在视图load中,我使用以下10k数字初始化NSArray: pathPoints=[NSArray arrayWithObjects:[NSNumber numberWithFloat:-134.8427], [NSNumber numberWithFloat:148.8433], .......

在我的应用程序中,我必须将路径点存储到数组中,然后跟踪这些点。为了跑得更平稳,我通常必须把一条路倒进5公里的点。这意味着我必须存储10k浮点值,x坐标为5k,y坐标为5k。现在我正在做的就是:

1.在视图load中,我使用以下10k数字初始化NSArray:

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

    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转换为float)。我相信这需要很大的表现。有什么建议我可以用另一种更高效的方法来实现吗?

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

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


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

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

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


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

    对于一个简单的容器,我会使用C数组并使用指针遍历。记住,目标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;
    }
    
    tCoords*end=array+arraySize;
    对于(tCoords*p=array;px;
    浮动y=p->y;
    }
    

    如果您不喜欢代码的“旧C”外观,那么很容易将所有这些封装在一个“拥有”数组的类中(不要忘记在释放时释放它)

    对于一个简单的容器,我会使用一个C数组并使用指针遍历。记住,目标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;
    }
    
    tCoords*end=array+arraySize;
    对于(tCoords*p=array;px;
    浮动y=p->y;
    }
    

    如果您不喜欢代码的“旧C”外观,那么很容易将所有这些封装在一个“拥有”数组的类中(不要忘记在释放时释放它)

    使用普通数组而不是NSArray

    float *pathPoints;
    pathPoints = new float[10000];
    ...
    ...
    delete [] pathPoints;
    
    或者对于常量数组

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

    是否使用普通数组而不是NSArray

    float *pathPoints;
    pathPoints = new float[10000];
    ...
    ...
    delete [] pathPoints;
    
    或者对于常量数组

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

    您可以使用一个浮点数的C数组

    有关C阵列的信息:


    您可以使用一个浮点数的C数组

    有关C阵列的信息:


    你能给我一些代码示例来说明我如何做到这一点吗?我曾尝试用C语言来实现,但不幸的是,我不知道如何实现。我会使用这种C数组方法。运行性能工具来查看瓶颈所在可能也很有用。在真正的iphone硬件上运行的代码上使用采样器,希望是3GS,or无论您计划支持哪种基本型号。iPhone 5s都非常快——太快了,无法计算出您的代码在许多情况下的行为。您能给我一些代码示例说明我如何做到这一点吗。我曾尝试用纯C的方式来做,但不幸的是不知道如何做。我会使用这种C数组方法。运行它可能也很有用性能工具可以了解你的瓶颈到底在哪里。在真正的iphone硬件上运行的代码上使用采样器,最好是3GS,或者任何你计划支持的基本型号。iphone 5s非常快——太快了,无法计算出你的代码在许多情况下的行为。这个方法是否需要我将这个指针放在s中ame我将在哪里使用它?使用NSArray我可以在另一个类中使用它,调用一个将返回该数组的类方法并使用它。我想我将无法向一个方法发送C指针,是吗?这个方法是否要求我将该指针放在我将使用它的同一个位置?使用NSArray我可以在另一个类中使用它,调用一个类m