【问题标题】:stringstream << operator consuming a lot of memory inside a loopstringstream << 运算符在循环内消耗大量内存
【发布时间】:2014-01-12 14:40:37
【问题描述】:

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

我正在使用

在头文件中我声明了scoreStringactualScorescoreLabel

update(dt){
    actualScore += combo;
    scoreString.str("");
    scoreString << actualScore;
    scoreLabel->setString(scoreString.str());
    scoreString.clear();
}

actualScore 是我要转换为字符串的浮点数。为此,我使用了一个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
...

编辑 我将代码更改为在 cmets 中提出的建议,但它不起作用。我还通过 update(dt) 更改了 while(true),这是运行这段代码的真正方法。

编辑 2 这里是 sprintf 版本,正如我所说,这也消耗大量内存。我还将actualScore 的类型更改为int。在头文件中,我将分数声明为char score[16];

update(dt){
    actualScore += combo;
    sprintf(score, "%d", actualScore);
    scoreLabel->setString(score);
}

【问题讨论】:

  • 如果分数与上一帧不同,只改变分数并进行计算不是更好吗?因此,仅在分数更改时更新。这可能会释放一些内存
  • 使用在循环外声明的StringBuilder,正如 Dries 所说,仅在需要时更改它。
  • 它跑题了,但我想到了std::to_string。另外,添加scoreString.clear();
  • 您确定 'scoreLabel->setString' 没有问题! ?
  • @MooingDuck 最后我发现问题出在使用一种非常慢且浪费大量内存的 af 标签。现在我正在使用更快的 CCLabelBMFont。谢谢大家!

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在我的代码中使用过一次 stringstream sprintf。

    【讨论】:

    • 使用 sprintf 效果不佳。我使用 sprintf 上传了我的代码。我做错了什么?
    • id 没有用是什么意思?你有任何错误信息吗?
    • 请注意,如果您使用的是旧版本的 C++ 编译器,您可能需要添加#include
    • 最后我发现问题出在使用一种非常慢且浪费大量内存的 af 标签。现在我正在使用更快的 CCLabelBMFont。谢谢大家!
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 2021-08-09
    • 2022-01-16
    • 2014-01-04
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多