1

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

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

在我声明的头文件scoreString中,actualScorescoreLabel.

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

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

编辑 我将代码更改为评论中的建议,但没有奏效。我还通过 update(dt) 更改了 while(true),这是运行这段代码的真正方法。

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

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

2 回答 2

2

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

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

于 2014-01-19T13:31:49.187 回答
0

我在我的代码中使用了 stringstream << 一次,它导致了不寻常的内存泄漏和 android 应用程序中的应用程序崩溃。避免它并使用sprintf代替。

于 2014-01-14T10:08:56.797 回答