0%

CVP认证学习笔记--(何小成)018--批处理纹理绘图

概念

本节课讲了cocos中的批处理纹理绘图,一般情况下,每绘制一个精灵,都需要绘制一个纹理,而cocos中提供批处理纹理绘图SpriteBatchNode,查阅官方文档 http://www.cocos.com/doc/cocos2d-x-3.0/dd/d2f/classcocos2d_1_1_sprite_batch_node.html#details 这其中对SpriteBatchNode的解释如下:
SpriteBatchNode与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成(一般称为”batch draw”)
一个SpriteBatchNode可以引用一个且只有一个纹理(一个图像文件或一个纹理集),只有包含该纹理的Sprite可以加入到SpriteBatchNode中。 加入SpriteBatchNode的所有Sprite在一次OpenGL ES调用内绘制完成,而未加入SpriteBatchNode的Sprite每一个都需要单独调用OpenGL ES绘制,这样效率比较低。
限制:
只有Sprite或Sprite的子类对象才允许作为子节点(或孙子节点,等等)加入到SpriteBatchNode中,例如:particles、labels和layer不能加入SpriteBatchNode。
所有子节点的”alias”属性必须统一为Aliased或Antialiased,不能二者同时存在,因为”alias”是纹理的属性,而SpriteBatchNode全部的子节点共用一个纹理。
由cocos官方文档可见,cocos中批处理纹理绘图,可以使多个Sprite在一个OpenGL ES调用内绘制完成,很明显,这样减少了Sprite绘制的次数,从而提高画面渲染的效率。

作业

使用SpriteBatchNode的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var HelloWorldLayer = cc.Layer.extend({
sprite:null,
ctor:function () {
//////////////////////////////
// 1. super init first
this._super();
var add=new cc.MenuItemFont("添加Sprite",this.callback,this);
var menu=new cc.Menu(add);
this.addChild(menu,10000);
return true;
},
callback:function(obj)
{
if(this.sprite==null){
this.sprite=new cc.SpriteBatchNode("res/HelloWorld.png",1);
this.addChild(this.sprite);
}
var sp2=new cc.Sprite(this.sprite.texture,cc.rect(0,0,195,270));
this.sprite.addChild(sp2);
sp2.setPosition(Math.random()*300+300,Math.random()*300);
sp2.setScale(Math.random());
sp2.setRotation(Math.round(Math.random()*360));
}
});

var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();
var layer = new HelloWorldLayer();
this.addChild(layer);
}
});

本节课内容的api介绍很简单,重点是要理解SpriteBatchNode的运作原理,具体查阅官方文档就能明白,很多时候程序中可以通过SpriteBatchNode来优化Sprite渲染次数,从而提高运行效率。

最终效果

http://www.cocoscvp.com/usercode/2016_04_23/5608bd70128bddf09770f642e784f35643acadc9/

大爷赏点儿呗.

欢迎关注我的其它发布渠道