2

我正在使用XML中定義的標準幻燈片動畫來爲片段過渡設置動畫效果。大多數這些片段包含ListViews(但不總是)。 90%的時間,動畫流暢,流暢。每過一段時間,都會出現口吃。檢查logcat的,有當口吃時總是一個GC發生的事情:Android片段過渡 - 在動畫過程中避免GC

D/dalvikvm(26619): GC_FOR_ALLOC freed 300K, 9% free 13820K/15044K, paused 40ms, total 40ms 

(這似乎不可思議,它覺得它需要GC只爲300 KB)

反正是有,以避免在一個是GC動畫(之前或之後都可以)。在動畫之前調用System.gc()並不是一個好選擇,特別是因爲不能保證垃圾收集什麼時候發生。還有其他建議嗎?

+0

我想你不能阻止GC運行。你可以做的是嘗試分配更少的對象。我相信2012年或2013年有來自Google IO的視頻,這個主題是針對遊戲開發者的 –

回答

3

你是問錯了問題...如果問題是,你的動畫是janky,那麼你應該問「我如何可以更深入地瞭解什麼是真正回事?」幾個GC_FOR_ALLOC日誌在你的logcat中沒有足夠的信息來分析這個問題。如果你的應用程序有時受到性能的影響,這不是因爲你忘記了撥打System.gc(),相信我。 :)

顯然,避免垃圾回收的最好方法是減少應用程序中的對象分配量......這是給定的。如果這些問題不明顯,可以使用DDMS中提供的「分配跟蹤器」來進一步分析這些問題。

我也推薦觀看這些視頻......他們是真的很好,讓你更深入地瞭解Android的圖形渲染管道的工作原理(Romain Guy和Chet Haase也很搞笑:P)。

最後,我建議您使用「設置 - >開發人員選項」中的工具來獲得您的優勢。請查看Romain Guy的this blog post以獲取更多信息(請注意,該帖子有點過時了......從4.3開始,這些工具變得更容易處理......他們談論了這些工具在「 Android圖形性能「視頻鏈接)。如果您的目標是讓您的動畫等於或低於60fps,Systrace和/或配置文件GPU渲染特別有用。

+2

4.3中的systrace的一個好處是您可以添加「dalvik」標籤以查看蹤跡中表示的GC和線程暫停。 – fadden