【发布时间】:2014-01-12 14:40:37
【问题描述】:
我有一个类似于无限循环的更新方法,因为它每帧都运行。在这个方法中,我得到一个浮点数,我必须每帧将它转换为一个字符串,以便在屏幕上发布 socore。
我正在使用
在头文件中我声明了scoreString、actualScore和scoreLabel。
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