2016-07-15 15 views
0

私はゲームを作っており、同時に実行する必要がある可能性のある3つのことがあります。Androidとの並行性

showDamage - 短い瞬間(〜300ミリ秒)の数値をTextViewで表示してから消えます。

遅延 - 一時的なブーストを保持します。 TextViewも最初と最後に更新されます。これは長いです(約10秒)。

クールダウン - ボタンをもう一度押すまでの残り時間をテキストでフィードバックします。

私はいくつかのブラウジングを行い、他のイベントをブロックするハンドラを試した後、UIを変更してタスクをブロックすることなく並行スレッドを作成する簡単な方法としてASyncを使用する必要があります。メインスレッド。だから私は非同期として3つすべてを実装しました。その後私はshowDamageからの数字が300msを超えてぶら下がり、一時的な影響は永久になりました(postExecutionは決して実行されませんでした)。さらに閲覧すると、デフォルトでAndroidにはプールサイズが5であることが示唆されています。したがって、私は5つの非同期しか実行できませんでした。 MyASync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR、...)を使用すると少しは助けられますが、並行処理ではなく並行処理が提供されます。

私は、クールダウンのためにCountdownTimerを使用しました。一時的な効果が永続的になると問題が停止したようですが、showDamageのTextViewsはまだ十分にスパムされているとハングします。この問題を修正しましたか?おそらく私が間違って実装した試みはありますか?

答えて

0

更新しようとしているコンポーネントごとに個別の非同期タスクを持つべきではありません。ゲームのコンテキストでは、ゲームループ/エンジンのアーキテクチャを実装するのが難しいようです。

長寿であるため、AsyncTaskではなく、Threadという1つのスレッドを使用できます。このアイデアは、ゲーム中に1つのスレッドが実行され、データを処理してUIを更新するというものです。

これらのリソースの例は、Android UIを使用する代わりに直接描画しているため、過度の可能性がありますが、構造を理解するのに役立ちます。あなたの場合、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が役立ちます。