2016-07-15 21 views
0

所以我正在製作一款遊戲,並且有三件事情可能需要同時運行。與Android併發

showDamage - 顯示片刻(〜300毫秒),則消失的數(在一個TextView)。

延遲 - 對持有臨時提升。 TextView也在開始和結束時更新。這很長(〜10秒)。

冷卻 - 提供了在時間的用戶,直至剩餘的按鈕,可以再次按下文本反饋。

我做了一些瀏覽,並試圖阻止其他事件的處理程序後,來到一般意見,我應該使用ASyncs作爲一種簡單的方法來使併發線程,使UI的變化和做任務,而不會阻止主線程。所以我實現了所有3個Asyncs。然後我遇到了一個問題,他們會互相干擾 - showDamage中的數字會持續超過300毫秒,臨時效果將變爲永久性的(post執行從未運行)。進一步的瀏覽表明,默認情況下,Android的池大小爲5,因此我只能運行5個Asyncs。使用MyASync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,...)會有所幫助,但它提供的並行性不是併發性。

我已經使用了CountdownTimer用於冷卻和似乎已經停止發行與臨時性的效果,成爲永久的,但是從showDamage的TextViews如果有足夠多的垃圾郵件仍然掛起。有沒有解決這個問題,是否有任何嘗試,我可能不正確地實施?

回答

0

你不應該有你要更新的每個組件單獨異步任務。在遊戲環境中,聽起來你很難實現遊戲循環/引擎的體系結構。

您可以使用一個線程,這可能是一個合適的Thread而不是AsyncTask,由於它的壽命長。這個想法是,你有一個單線程運行的遊戲期間循環過程數據和更新用戶界面。

在這些資源的例子可能是矯枉過正,因爲它們直接繪製,而不是採用了android用戶界面,但他們可能對於理解結構很有幫助。在你的情況下,你會想要確保你持有對你的TextView和其他元素的引用(而不是每個時間的findById)以提高效率。

Game loops, explained in incremental complexity

Long read on game loops from Game Programming Patterns textbook

Android game loop using canvas

我發現this stackoverflow answer以及this stackoverflow answer有用的理解Android中的不同的併發選項,但我想你會發現遊戲引擎的資源更加有用。