现在还有明显用得到spritebuilderatchNode的地方么

用处是减少对精灵的渲染次数,用法如下1
SpriteFrameCache::getInstance()-&addSpriteFramesWithFile("person.plist");2
SpriteBatchNode *node = SpriteBatchNode::create("person.png");3
bg-&addChild(node);4
SpriteFrame *frame = SpriteFrameCache::getInstance()-&getSpriteFrameByName("navigationbar_back.png");6
Sprite *spt1 = Sprite::createWithSpriteFrame(frame);7
node-&addChild(spt1);&
记录开发中遇到的Bug&持续更
最新教程周点击榜
2记录开发中遇到的Bug&持续更新...&
微信扫一扫下次自动登录
现在的位置:
& 综合 & 正文
cocos2d-X 节点(SpriteBatchNode.h.)API
本文来自 ,引用必须注明出处!
cocos2d-X 节点(SpriteBatchNode.h.)API
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客
///cocos2d-x-3.0alpha0/cocos2dx/sprite_nodes
#ifndef __CC_SPRITE_BATCH_NODE_H__
#define __CC_SPRITE_BATCH_NODE_H__
#include &vector&
#include "base_nodes/CCNode.h"
#include "CCProtocols.h"
#include "textures/CCTextureAtlas.h"
#include "ccMacros.h"
NS_CC_BEGIN
* @addtogroup sprite_nodes
/** SpriteBatchNode就像是一个批节点:如果它包含孩子,他会一次性绘制所有孩子
* (通常叫做"批绘制").
* SpriteBatchNode可以引用一个且只有一个 texture(纹理)(一个图像文件,一个 texture atlas (纹理图集))。
* 只有 Sprites 所包含的 texture 才会被添加到 the SpriteBatchNode.
* 所有添加到 SpriteBatchNode
的 Sprites 都会一次性绘制
* 如果 Sprites 没有被添加到 SpriteBatchNode 那么它们会一个一个的绘制 ,这样做效率低
- 只接受 Sprite 或者他的子类 eg: particles(颗粒), labels and layer 不能添加到 SpriteBatchNode.
- 所有 children 的 Aliased/Antialiased 都不能相互混合.因为 "alias" 是 texture(纹理)的一个属性所有的 sprites共享同样的 texture, and all the sprites share the same texture.
* @since v0.7.1
class CC_DLL SpriteBatchNode : public Node, public TextureProtocol
static const int DEFAULT_CAPACITY = 29;
/** 使用 Texture2D 和 capacity 创建一个 SpriteBatchNode
如果 capacity 的 runtime 空间不够用,那么 runtime 空间会增加 33%
static SpriteBatchNode* createWithTexture(Texture2D* tex, int capacity = DEFAULT_CAPACITY);
/** 使用 fileImage (.png, .jpeg, .pvr, etc) 、capacity 创建一个 SpriteBatchNode
如果 capacity 的 runtime 空间不够用,那么 runtime 空间会增加 33%
该文件将使用 TextureMgr 加载.
static SpriteBatchNode* create(const char* fileImage, int capacity = DEFAULT_CAPACITY);
* @js ctor
SpriteBatchNode();
virtual ~SpriteBatchNode();
/**使用 texture2d 、 capacity
初始化一个 SpriteBatchNode
如果 capacity 的 runtime 空间不够用,那么 runtime 空间会增加 33%
bool initWithTexture(Texture2D *tex, int capacity);
/** 使用 fileImage (.png, .jpeg, .pvr, etc) 、capacity 初始化一个 SpriteBatchNode
如果 capacity 的 runtime 空间不够用,那么 runtime 空间会增加 33%
该文件将使用 TextureMgr 加载.
* @js init
* @lua init
bool initWithFile(const char* fileImage, int capacity);
bool init();
/** returns TextureAtlas 对象 */
inline TextureAtlas* getTextureAtlas(void) { return _textureA }
TextureAtlas 对象 */
inline void setTextureAtlas(TextureAtlas* textureAtlas)
if (textureAtlas != _textureAtlas)
CC_SAFE_RETAIN(textureAtlas);
CC_SAFE_RELEASE(_textureAtlas);
_textureAtlas = textureA
/** returns 一个 descendants(任何子类) 数组
这是 BatchNode 特有的.其它情况为了使用 children, 可以使用 getChildren() 代替 */
inline const std::vector&Sprite*&& getDescendants() const { return _ }
void increaseAtlasCapacity();
/** 根据 index 移除一个孩子. 然后根据 doCleanup 参数判断是否需要清理 actions
@warning 从 SpriteBatchNode 移除一个 children 非常慢
void removeChildAtIndex(int index, bool doCleanup);
void appendChild(Sprite* sprite);
void removeSpriteFromAtlas(Sprite *sprite);
int rebuildIndexInOrder(Sprite *parent, int index);
int highestAtlasIndexInChild(Sprite *sprite);
int lowestAtlasIndexInChild(Sprite *sprite);
int atlasIndexForChild(Sprite *sprite, int z);
/* 使用这个方法排序 Sprites,但是不要手动调用这个方法 */
void reorderBatch(bool reorder);
// Overrides
// TextureProtocol
virtual Texture2D* getTexture(void)
virtual void setTexture(Texture2D *texture)
*当这个功能在 js or lua 里面使用时,参数会发生改变
*In js: var setBlendFunc(var src, var dst)
virtual void setBlendFunc(const BlendFunc &blendFunc)
virtual const BlendFunc& getBlendFunc(void)
virtual void visit(void)
virtual void addChild(Node* child) override{ Node::addChild(child);}
virtual void addChild(Node * child, int zOrder) override { Node::addChild(child, zOrder);}
virtual void addChild(Node * child, int zOrder, int tag)
virtual void reorderChild(Node *child, int zOrder)
virtual void removeChild(Node *child, bool cleanup)
virtual void removeAllChildrenWithCleanup(bool cleanup)
virtual void sortAllChildren()
virtual void draw(void)
protected:
/** 在索引位置的 texture atlas 插入一个 quad(顶点的坐标位置,纹理的坐标位置和颜色信息). Sprite 不会被加入到孩子们的数组。
这个方法会在你使用一个很大的 AtlasSrite 时或者大多数 Sprite 都不会更新时调用
例如: 一块地图 (TMXMap) or 一个标签有很多的字符(LabelBMFont)
void insertQuadFromSprite(Sprite *sprite, int index);
/** 在索引位置的 texture atlas 更新一个 quad(顶点的坐标位置,纹理的坐标位置和颜色信息). Sprite 不会被加入到孩子们的数组。
这个方法会在你使用一个很大的 AtlasSrite 时或者大多数 Sprite 都不会更新时调用
例如: 一块地图 (TMXMap) or 一个标签有很多的字符(LabelBMFont)
void updateQuadFromSprite(Sprite *sprite, int index);
/* 这个方法和 "addQuadFromSprite 相反.
它添加 sprite children/descendanta(子类) 到批处理数组,但是它不把更新添加到 texture atlas
SpriteBatchNode * addSpriteWithoutQuad(Sprite *child, int z, int aTag);
void updateAtlasIndex(Sprite* sprite, int* curIndex);
void swap(int oldIndex, int newIndex);
void updateBlendFunc();
TextureAtlas *_textureA
BlendFunc _blendF
// 所有的子类: children, grand children, etc...
// 不需要 retain/release 这些对象,因为它们已经在 _children 里面保留了
// 所以这种情况下使用 std::vector&Sprite*& 略快与使用 cocos2d::Array
std::vector&Sprite*& _
// end of sprite_nodes group
#endif // __CC_SPRITE_BATCH_NODE_H__
&&&&推荐文章:
【上篇】【下篇】cocos2dX 番外篇之CCSpriteBatchNode
嗯, 今天我们没事干, 闲的蛋疼, 干脆我们创建精灵玩玩吧, 我随手一打, 我去, 出了一万个精灵, 感觉我就是万能的上帝啊, 一万个( 旁白: 请不要放弃治疗好么), 嘿嘿, 看看一万个精灵是啥样:
看起来很不错啊( 旁白: 等等, 那个帧数怎么下降这么多啊), 额, 竟然被妹纸看出来了, 好吧, 我们进入今天的课程CCSpriteBatchNode
vcD4KPHA+1NrTzs+3tcTEs9K7yrG/zCwgztLDx7/JxNy74bTzwb+1xLvm1sbEs9K7uPa+q8HpKCCxyMjnt6Kz9rXE19O1rywgy9G8r7XE0MfQx9auwOApLCDO0sPHtrzKx8q508PNrNK71cXOxsDtzbzGrLS0vai1xCwgyOe5+9K71cXSu9XFtcS9+NDQ5NbIviwg1eK49tCnwsrO0r7N1rvE3LrHusfByywgy/nS1Nahyv2yu7/JsdzD4rXEvs29tbXNwcssILb4x9LDv9K7tM62vLvhvavNvM/xzsbA7bzT1Ni1vcTatOYoILbU09q809TYtb3E2rTmLCDT0MXz09HLtb/J0tTWsb3T1Nq8xsr9tcTKsbryJiM0MzsxLCC/ydLUsaPWpLK7sbvKzbfFLCDV4srHuPayu7TttcTW99LiLCC1q8rHztLDx73xzOzW99Kqyse9skNDU3ByaXRlQmF0Y2hOb2RlLCDV4rj2u+HB9LW91+6687XE"高级篇"里面讲解),
在游戏中最直观的效果就是卡顿, 为了解决这个问题, cocos2dX为我们引进了CCSpriteBatchNode, 我们就来看看CCSpriteBatchNode有什么神奇的地方吧
对了, 关于左下角的三行数字我解释一下:
第一行: 当前场景的渲染批次, 简单的可以理解为当前场景绘制了多少个精灵
第二行: 渲染每一帧消耗的时间
第三行: FPS, 每秒绘制的帧数
渲染批次越小, 游戏越流畅, FPS越小, 游戏越卡顿
可以在AppDelegate.cpp里面设置显示/隐藏
测试的时候都建议打开, 发布时候隐藏就行
先看看用法:
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create( 图片文件, 默认子节点数);
撸个代码先:
//创建批次渲染对象, 并添加到当前图层
CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create( "CloseSelected.png", 10000);
addChild( batchNode);
for ( int i = 0; i getTexture()); //从CCSPriteBatchNode里面获取纹理用来创建精灵
sprite->setPosition( ccp( CCRANDOM_0_1() * 480, CCRANDOM_0_1() * 320));
//取随机坐标CCRANDOM_0_1代表随机生成0~1之间的数字
batchNode->addChild( sprite);
//添加到CCSpriteBatchNode
看看, 我们是不是指渲染了一个对象, 帧率也跑起来了, 游戏也不卡了, 吃嘛嘛香, 身体倍棒( 旁白: 你今天是不是抽风了啊)
嗯, 这个, 今天的就讲完了, 不过还有几点要注意:
CCSpriteBatchNode在创建的时候默认的子节点数是29, 但是数量不够的时候会自己增加
使用CCSpriteBatchNode的时候只能使用同一张纹理贴图
使用CCSpriteBatchNode的时候不能指定zOrder, 就是不能指定谁在前谁在后
嗯, 今天貌似还真的完了, 大家有疑问/心得多在群里交流:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'cocos2d-x渲染优化介绍 - cocos2dx技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho
cocos2d-x渲染优化介绍
cocos2d-x渲染优化
左下角显示fps的意思是:第一行代表渲染多少次(感觉是调用了多少次draw),次数越少越好,第二行代表每渲染一次花费的时间,时间越少越好,第三行代表者每秒显示的频率,越大越好。
如果直接创建sprite::create(文件名),如果使用同一个文件创建2个sprite,那么会渲染2次。这样不好,如果想减少渲染次数,可以用SpriteBatchNode。
SpriteBatchNode的使用方法是:先创建一个SpriteBatchNode,参数为一个素材图片,然后将这个SpriteBatchNode加到layer上,然后使用这个素材图片创建无数个sprite,加到SpriteBatchNode上,位置是针对layer的。无论增加多少sprite,渲染次数都为1。
如果需要渲染不止一个素材图片的时候,可以先把素材图片通过zwoptex做成一个素材图片和一个plist,然后使用把plist加入SpriteFrameCache缓存中,然后使用这个合成后的素材图片创建一个SpriteBatchNode,然后再用SpriteFrameCache的getSpriteFrameByName方法,参数为原始图片的名字,得到一个动画帧,然后将动画帧创建成sprite即可,这样可以使用无数个素材图片绘制无数个sprite,渲染次数都为1。
如果渲染不止一个合成图片的时候,可以将多个合成图片组成一个大的合成图片,但是这样会导致游戏的包很大,所以最好不要这样,而是,在一个layer上加上多个SpriteBatchNode,每个SpriteBatchNode对应一个合同图片,不过这样的话,渲染次数就不是1了,而是有几个SpriteBatchNode,渲染次数就是几。
你还没有登录,请先或!
Unity3D技术交流1群
泰课Unity3D公开课
工作时间:9:00 - 18:30
北京客服:010 -
广州客服:020 -龙图教育:cocos2dx之精灵类Sprite使用方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
龙图教育:cocos2dx之精灵类Sprite使用方法
||文档简介
深圳前海中清龙图教育科技有限公司(简称“龙...|
总评分0.0|
&&c​o​c​o​sd​x​之​精​灵​类​S​p​r​i​t​e​的​使​用​方​法
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 sprite 的文章

 

随机推荐