2010-09-16 68 views
1

我正在爲iPhone應用程序製作圖形效果,該效果可以模擬從舊的demoscene日子開始的低分辨率等離子體效果。屏幕上有600個正方形,儘可能快地更新。因爲我使用的CoreGraphics(現在),我可以得到一個非常穩定的11FPS沒有凍結 -什麼讓NSArray訪問速度如此之慢?

但是當我嘗試添加一個簡單的NSArray查找時,iPhone以及模擬器每幾秒凍結幾秒鐘秒。我已經在儀器中運行了它,它說有一個泄漏 - 泄漏與NSAutoReleasePool有關,但這並沒有什麼幫助。 (我在每個更新幀開始時創建一個NSAutoReleasePool,並在最後抽取池。)

通過消除過程,我已經能夠將它縮小到一行,導致放緩。此行會爲每個600個精靈的每一幀更新:

//SLOOWWWNESS /LEAKING NSAUTORELEASEPOOL IS here (freezing every second or so) 
UIColor *color = [palette objectAtIndex:colorNum]; 

//BUT DOESNT HAPPEN HERE... (works at full speed) 
UIColor *color = [UIColor colorWithRed:0.25f green:0.25f blue:colorNum/15.0 alpha:1.0f]; 

...這裏的調色板是在精靈一個NSArray的屬性,包含我創建的UIColor對象的列表。這個UIColor對象數組只創建一次,當應用程序啓動時,所有精靈都使用相同的數組。

任何人有任何想法?

+0

你可以在這些調用的地方發佈更多代碼嗎?從數組中獲取對象應該很快,至少與創建一個新的UIColor對象一樣快 – kubi 2010-09-16 17:09:16

+0

嗨Kubi在下面看到,它畢竟是一個索引超出界限的錯誤。衛生署! – avance 2010-09-16 18:02:08

回答

1

什麼是colorNum?數組邊界之外是否會有一些瘋狂的價值?

調色板是一個「保留」屬性......調色板對象確實被保留了,對嗎?它是合成的,還是您實現了自己的getPalette方法?

+1

嗨Graham,的確 - 我在其他地方發現了一些關於stackoverflow的建議,在Xcode的運行菜單中打開了「停止對Objective-C的異常」,並且這是一個索引超出了你所建議的範圍,我認爲會導致它崩潰。我很驚訝Xcode並不總是在索引越界時崩潰....也許是因爲它只是一個結束而且它引用了nil? – avance 2010-09-16 17:35:13

相關問題