2010-11-22 19 views
6

Podczas odczytywania modułu do zbierania śmieci występowały sporadyczne opóźnienia w mojej grze na Androida. Pobiegłem DDMS i odkrył, że cała pamięć jest alokowana przez mojego wniosku jest z tej linii:Konwertuj liczbę całkowitą na ciąg bez przydzielania pamięci

scoreString = String.valueOf(score); 

Jaki jest najlepszy sposób przekonwertować liczbę całkowitą na ciąg bez przydzielania żadnego pamięć?

+0

Wygląda na to, że sposób wyświetlania elementów jest tutaj problemem. Jeśli śmieciarz lub alokacja strun naprawdę przeszkadza twojej grze, masz inne poważne problemy, które ukrywasz. – Falmarri

+0

Czy mógłbyś wyjaśnić? Śmieciarz to prawdopodobnie najczęstszy problem z wydajnością w grach na Androida. Poza tym wydajność jest dobra, z wyjątkiem krótkich okresów (mniej niż sekunda), gdy spowalnia. Patrząc na dane wyjściowe dziennika, te opóźnienia wyrównują się ze zbieraniem śmieci. – Computerish

Odpowiedz

12

Przydziel tablicę znaków, która ma być wyświetlana jako wynik, i użyj tabeli odnośników od 0 do 9 (to wygodnie odwzorowuje do tablicy 0-bazowej), aby dołączyć ją do tej tablicy na podstawie każdej cyfry wyniku.

Edit: Aby wyodrębnić cyfry od wynik:

 
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) 

także będziesz wiedział jaka max długość tablicy znaków wynik powinien opierać się na tym, co używasz do przechowywania wynik (tj int)

polecam odwrócić wypełniania tej tablicy i inicjowanie go wszystkim „0”, więc Twój wynik pokaże jak

 
0000000000 
0000005127 
+0

Czy to naprawdę jedyny sposób? Biorąc pod uwagę ilość potrzebnej do tego matematyki, nie jestem do końca pewien, czy to jest szybsze, niż tylko przydzielanie pamięci. Ten kod jest w pętli nazywany wiele razy na sekundę. – Computerish

+1

Pewnie, wątpię, że jest to mniej matematyki niż to, co jest wymagane do wykrywania kolizji i reagowania czy jakiejkolwiek innej mechaniki, której wymaga gra, aby wymusić zmianę wyniku tak często. –

0

właśnie prowadził w do tego problemu również, jeśli GC kopie podczas kadru, to jest naprawdę zauważalne. Wymyśliłem to rozwiązanie.

Jeśli wypełniasz bufor do tyłu, możesz po prostu wielokrotnie % 10 i / 10.

Działająca implementacja, która dodaje numer do StringBuilder, prawdopodobnie nie jest to najlepszy sposób, ale działa i nie powoduje żadnych przydziałów. Można także użyć innej tablicy znaków dla wartości zamiast rzutowania do postaci char, a dodanie 48 ("0" w 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; 
} 
Powiązane problemy