cocos2d-x, поделитесь или повторно используйте CCTexture2D

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


Так что я думаю, что если можно разделить один единственный CCTexture2D, (я имею в виду одно выделение памяти), использование памяти резко упадет.

возможно ли это со статической или глобальной декларацией?

Любые комментарии плз~


person Jinbom Heo    schedule 22.11.2012    source источник


Ответы (3)


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

Если у вас есть спрайт, использующий "tex.png", то tex.png будет загружен в память. Если вы добавите еще миллион спрайтов, также используя tex.png, тогда только сам объект спрайта будет использовать больше памяти (несколько сотен байтов), но текстура будет повторно использоваться после ее загрузки. Т.е. у вас будет тысяча плюс один спрайт, и все они отрисовываются из одной и той же текстуры.

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

person LearnCocos2D    schedule 22.11.2012

CCSpriteBatchNode станет вашим лучшим другом.

Сначала вы создаете BatchNode с файлом текстуры, который хотите использовать.

Затем просто добавьте более 100 спрайтов в свою партию. Они используют только одну копию текстуры.

person m.ding    schedule 22.11.2012
comment
Хорошо, тогда я могу создать спрайт с таким пакетным узлом. CCSprite *aMan1 = CCSprite::createWithSpriteFrameName(head.png); но как я могу изменить текстуру персонажа, используя текстуры пакетного узла? - person Jinbom Heo; 22.11.2012

С ответом m.ding я решил свой вопрос.

Вот решение.

шаг 1) определите текстуру как пакетный узел.

batchNode = CCSpriteBatchNode::create("mans.pvr.ccz");
this->addChild(batchNode);
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("mans.plist");

шаг 2) создайте спрайт с текстурой пакетного узла и добавьте его в сцену.

CCSprite *man = CCSprite::createWithSpriteFrameName("body_black.png");
batchNode->addChild(man, 1, 1000);

шаг 3) если вы хотите изменить текстуру, просто используйте кешированную текстуру пакетного узла.

((CCSprite *)this->getChildByTag(1000))->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("body_red.png""));

Вот и все~. надеюсь на эту помощь!

Обновить: добавить в пакетный узел, а не «это». :)

person Jinbom Heo    schedule 22.11.2012
comment
я думаю, что это должно быть batchNode->addChild(man) повысит производительность. LearnCocos2D прав, это не повлияет на использование памяти. - person m.ding; 23.11.2012
comment
какая разница? это против batchNode - person Jinbom Heo; 27.11.2012
comment
this — каждый спрайт вызывает один метод draw(), batch — для всех спрайтов вызывается только один метод draw(). - person m.ding; 28.11.2012