Когда использовать CCSpriteBatchNode? - PullRequest
13 голосов
/ 26 сентября 2011

в Cocos2d я буду играть анимацию. Анимация имеет около 12 кадров, и каждый кадр довольно большой. На самом деле, -hd-версия каждого кадра довольно велика.

Во всяком случае, во-первых, я создал его, поместив все 12 кадров в текстуру с помощью Zwoptex. Текстура около 2048х2048.

Это так, чтобы я мог анимировать CCSprite в CCSpriteBatchNode, используя эту текстуру.

Но я, похоже, получаю предупреждение памяти 2 уровня.

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

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

1 Ответ

24 голосов
/ 27 сентября 2011

Вы правы насчет CCSpriteBatchNode. CCSpriteBatchNode похож на пакетный узел: если он содержит дочерние элементы, он будет рисовать их за 1 единственный вызов OpenGL (часто известный как «пакетная отрисовка»), при отсутствии CCSpriteBatchNode (в данном случае) все «пакетные отрисовки» будут называться как количество детей (спрайтов).

CCSpriteBatchNode может ссылаться на одну и только одну текстуру (один файл изображения, один атлас текстуры), т.е. спрайт-лист, созданный zwoptex. Только CCSprites, которые содержатся в этой текстуре, могут быть добавлены в CCSpriteBatchNode. Все CCSprites, добавленные в CCSpriteBatchNode, отрисовываются в одном вызове отрисовки OpenGL ES. Если CCSprites не добавляются в CCSpriteBatchNode, то для каждого из них потребуется вызов отрисовки OpenGL ES, что является менее эффективным.

В соответствии с вашим сценарием вам не нужно использовать CCSpriteBatchNode, поскольку в каждый момент времени отображается только одна текстура.

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

Это не имеет значения. Вы будете загружать текстуру 2048 x 2048 в любом случае. Надо подумать, почему только одна текстура 2048 x 2048 предупреждает об уровне 2? сколько таких текстур вы загружаете. BTW 2048 x 2048 поддерживается только на iPod3G / iPhone3GS выше (что нормально).

В случае, если вы загружаете много текстур (что мне кажется правдой). Вам нужно запрограммировать логику, в которой вы можете выгружать текстуры, когда они не нужны. Посмотрите на следующие методы:

[[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromFile:fileName];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

Что касается анимации, вы можете создать CCAnimation и использовать ее или (в зависимости от вашего сценария) вы можете использовать setDisplayFrame (кадр CCSpriteFrame);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...