У меня есть метод обновления, который похож на бесконечный цикл, потому что выполняется каждый кадр. Внутри этого метода я получаю плавающее число, и мне нужно преобразовывать его в строку каждый кадр, чтобы разместить сокор на экране.
Я использую << оператор, который позволяет мне скопировать 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);
}
Я использовал ярлык CCLabelTTF, который работает медленно и тратит много памяти.
Я начал использовать CCLabelBMFont, который работает быстрее, что решило вопрос выделения памяти.
Я обнаружил, что в http://www.cocos2d-x.org/wiki/Text_Labels где это объясняет использование различных типов меток, которые имеет cocos2d-x.
Я использовал струнный поток << однажды в моем коде, и это вызвало необычную утечку памяти и сбой приложения в приложении для Android. Избегайте этого и используйте Sprintf вместо.