Die Verwendung von Sammlungen in der Android-Spieleentwicklung wird nicht empfohlen?

10

Während ich an einem Spielprojekt für Android arbeitete, suchte ich nach Informationen zur Leistungsoptimierung für Spielcode. Und ich habe erfahren, dass die Verwendung von Java- Sammlungen wie List, Arraylist usw. in Spielcodes nicht empfohlen wird, obwohl das Sammeln ein nützliches Werkzeug in der Java-Programmierung ist. Warum ist das so? Ich möchte technische Details wissen, wie viel Einfluss das Collection Framework auf Android-Systeme haben kann und warum? Jede Hilfe in dieser Hinsicht wird großartig sein.

GamDroid
quelle
Wo hast du das gelesen?
Egarcia
wahrscheinlich hier: developer.android.com/guide/practices/design/performance.html Beachten Sie Folgendes: Zusammenfassend: Verwenden Sie standardmäßig die erweiterte for-Schleife, berücksichtigen Sie jedoch eine handgeschriebene gezählte Schleife für die leistungskritische ArrayList-Iteration.
Nagler

Antworten:

8

Es geht hauptsächlich um Speicherzuweisung und Speicherbereinigung. Durch die Speicherzuweisung zur Laufzeit kann Ihr Garbage Collector den Papierkorb entfernen. Was Ihrer Leistung schadet. GC sollte so selten wie möglich auftreten.

Die meisten Java-Sammlungen:

A) Weisen Sie mehr Speicher zu, als sie benötigen.

B) Ordnen Sie Speicher zu, wenn Sie dies nicht möchten.

C) Weisen Sie jedem Iterator Speicher zu, wenn Sie eine Sammlung durchlaufen.

Um diese Dinge zu umgehen:

A) Ordnen Sie Sammlungen mit festen Größen zu. dh. Objektpools erstellen.

B) Ordnen Sie diese Pools bei Programminit.

C) Vermeiden Sie das for (Object obj: collection) für Auflistungstypen mit der Methode size () und .get (int index).

Nagler
quelle
2
Alle gültigen Punkte, aber denken Sie daran: "Wir sollten kleine Wirkungsgrade vergessen, sagen wir etwa 97% der Zeit: Vorzeitige Optimierung ist die Wurzel allen Übels." Sie sollten solche Optimierungen auf die Stellen beschränken, an denen sie wirklich notwendig sind. Streben Sie an allen anderen Orten nach einem klaren und einfachen Design.
Michael Klement
@Michael: Auf heutigen Systemen mit schnellen Caches und langsamem Speicher und mehreren Kernen ist die Speicherzuweisung das teuerste, was Sie tun können.
2
@Michael: Es wird Ihnen schwer fallen, eine kommerzielle Hochleistungs-Game-Engine zu finden, die nicht so viel wie möglich unternimmt, um ihre Speicherzuweisungsmuster zu optimieren. Hier ist ein langer Vortrag über das Thema Echtzeit-Android-Spiele. Es ist ein bisschen alt, aber das meiste sollte noch zutreffen: youtube.com/watch?v=U4Bk5rmIpic
Nailer
Versteh mich nicht falsch: Ich wollte deiner Antwort nicht widersprechen. Ich wollte nur darauf hinweisen, dass Sie vernünftig und an den richtigen Stellen optimieren sollten. Die Verwendung von Arrays gegenüber Sammlungen an einem Ort, der nur minimale Auswirkungen auf die Leistung hat (z. B. 1%), bietet keinen Vorteil. (Auch hier ausführlicher besprochen: developer.android.com/guide/practices/design/… )
Michael Klement
3
@ AttackingHobo: Ich bin anderer Meinung. Blindes Optimieren ist nicht vorteilhaft. So klingt Ihre Aussage für mich (korrigieren Sie mich, wenn ich etwas falsch gemacht habe). Chris Pruett erklärte auch in dem oben verlinkten Google IO-Video: "Wähle jeden Tag der Woche Flexibilität statt Geschwindigkeit ... bis das Gameplay beschädigt ist." und ich stimme dem zu.
Michael Klement