Cocos2d-x v3.x官方文档】自动批处理(Auto-batching)

转自:http://blog.sina.com.cn/s/blog_923fdd9b0101g12p.html

简介

在游戏的绘制渲染中,往往消耗很多资源和内存,当绘制精灵数量越多,游戏的卡顿会很明显,为了优化和提升渲染效率。Cocos2d-x为我们提供了Auto-batching和SpriteBatchNode。

<wbr></wbr>

Auto-batching 意思是Renderer将多次draw的调用打包成一次big Draw 调用。(又名批处理)。

<wbr></wbr>

SpriteBatchNode 主要用于批量绘制精灵提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显。

<wbr></wbr>

Auto-batching

在3.0版本实现了引擎的逻辑代码与渲染代码的分离,实现了Auto Batch与Auto Culling功能。不再推荐使用SpriteBatchNode提高精灵的绘制效率。

<wbr></wbr>

Auto-culling的支持,Sprite在绘制时会进行检查,超出屏幕的不会发给渲染。

<wbr></wbr>

SpriteBatchNode

它是批处理绘制精灵,主要是用来提高精灵的绘制效率的,需要绘制的精灵数量越多,效果越明显。因为cocos2d-x采用opengl es绘制图片的,opengl es绘制每个精灵都会执行:open-draw-close流程。而SpriteBatchNode是把多个精灵放到一个纹理上,绘制的时候直接统一绘制 该texture,不需要单独绘制子节点,这样opengl es绘制的时候变成了:open-draw()-draw()…-draw()-close(),节省了多次open-close的时间。 SpriteBatchNode内部封装了一个TextureAtlas(纹理图集,它内部封装了一个Texture2D)和一个Array(用来存储 SpriteBatchNode的子节点:单个精灵)。注意:因为绘制的时候只open-close一次,所以SpriteBatchNode对象的所有 子节点都必须和它是用同一个texture(同一张图片)。

<wbr></wbr>

在addChild的时候会检查子节点纹理的名称跟SpriteBatchNode的是不是一样,如果不一样就会出错。

  1. //<wbr>check<wbr>Sprite<wbr>is<wbr>using<wbr>the<wbr>same<wbr>texture<wbr>id</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>
  2. <wbr></wbr>
  3. CCASSERT(sprite->getTexture()->getName()<wbr>==<wbr>_textureAtlas-&gt;getTexture()-&gt;getName(),<wbr><span style="word-wrap:normal; word-break:normal">"CCSprite<wbr>is<wbr>not<wbr>using<wbr>the<wbr>same<wbr>texture<wbr>id"</wbr></wbr></wbr></wbr></wbr></wbr></wbr></span><span style="word-wrap:normal; word-break:normal">);<wbr></wbr></span></wbr></wbr></wbr>

<wbr></wbr>

SpriteBatchNode使用代码示例

  1. auto<wbr>batch<wbr>=<wbr>SpriteBatchNode::create(</wbr></wbr></wbr>"Images/grossini_dance_atlas.png",<wbr>1);<wbr></wbr></wbr>
  2. <wbr></wbr>
  3. addChild(batch,<wbr>0,<wbr>kTagSpriteBatchNode);<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  4. <wbr></wbr>
  5. auto<wbr>sprite1<wbr>=<wbr>Sprite::createWithTexture(batch-&gt;getTexture(),<wbr>Rect(85*0,<wbr>121*1,<wbr>85,<wbr>121));<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  6. <wbr></wbr>
  7. auto<wbr>sprite2<wbr>=<wbr>Sprite::createWithTexture(batch-&gt;getTexture(),<wbr>Rect(85*1,<wbr>121*1,<wbr>85,<wbr>121));<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
  8. <wbr></wbr>
  9. auto<wbr>s<wbr>=<wbr>Director::getInstance()-&gt;getWinSize();<wbr></wbr></wbr></wbr></wbr>
  10. <wbr></wbr>
  11. sprite1->setPosition(<wbr>Point(<wbr>(s.width/5)*1,<wbr>(s.height/3)*1)<wbr>);<wbr></wbr></wbr></wbr></wbr></wbr>
  12. <wbr></wbr>
  13. sprite2->setPosition(<wbr>Point(<wbr>(s.width/5)*2,<wbr>(s.height/3)*1)<wbr>);<wbr></wbr></wbr></wbr></wbr></wbr>
  14. <wbr></wbr>
  15. batch->addChild(sprite1,<wbr>0,<wbr>kTagSprite1);<wbr></wbr></wbr></wbr>
  16. <wbr></wbr>
  17. batch->addChild(sprite2,<wbr>0,<wbr>kTagSprite2);<wbr></wbr></wbr></wbr>

<wbr></wbr>

SpriteBatchNode和SpriteFrameCache结合使用代码示例

<wbr></wbr>

必须保证SpriteFrameCache和SpriteBatchNode加载的是同一纹理贴图。

  1. SpriteFrameCache::getInstance()->addSpriteFramesWithFile("animations/ghosts.plist",<wbr></wbr>"animations/ghosts.png");<wbr><wbr></wbr></wbr>
  2. <wbr></wbr>
  3. SpriteBatchNode<wbr>*batch<wbr>=<wbr>SpriteBatchNode::batchNodeWithFile(<span style="word-wrap:normal; word-break:normal">"animations/ghosts.png"</span><span style="word-wrap:normal; word-break:normal">);<wbr><wbr></wbr></wbr></span></wbr></wbr></wbr>
  4. <wbr></wbr>
  5. addChild(batch,<wbr>0,<wbr>kTagSprite1);<wbr><wbr></wbr></wbr></wbr></wbr>
  6. <wbr></wbr>
  7. Sprite<wbr>*pFather<wbr>=<wbr>Sprite::spriteWithSpriteFrameNam<wbr>e(<span style="word-wrap:normal; word-break:normal">"father.gif"</span><span style="word-wrap:normal; word-break:normal">);<wbr><wbr></wbr></wbr></span></wbr></wbr></wbr></wbr>
  8. <wbr></wbr>
  9. pFather->setPosition(p(<wbr>s.width/2,<wbr>s.height/2));<wbr><wbr></wbr></wbr></wbr></wbr>
  10. <wbr></wbr>
  11. batch->addChild(pFather,<wbr>0,<wbr>kTagSprite2);<wbr><wbr></wbr></wbr></wbr></wbr>
  12. <wbr></wbr>
  13. <wbr><wbr></wbr></wbr>

<wbr></wbr>

SpriteBatchNode vs. Auto-batching

在3.0版本中提供了新的渲染机制,实现引擎逻辑代码和渲染的分离。该版本依然支持SpriteBatchNode,和以前的版本保持一致。但是不再推荐使用SpriteBatchNode。

<wbr></wbr>

Auto-culling的支持,Sprite在绘制时会进行检查,超出屏幕的不会发给渲染。

<wbr></wbr>

使用Auto-batching:

1. 需确保精灵对象拥有相同的TextureId(精灵表单spritesheet);

2. 确保他们都使用相同的材质和混合功能

3. 不再把精灵添加SpriteBatchNode上

<wbr></wbr>

Auto-batching拥有更好的性能提升。

<wbr></wbr>

原帖地址:http://www.cocoachina.com/bbs/read.php?tid=200808&page=1&toread=1#tpc


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值