当垃圾收集器运行时,我的Android游戏中偶尔会出现滞后现象。我运行DDMS并发现我的应用程序分配的所有内存都来自这一行:
scoreString = String.valueOf(score);
在不分配任何内存的情况下将整数转换为字符串的最佳方法是什么?
答案 0 :(得分:12)
分配要显示为分数的字符数组,并使用0-9的查找表(无论如何这方便地映射到0基数组),以根据分数的每个数字附加到此数组。 / p>
编辑: 要从分数中提取数字:
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)
此外,您将知道得分字符数组的最大长度应该基于您用于存储分数的任何内容(即int)
我建议反向填充此数组并将其初始化为全“0”,这样您的分数就会显示为
0000000000 0000005127
答案 1 :(得分:0)
我也遇到了这个问题,如果GC在一个帧期间启动它真的很明显。我提出了这个解决方案。
如果您向后填充缓冲区,则可以反复% 10
和/ 10
。
将一个数字附加到StringBuilder的工作实现,可能不是最好的方法,但它可以工作并且不会导致分配。您还可以使用另一个字符数组作为值,而不是转换为char并添加48(ascii中的“0”)
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;
}