0

私のアプリでは、パス ポイントを配列に格納してから、それらのポイントをたどる必要があります。よりスムーズに実行するには、通常、パスを 5k ポイントにダンプする必要があります。つまり、x 座標に 5k、y 座標に 5k の 10k の float を格納する必要があります。今、これは私がやっていることです:

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からfloatにキャストします)。そして、これにはかなりのパフォーマンスが必要だと確信しています。これを別のより効率的な方法で行う方法について何か提案はありますか?

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

NSArray の代わりにプレーン配列を使用しますか?

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

または定数配列の場合

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

[NSValue valueWithPOint:(CGPoint...)]メソッドを使用して座標のペアを2 つでidはなく 1 つのオブジェクトとしてボックス化することにより、ラッピングの量を合理的に安価に半分に減らすことができます。これにより、ペアを格納するために必要なメモリも削減されます。

これで十分でない場合は、より多くの要素を 1 つのラッパーにまとめて "バンドル" することができます。たとえば、パスがたとえば 32 個のポイントのグループで作成されていることがわかっている場合は、32 個のCGPointオブジェクトをラップした配列を格納できますNSData([NSData dataWithBytes:.. length:..]メソッドを使用)。index のポイントが必要な場合は、 indexiのグループを から取得し、i/32からNSArrayアンラップしてからNSData、 の要素を取得しi%32ます。

他のすべてが失敗した場合は、見栄えの良い Objective C インターフェイスの呼び出しとその背後にあるCGPoint呼び出しを非表示にして、構造体の配列を表すクラスを作成します。mallocfree

于 2012-11-10T17:31:53.913 に答える
0

フロートのC配列を使用できます...

Cアレイに関する情報:

Cを使用した配列のサイズ変更

于 2012-11-10T19:59:40.943 に答える