Я тоже столкнулся с этой проблемой, если GC включается во время кадра, это действительно заметно. Я придумал это решение.
Если вы заполняете буфер в обратном направлении, вы можете просто несколько раз % 10
и / 10
.
Работающая реализация, которая добавляет число в StringBuilder, вероятно, не лучший способ сделать это, но это работает и не вызывает выделений. Вы также можете использовать другой массив символов для значений вместо преобразования в char и добавления 48 ('0' в 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;
}