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;
}
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
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