2010-11-22 14 views
6

Ho riscontrato occasionali ritardi nel mio gioco Android quando si esegue il garbage collector. Mi sono imbattuto DDMS e ha scoperto che tutta la memoria viene assegnato dalla mia applicazione da questa linea:Converti un numero intero in una stringa senza allocare memoria

scoreString = String.valueOf(score); 

Qual è il modo migliore per convertire un intero in una stringa senza allocare alcuna memoria?

+0

Suona come il modo in cui si sta visualizzando le cose è il problema qui. Se il garbage collector o l'allocazione di stringhe stanno davvero interrompendo il tuo gioco, hai altri seri problemi che stai mascherando. – Falmarri

+0

Puoi spiegare? Il garbage collector è probabilmente il problema di prestazioni più comune nei giochi Android. Inoltre, le prestazioni vanno bene tranne che per brevi periodi (meno di un secondo) quando rallenta. Guardando l'output del registro, questi ritardi si allineano con la garbage collection. – Computerish

risposta

12

allocare una matrice di caratteri da visualizzare come il punteggio, e utilizzare una tabella di ricerca di 0-9 (questa mappa convenientemente a un array 0-base comunque) per aggiungere a questo array basato su ogni cifra del punteggio.

Edit: Per estrarre i numeri tuo punteggio:

 
12345 mod 10 = 5 
12345 mod 100 = 45/10 = 4.5 (floors to 4) 
12345 mod 1000 = 345/100 = 3.45 (floors to 3) 
12345 mod 10000 = 2345/1000 = 2.345 (floors to 2) 
12345 mod 100000 = 12345/10000 = 1.2345 (floors to 1) 

Inoltre saprete cosa la lunghezza massima per l'array di caratteri punteggio deve essere basata su ciò che si sta utilizzando per memorizzare il punteggio (vale a dire int)

vi consiglio di reverse-riempire questo array e l'inizializzazione a tutti '0' in modo che il punteggio visualizzerà come

 
0000000000 
0000005127 
+0

È davvero l'unico modo? Data la quantità di matematica necessaria per questo, non sono del tutto sicuro che sia più veloce della semplice allocazione della memoria. Questo codice è in un ciclo chiamato più volte al secondo. – Computerish

+1

Certo, dubito che sia meno matematico di quello che è richiesto per il rilevamento e la risposta alle collisioni o qualsiasi altra meccanica richiesta dal tuo gioco per richiedere che il punteggio cambi spesso? –

0

ho appena eseguito in anche a questo problema, se il GC entra in gioco durante un frame, è davvero da notare. Ho trovato questa soluzione.

Se si riempie il buffer all'indietro, è possibile solo ripetutamente % 10 e / 10.

Un'implementazione funzionante che aggiunge un numero a uno StringBuilder, probabilmente non è il modo migliore per farlo ma funziona e non causa allocazioni. Si potrebbe anche usare un altro array di caratteri per i valori invece di colata a char e l'aggiunta di 48 ('0' in ASCII)

private char[] sbBuffer = new char[20]; 
private void appendInt(StringBuilder sb, int num) { 
    int i,j; 
    i = sbBuffer.length - 1; 
    if (num == 0) { 
     j = sbBuffer.length - 1; 
     sbBuffer[j] = (char) 48; 
    } else { 
     if (num < 0) 
      sb.append('-'); 
     num = Math.abs(num); 
     while (num > 0) { 
      sbBuffer[i] = (char) (num % 10 + 48); 
      i--; 
      num /= 10; 
     } 
     j = i + 1; 
    } 

    sb.append(sbBuffer, j, sbBuffer.length - j); 

    /* clean up */ 
    for (i = j; i < sbBuffer.length; i++) 
     sbBuffer[i] = 0; 
} 
Problemi correlati