2012-11-10 15 views
0

在我的應用程序中,我必須將路徑點存儲到數組中,然後遵循這些要點。爲了獲得更平穩的運行,我通常必須將路徑轉儲爲5k點。這意味着我必須存儲10k浮點數 - x爲5k,y座標爲5k。現在,這是我在做什麼:需要更高性能的方式將大量浮點數據存儲到數組中並將其讀回

1.In認爲負載我初始化一個NSArray與10K的數字是這樣的:

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)。我相信這需要很多的表現。任何建議如何我可以做到另一個更高性能的方式?

回答

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()它在處置時)

+0

能否請你給我一點代碼樣本,以瞭解如何做到這一點。我試圖用純C的方式來做,但不幸的是不知道如何。 –

+0

當然,請參閱編輯。 – Javier

+0

非常感謝。 –

1

可以通過使用[NSValue valueWithPOint:(CGPoint...)]方法框一對座標爲一體id對象,而不是兩個在包裝合理便宜的半量減少。這也應該減少存儲對所需的內存。

如果這還不夠,可以在一個包裝中「捆綁」更多元素。例如,如果您知道您的路徑是按照32個點的組創建的,則可以存儲包含在NSData中的32 CGPoint對象的數組(使用[NSData dataWithBytes:.. length:..]方法)。當您需要索引i處的點時,請從NSArray處獲取指數爲i/32的組,從NSData解包,然後將元素作爲i%32

如果一切都失敗了,使一類通過隱藏的mallocfree一個非常漂亮的Objective C的接口後面的調用來表示CGPoint結構的數組。

+0

謝謝你的身體。一個非常好的主意。 –

1

使用普通數組而不是NSArray?

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

或爲常量數組

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

這種方法是否要求我將這個指針放在我將要使用它的地方?使用NSArray,我可以在另一個類中調用它,調用一個返回該數組並使用它的類方法。我想我不能發送一個C指針給一個方法,對嗎? –

+0

當然可以。一個指針只是一個變量。 – Javier

相關問題