2016-07-15 15 views
0

Also mache ich ein Spiel und habe drei Dinge, die möglicherweise gleichzeitig ausgeführt werden müssen.Nebenläufigkeit mit Android

showDamage - zeigt eine Nummer (in einem TextView) für einen kurzen Moment (~ 300 Millisekunden) und verschwindet dann.

Verzögerung - zum Halten eines temporären Boosts. Ein TextView wird auch am Anfang und am Ende aktualisiert. Das ist lang (~ 10 Sekunden).

Abklingzeit - gibt dem Benutzer eine Text-Rückmeldung über die verbleibende Zeit, bis eine Taste erneut gedrückt werden kann.

Ich habe einige Browsing und, nach dem Versuch, einen Handler, der andere Ereignisse blockiert, kam zu der allgemeinen Meinung, dass ich ASyncs als eine einfache Möglichkeit verwenden sollte, um gleichzeitige Threads, die Änderungen an der Benutzeroberfläche machen und Aufgaben ohne Blockierung der tun machen Haupt-Bedroung. Also habe ich alle 3 als Asyncs implementiert. Ich kam dann auf ein Problem, bei dem sie sich gegenseitig stören würden - die Zahlen von der ShowDamage würden länger als 300ms hängen bleiben, die temporären Effekte würden dauerhaft werden (die postExecution wurde nie ausgeführt). Weiteres Browsen schlug vor, dass Android standardmäßig eine Poolgröße von 5 hat und ich somit nur 5 Asyncs laufen lassen konnte. Die Verwendung von MyASync.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, ...) hilft zwar ein wenig, bietet aber Parallelität und keine Parallelität.

Ich habe einen CountdownTimer für Cooldown verwendet und das scheint das Problem mit den temporären Effekten gestoppt zu haben, aber die TextViews von showDamage hängen immer noch, wenn genug Spam ist. Gibt es dafür eine Lösung, und gibt es irgendwelche Versuche, die ich wahrscheinlich falsch implementiert habe?

Antwort

0

Sie sollten keine einzelnen asynchronen Aufgaben für jede Komponente haben, die Sie zu aktualisieren versuchen. Im Kontext deines Spiels hört es sich so an, als hättest du Schwierigkeiten, die Architektur für eine Game-Loop/Engine zu implementieren.

Sie könnten einen Thread verwenden, der aufgrund seiner Langlebigkeit wahrscheinlich eher ein richtiger Thread als ein AsyncTask wäre. Die Idee ist, dass Sie für die Dauer des Spiels einen einzelnen Thread ausführen, der die Prozessdaten durchlaufen und die Benutzeroberfläche aktualisieren wird.

Die Beispiele in diesen Ressourcen sind möglicherweise übertrieben, da sie direkt zeichnen, anstatt die Benutzeroberfläche von Android zu verwenden, aber sie können hilfreich sein, um die Struktur zu verstehen. In Ihrem Fall sollten Sie sicherstellen, dass Sie Referenzen auf Ihre TextView und andere Elemente (anstelle von findById EveryT Zeit) für die Effizienz halten.

Game loops, explained in incremental complexity

Long read on game loops from Game Programming Patterns textbook

Android game loop using canvas

Ich finde this stackoverflow answer sowie this stackoverflow answer nützlich in Android, die verschiedenen Gleichzeitigkeit Optionen für das Verständnis, obwohl ich denke, dass Sie die Game-Engine Ressourcen nützlich finden.