L'uso delle raccolte nello sviluppo di giochi Android non è incoraggiato?


10

Mentre lavoravo a un progetto di gioco per Android, stavo cercando alcune informazioni sull'ottimizzazione delle prestazioni del codice di gioco. E ho scoperto che l'uso di raccolte Java come List, Arraylist ecc. Non è incoraggiato nei codici di gioco, sebbene la raccolta sia uno strumento utile nella programmazione Java. Perché è così? Vorrei conoscere i dettagli tecnici sull'impatto che il framework Collection può avere sui sistemi Android e perché? Qualsiasi aiuto in tal senso sarà eccezionale.


Dove l'hai letto?
egarcia,

probabilmente qui: developer.android.com/guide/practices/design/performance.html Nota come si dice: Riassumendo: usa il ciclo avanzato for per impostazione predefinita, ma considera un ciclo contato scritto a mano per l'iterazione ArrayList critica per le prestazioni.
Nailer,

Risposte:


8

Si tratta principalmente di allocazione della memoria e garbage collection. Le allocazioni di memoria durante il runtime offrono al garbage collector la possibilità di far uscire il cestino. Che fa male alla tua esibizione. GC dovrebbe avvenire il più raramente possibile.

La maggior parte delle collezioni java:

A) Allocare più memoria del necessario.

B) Allocare memoria quando non si desidera.

C) Allocare memoria per ciascun iteratore durante l'iterazione attraverso una raccolta.

Per aggirare queste cose:

A) Allocare raccolte con dimensioni fisse. vale a dire. creare pool di oggetti.

B) Allocare questi pool all'inizio del programma.

C) Evita il for (Object obj: collection) per quei tipi di raccolta che hanno un metodo size () e un metodo .get (int index).


2
Tutti punti validi, ma tieni presente: "Dovremmo dimenticare piccole efficienze, diciamo circa il 97% delle volte: l'ottimizzazione prematura è la radice di tutti i mali". Dovresti limitare tali ottimizzazioni ai punti in cui sono realmente necessarie. In tutti gli altri luoghi, lotta per un design chiaro e semplice.
Michael Klement,

@Michael: sui sistemi di oggi, con cache veloci e memoria lenta e più core, le allocazioni di memoria sono la cosa più costosa che puoi fare.

2
@Michael: Sarebbe difficile trovare un motore di gioco commerciale ad alte prestazioni che non faccia il più possibile per ottimizzare i loro schemi di allocazione della memoria. Ecco un lungo discorso sull'argomento dei giochi Android in tempo reale. È un po 'vecchio, ma la maggior parte dovrebbe ancora applicarsi: youtube.com/watch?v=U4Bk5rmIpic
Nailer

Certo, non fraintendetemi: non volevo essere in disaccordo con la vostra risposta. Volevo solo sottolineare che dovresti ottimizzare giudiziosamente e nei punti giusti. Non vi è alcun vantaggio nell'uso di array su raccolte in un punto che ha un impatto minimo sulle prestazioni (diciamo 1%). (Discusso anche in modo più elaborato qui: developer.android.com/guide/practices/design/… )
Michael Klement

3
@AttackingHobo: non sono d'accordo. L'ottimizzazione alla cieca non è benefica, ed è ciò che mi sembra la tua affermazione (correggimi se ho sbagliato). Chris Pruett ha anche affermato nel Google IO Video collegato sopra: "Scegli la flessibilità rispetto alla velocità tutti i giorni della settimana ... fino a quando il gioco non viene danneggiato." e sono d'accordo con questo.
Michael Klement,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.