струнный поток & lt; & lt; оператор потребляет много памяти внутри цикла

У меня есть метод обновления, который похож на бесконечный цикл, потому что выполняется каждый кадр. Внутри этого метода я получаю плавающее число, и мне нужно преобразовывать его в строку каждый кадр, чтобы разместить сокор на экране.

Я использую << оператор, который позволяет мне скопировать float в stringstream, а затем я использую функцию str (), чтобы получить строковое значение потока.

В заголовочном файле я объявил scoreString, actualScore а также scoreLabel,

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

actualScore это число, которое я хочу преобразовать в строку. Для этой цели я использую объект 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
...

РЕДАКТИРОВАТЬ
Я изменил код на предложения в комментариях, но это не сработало. Также я изменяю while (true) обновлением (dt), которое является реальным методом, запускающим этот фрагмент кода.

РЕДАКТИРОВАТЬ 2
Вот версия sprintf, как я уже сказал, она также занимает много памяти. Кроме того, я изменил тип actualScore на int. В заголовочном файле я объявил счет как char score[16];

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

1

Решение

Я использовал ярлык CCLabelTTF, который работает медленно и тратит много памяти.
Я начал использовать CCLabelBMFont, который работает быстрее, что решило вопрос выделения памяти.

Я обнаружил, что в http://www.cocos2d-x.org/wiki/Text_Labels где это объясняет использование различных типов меток, которые имеет cocos2d-x.

1

Другие решения

Я использовал струнный поток << однажды в моем коде, и это вызвало необычную утечку памяти и сбой приложения в приложении для Android. Избегайте этого и используйте Sprintf вместо.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector