我有發動機的方法我使用(andengine):字符串和垃圾收集
public final void setText(String pString){...}
我的應用程序更新每1秒從靜止INT
mScoreText.setText(""+PlayerSystem.mScore);
問題得分是這每隔一秒創建一個新的String對象,並在1分鐘後,我有59個字符串對象通過GC和其他AbstractStringBuilders和init收集...
我找到了andeng的部分解決方案INE論壇這樣的:
private static StringBuilder mScoreValue = new StringBuilder("000000");
private static final char[] DIGITS = {'0','1','2','3','4','5','6','7','8','9'};
mScoreValue.setCharAt(0, DIGITS[(PlayerSystem.mScore% 1000000)/100000]);
mScoreValue.setCharAt(1, DIGITS[(PlayerSystem.mScore% 100000)/10000]);
mScoreValue.setCharAt(2, DIGITS[(PlayerSystem.mScore% 10000)/1000]);
mScoreValue.setCharAt(3, DIGITS[(PlayerSystem.mScore% 1000)/100]);
mScoreValue.setCharAt(4, DIGITS[(PlayerSystem.mScore% 100)/10]);
mScoreValue.setCharAt(5, DIGITS[(PlayerSystem.mScore% 10)]);
mScoreText.setText(mScoreValue.toString());
但主要問題仍然存在,的ToString()將返回新對象每次調用
有什麼辦法解決?
你真的關心每個*秒*一個字符串嗎?這對我來說似乎並不多,特別是因爲我期望每次點擊或其他事件都會創建一個新的(事件)對象。 –
是的。停止關心。垃圾收集器足夠快,以至於每秒一次分配的擔心完全是驚人的,不成比例。這種毫無意義的小提琴工作就是計算機最擅長的 - 讓他們這樣做,並利用你的智力來獲得更有價值的東西。 –
使用該代碼將是嚴重的過早優化的情況。我認爲最後所有的模操作,分區,從數組中提取數據和設置字符都會比一次創建字符串和相關的垃圾回收花費更多的處理時間。就像其他人指出的那樣,最後你用toString()創建了一個String。如果您正在處理這樣的限制,即每分鐘分配60個小對象太多,那麼Java並不是您想要使用的語言。 C或裝配將更接近該商標。 –