2010-11-22 29 views
6

He estado experimentando retrasos ocasionales en mi juego para Android cuando se ejecuta el recolector de elementos no utilizados. Corrí DDMS y descubrí que toda la memoria que se asigna por mi solicitud es de esta línea:Convertir un número entero en una cadena sin asignar memoria

scoreString = String.valueOf(score); 

¿Cuál es la mejor manera de convertir un entero a una cadena sin cualquier reserva de memoria?

+0

suena como la forma en que está mostrando cosas está el problema aquí. Si el recolector de basura o la asignación de cadenas realmente están alterando tu juego, tienes otros problemas serios que estás ocultando. – Falmarri

+0

¿Podría explicarlo? El recolector de basura es probablemente el problema de rendimiento más común en los juegos de Android. Además, el rendimiento es bueno, excepto por períodos breves (menos de un segundo) cuando se ralentiza. En cuanto a la salida de registro, estos retrasos se alinean con la recolección de basura. – Computerish

Respuesta

12

Asigne una matriz de caracteres que se mostrarán como puntaje, y utilice una tabla de búsqueda de 0-9 (esto se asigna convenientemente a una matriz de 0 bases de todos modos) para agregar a esta matriz en función de cada dígito de la puntuación.

Editar: Para extraer los dígitos de su cuenta:

 
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) 

también sabrá lo que la longitud máxima para el arreglo de caracteres puntuación debe basarse en lo que usted está utilizando para almacenar la puntuación (es decir, int)

recomiendo inversa llenar esta matriz y la inicialización a todos '0' por lo que su puntuación se mostrará como

 
0000000000 
0000005127 
+0

¿Es esa la única manera? Dada la cantidad de matemática necesaria para eso, no estoy del todo seguro de si eso es más rápido que simplemente asignar memoria. Este código está en un bucle que se llama muchas veces por segundo. – Computerish

+1

Claro, dudo que sean menos las matemáticas que lo que se requiere para la detección y respuesta de colisión o cualquier otra mecánica que requiera su juego para poder necesitar que la puntuación cambie tan seguido. –

0

simplemente me encontré en a este problema también, si el GC se activa durante un cuadro, es realmente notable. Se me ocurrió esta solución.

Si se llena la memoria intermedia hacia atrás, sólo puede repetidamente % 10 y / 10.

Una implementación de trabajo que agrega un número a un StringBuilder, probablemente no sea la mejor manera de hacerlo pero funciona y no causa asignaciones. También es posible usar otro array de caracteres para los valores en lugar de echar a char y añadiendo 48 ('0' en el 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; 
} 
Cuestiones relacionadas