2011-06-02 54 views
1

我在一個單獨的線程上運行了一個循環,更新了東西的位置和旋轉,它運行在足夠多的FPS上並在主線程上調用setNeedsDisplay到底。問題是框​​架沒有足夠的時間調用drawRect,平均每秒得到10次drawRect(FPS)調用。我試着調用CATransaction flush,但它似乎沒有任何效果。使用核心圖形以30-60 fps手動移動/旋轉東西

我正在做的繪圖是CGContextShowTextAtPoint。這是非常多的,旋轉了上下文等。我有什麼方法可以讓它以更高的頻率畫出來?我不想使用openGL或cocos2d,因爲繪圖代碼工作得很好。

+0

難道是你的單獨線程佔用CPU,所以主循環(GUI線程)沒有足夠的時間來繪製? – 2011-06-04 09:59:25

回答

0

我結束了使用Cocos2d動畫旋轉等。看起來,使用Core Graphics手動移動這些FPS速率的東西太痛苦了,而且需要一些駭人聽聞的方法。

0

我建議在主線程上設置一個NSTimer,每1.0/301.0/60秒調用drawRect。

也許在單獨的線程上運行的代碼在整個系統上工作太辛苦。因此,主線程沒有足夠的計算資源來更新視圖。如果額外的數據幀從不顯示,那麼「足夠多的FPS」可能只是浪費計算。獨立線程可以在更新位置和旋轉後暫停並等待主線程在計算下一個位置和旋轉之前更新視圖嗎? NSTimer可以向第二個線程發送消息來計算下一幀的數據。

+0

設置一個NSTimer沒有給我足夠的每秒調用(這就是爲什麼我目前正在使用一個單獨的線程)。據我所知,實際上,這是一個相同的問題,因爲如果我沒有錯,drawRect被稱爲運行循環的每次迭代一次,NSTimer的回調也不能每次迭代調用一次以上運行循環...明確調用drawRect並不好。 – 2011-06-02 20:01:41

0

調用setNeedsDisplay不會立即重繪視圖,它只會將視圖標記爲髒,這會導致它在下一個繪製週期重繪。

我認爲使用setNeedsDisplay方法很難實現快速平滑的動畫。

您是否嘗試過使用核心動畫代替?

最後一個注意事項:如果你確實使用setNeedsDisplay,確保你總是從主線程調用它。