stringstream<<运算符在循环内消耗大量内存

时间:2014-01-12 14:40:38

标签: c++ android-ndk cocos2d-x stringstream cocos2d-x-3.0

我有一个类似无限循环的更新方法,因为每帧运行。在这个方法里面,我得到一个浮点数,我必须每帧将它转换为一个字符串,以便在屏幕上发布社交。

我正在使用<<允许我将float复制到stringstream的运算符然后,我使用str()函数来获取流的字符串值。

在头文件中,我声明了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);
}

2 个答案:

答案 0 :(得分:1)

我使用的标签是CCLabelTTF,它很慢并浪费了大量内存。 我开始使用更快的CCLabelBMFont,解决了内存分配问题。

我发现在http://www.cocos2d-x.org/wiki/Text_Labels,它解释了cocos2d-x使用的不同类型标签的用法。

答案 1 :(得分:0)

我使用过stringstream&lt;&lt;曾经在我的代码中,它导致了不常见的内存泄漏和Android应用程序中的应用程序崩溃。避免使用 sprintf