2011-03-06 60 views
1

我想從某個特定的objective-c類中分配x個對象,使它們在內存中連續佈局。該平臺是iOS。在連續的內存塊中分配objective-c對象

我想要解決的實際問題是如何將這些x對象存儲在內存中,以便我可以用盡可能少的緩存未命中來對它們進行迭代。我正在考慮創建一個簡單的C風格的Objective-C對象數組,但是當我使用Obj *obj = [[object alloc] init];分配這樣一個對象並將其分配給數組中的索引時,我只是存儲指針,所以這顯然不起作用。

我該如何做到這一點?我試圖將面向數據的設計應用到我的iOS遊戲引擎,並且我相信用這種方式在內存中佈置對象會給我一個簡單的性能增益(我錯了嗎?)我目前的引擎只需要很少的調整。

+1

我們今天使用高級語言的部分原因是我們不必處理這樣的事情。是否有一個特別的原因讓你擔心Cocoa集合迭代中的緩存未命中? – 2011-03-06 15:38:53

+0

是的,我正在開發一款iOS遊戲,我想對我的遊戲引擎進行優化。 – Jacob 2011-03-06 16:23:39

+0

是的,但*爲什麼*?您是否分析了您的代碼並發現這會影響性能? – Jim 2011-03-06 17:45:08

回答

5

如果你真的想這樣做(不優化,除非你確定你所面臨的瓶頸),你將不得不重寫你的類+allocWithZone:方法。我建議你閱讀Mike Ash最近的精彩文章Custom Object Allocators in Objective-C。從它引用:

一個Objective-C的對象僅僅是一個具有大小合適的存儲器塊,並用設定在該對象的類以指向第一指針尺寸塊。因此,自定義分配器需要返回一個指向正確大小的內存塊的指針,並且類正確填寫。

所以,你可以先分配大量的內存(有calloc()),然後你的allocWithZone:方法能夠在正確的位置保留在這大塊的內存空間。

1

如果您擔心性能會影響到分析緩存未命中的情況,那麼您最好只用最小的Objective C層編寫代碼。但這是必要的嗎?你有沒有分析你的代碼,並確定緩存未命中會減慢你的代碼?

如果你認真對待手動分配內存,你會想看看Memory Allocation Techniques

1

這聽起來更像是你應該使用C/C++作爲遊戲引擎,在頂部使用Objective-C的單板來使其易於使用。

也就是說,假設您測量的性能問題實際上只能通過內存中對象的連續佈局來解決。