字符串流<<运算符在循环中消耗大量内存

stringstream << operator consuming a lot of memory inside a loop

本文关键字:lt 内存 运算符 字符串 循环      更新时间:2023-10-16

我有一个更新方法,它就像一个无限循环,因为它每帧都在运行。在这个方法中,我得到了一个float,我必须在每帧将其转换为字符串,以便在屏幕中发布socore。

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

在头文件中,我声明了scoreStringactualScorescoreLabel

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

actualScore是我想要转换为字符串的浮点值。对于这个purpuse,我使用了一个scoreString对象,它是一个stringstream。为了回收这个stringstream,我使用了str("")函数,它将值设置为零,因此我不必每次运行循环时都创建对象。

这段代码在cocos2dx应用程序中使用,并在IOS和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),这是运行这段代码的真实方法。

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

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

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

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

我使用了字符串流<lt;有一次在我的代码中,它导致了异常的内存泄漏和android应用程序中的应用程序崩溃。避免它,而是使用sprintf