2014-01-12 33 views
1

我有一個更新方法,就像一個無限循環,因爲它是每幀運行的。在這個方法裏面,我得到一個浮點數,並且我必須將它轉換爲每一幀的字符串以在屏幕上顯示socore。我使用< <運算符,它允許我將float複製到stringstream,然後使用str()函數獲取流的字符串值。stringstream <<運算符在循環內部消耗大量內存

在我宣佈的scoreStringactualScorescoreLabel的頭文件中。

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); 
} 
+0

如果分數不同於前一幀的分數,只更改分數並進行計算不是更好嗎? 所以,只有在分數改變時纔會更新。這可能釋放一些內存 – Dries

+0

使用在循環外部聲明的'StringBuilder',正如Dries所說,只有在需要時才更改它。 – Simon

+3

想起它的主題,但是'std :: to_string'。此外,添加'scoreString.clear();' – Gasim

回答

1

我使用的標籤是CCLabelTTF,速度很慢,浪費了很多內存。 我開始使用速度更快的CCLabelBMFont,解決了內存分配問題。

我發現在http://www.cocos2d-x.org/wiki/Text_Labels這裏它解釋了使用cocos2d-x所具有的不同類型的標籤。

0

我在我的代碼中使用字符串流< <一次,就引起了聯合國通常內存泄漏和Android應用程序崩潰的應用程序。避免它,並使用sprintf來代替。

+0

使用sprintf它不能正常工作。我使用sprintf上傳了我的代碼。我做錯了什麼? –

+0

你是什麼意思ID沒有工作?你有任何錯誤信息? –

+0

還有一點需要注意的是,如果您使用的是舊版本的C++編譯器,則可能需要添加#include