我有一個更新方法,就像一個無限循環,因爲它是每幀運行的。在這個方法裏面,我得到一個浮點數,並且我必須將它轉換爲每一幀的字符串以在屏幕上顯示socore。我使用< <運算符,它允許我將float複製到stringstream,然後使用str()函數獲取流的字符串值。stringstream <<運算符在循環內部消耗大量內存
在我宣佈的scoreString
,actualScore
和scoreLabel
的頭文件中。
update(dt){
actualScore += combo;
scoreString.str("");
scoreString << actualScore;
scoreLabel->setString(scoreString.str());
scoreString.clear();
}
actualScore
是我想要轉換爲字符串的浮點數。對於這個purpuse,我使用了一個stringstream
的scoreString對象。要回收這個stringstream
我使用str("")
函數將該值設置爲空,因此我不必在每次運行循環時都創建對象。
此代碼在cocos2dx應用程序中使用,它在iOS和Android設備中運行。我只能在android設備中使用內存。
這是我的logCat輸出,但我認爲它不會顯示任何新東西。
01-12 15:35:25.271: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 20ms, total 20ms
01-12 15:35:25.321: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 20ms, total 20ms
01-12 15:35:25.371: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 21ms, total 21ms
01-12 15:35:25.421: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 19ms, total 19ms
01-12 15:35:25.472: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 18ms, total 18ms
01-12 15:35:25.522: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 14ms, total 14ms
01-12 15:35:25.572: D/dalvikvm(13948): GC_FOR_ALLOC freed 298K, 6% free 9581K/10160K, paused 15ms, total 16ms
...
編輯 我改變了代碼的建議作出評論,但沒有奏效。另外,我通過更新(dt)來更改while(true),這是運行這段代碼的真正方法。
編輯2 這裏是sprintf版本,正如我所說,這也消耗了大量的內存。此外,我將actualScore的類型更改爲int。在頭文件,我宣佈得分爲char score[16];
update(dt){
actualScore += combo;
sprintf(score, "%d", actualScore);
scoreLabel->setString(score);
}
如果分數不同於前一幀的分數,只更改分數並進行計算不是更好嗎? 所以,只有在分數改變時纔會更新。這可能釋放一些內存 – Dries
使用在循環外部聲明的'StringBuilder',正如Dries所說,只有在需要時才更改它。 – Simon
想起它的主題,但是'std :: to_string'。此外,添加'scoreString.clear();' – Gasim