2013-01-23 45 views
2

我問過一個這個問題的線索here。我想知道是否推薦閱讀ui線程或遊戲線程中的Android資源(在res)文件夾中進行簡單的遊戲(基於月球着陸器樣本)。我在月球着陸器中看到他們在開始遊戲循環之前分配資源。但是,如果有大量資源,這並不能很好地擴展。我以前的問題的答案說,可以在後臺線程上讀取位圖等資源。現在我想知道這是否是正確的做事方式。在安卓遊戲中,你應該爲UI線程還是遊戲線程分配內存資源

另一種架構是隨時向ui線程發佈Runnable,然後分配資源。

垃圾收集是否發揮作用?我不確定GC運行哪個線程。但我的猜測是它運行在分配對象的線程上。

回答

1

我以前的問題的答案表示,可以在後臺線程上讀取像位圖等 資源。現在我想知道如果 這是做事的正確方法。

按照該文檔here

的BitmapFactory.decode *方法,在負載大的位圖 高效教訓,不應該在主UI線程上如果 源數據是執行所討論從磁盤或網絡位置(或者除內存以外的任何其他源)讀取。此數據加載所需的時間爲 不可預知,並取決於各種因素(從磁盤或網絡讀取的速度爲 ,圖像大小,CPU功率等)。如果其中一個 這些任務阻塞UI線程,則系統會將您的應用程序標記爲 無響應,並且用戶可以選擇關閉它(請參閱 設計響應能力以獲取更多信息)。

因此,您可以使用一個單獨的線程來加載上述條件的資源。

我認爲這取決於您的需求和資源的規模和數量,即使還有其他一些事情要考慮。例如,如果您不希望應用用戶導航到下一個屏幕,直到您加載了所有資源,則使用線程可能會有所幫助。

垃圾收集在守護進程線程中工作。守護線程在後臺運行。 當對象有資格進行垃圾回收時,即當沒有可用的活動引用或內存變得太低時,垃圾回收就開始生效。使用此link瞭解如何使用跟蹤內存分配以及如何避免頻繁進行垃圾回收。

+0

這是一個很好的答案。根據該文檔,您顯然應該在後臺線程上使用解碼位圖。另一個鏈接非常適合解釋Java中的GC陷阱(我是一名C++程序員,所以GC有點不切實際,並且已經習慣了)。我在此保證不會在我的遊戲線程中分配短暫的對象。我想我也可以要求系統執行GC,有時我知道對我來說很方便,就像加載屏幕出現時一樣。感謝JJPA! – Nathan