Согласно тому, что я узнал о cocos2d. SpriteFrameCache и SpriteBatchNode имеют одинаковый результат, но используются по-разному и могут заметить небольшую разницу в производительности, если ваша игра очень большая ...
CCSpriteFrameCache загружает ваши фреймы в соответствии с тем, когда они вызываются по их именам, в соответствии с предоставленным им plist-файлом. Атлас, связанный с списком, также должен быть добавлен в проект, иначе будут вызваны кадры, но ничего не будет найдено. Plist подобен адресу, где изображение находится внутри атласа изображения.
Хорошей частью CCSpriteFrameCache является то, что код аккуратнее и меньше, чем метод CCSpriteBatchNode, за счет того, что при каждом вызове этого кадра он направляется в этот конкретный атлас и рисует его.
CCSpriteBatchNode, с другой стороны, загружает атлас и загружает его за один вызов отрисовки. Это эффективно, потому что это уменьшает количество раз, которое нужно сделать в соответствии с потребностями в игре. Единственная трудность здесь заключается в том, что вам нужно сделать математику для прямоугольников каждого спрайта в атласе. Это потому, что, допустим, ваш атлас состоит из двух действий символа, файл изображения атласа имеет размер 1024x1024, а каждый спрайт имеет размер 128x128. например, вы должны выполнить математические расчеты, чтобы получить каждый прямоугольник для всего действия прыжка, например (здесь пригодится .plist, чтобы избежать такой математики)
Код становится сложным, как вы можете видеть, но он будет выполнять только один вызов, что делает его лучшим по производительности.
Другой способ использовать CCSpriteBatchNode - это иметь разные статические спрайты, и вы просто сделаете один вызов отрисовки для этих нескольких статических изображений или спрайтов.
Если вам нужен пример кода, просто спросите, я был бы более чем рад предоставить его.
Обновление: добавление ссылки для SpriteBatchNode и моего собственного примера.
SpriteBatchNode:
Пример использования SpriteBatchNode с Рэем Вендерлихом
Я верю в этого парня, и я многому научился по Cocos2d из его уроков. Я бы предложил вам прочитать другие его уроки.
В двух словах, CCSpriteBatchNode - это точно тот же процесс, который мы сделали ниже для CCSpriteFrameCache, ЕДИНСТВЕННАЯ разница и заключается в том, что вы добавляете дочерний узел Sprite в CCSpriteBatchNode, а не в Layer, НО вы добавляете CCSpriteBatchNode в Layer.
Это сложная концепция, в которую запутываются новички в Cocos2d.
SpriteFrameCache:
SpriteFrameCache. Я не смог найти хороший пример, поэтому вот один простой.
//By doing this your sprites are now in the cache ready to be used
//by their names declared in the .plist file.
-(void) loadingSprites:(NSString*) plistName {
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName];
}
-(id)initGameLayer {
//CCSprite accepts CCSpriteFrame and your img is now ready to be displayed.
//However is still not drawn yet.
CCSprite * mySprite = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:framename];
//set a position if desired
//20 pixels to the right and 0 pixels to the top.
mySprite.position = CGPointMake(20,0);
//Now the Image has been drawn, making 1 draw call.
[self addChild:mySprite];
}
Следует отметить, что CCSpriteBatchNode выполняет всего 1 вызов, ОДНАКО все спрайты, добавляемые в пакет, должны быть частью одного и того же SpriteAtlas.
И использование SpriteFrameCache только становится все проще и проще, но для каждого дочернего элемента, добавленного к слою, это означает, что выполняется вызов +1 для рисования (это недостаток, производительность)
Таким образом, если вы добавите 10 спрайтов к слою с помощью SpriteFrameCache, у вас будет 10 вызовов.
Однако, если вы реализуете SpriteBatchNode и вместо этого добавляете эти 10 спрайтов в CCSpriteBatchNode и просто добавляете этот CCSpriteBatchNode в слой, у вас будут добавлены те же 10 спрайтов, но будет выполнен только ОДИН вызов вызова. Следовательно, разница в производительности (для лучших) будет значительной в больших играх.
Надеюсь, это поможет, ура!