前言:众多周知,batchNode可以降低drawCall提高渲染效率。原因为batchNode使用一次渲染,批次生成多个sprite。batchNode同时可以将N张切割的散图整合成一张大图,提供给GPU渲染,以下贴出本人试验出的一些配套用法。
第一种方法:
-- 根节点。
local layer = cc.LayerColor:create(cc.c4b(0, 100, 100, 100))
-- 加载纹理到内存。
local spriteFrameCache = cc.SpriteFrameCache:getInstance()
spriteFrameCache:addSpriteFrames("building.plist","building.png")
-- 直接通过大图创建。
local batchNode = cc.SpriteBatchNode:create("building.png")
layer:addChild(batchNode)
-- 从内存拿出与创batchNode相同大图里面小图的纹理加入到batchNode即可。
local spr = display.newSprite("#building/build_city.png")
batchNode:addChild(spr)
以上:1,往纹理缓存添加大图资源。
2,创建一个以1添加的大图为资源的batchNode。
3,同个内存取出与1中plist配置路径的纹理散块,添加到batchNode。
4,将layer加入到场景中即可看到DrawCall为1。
同样有第二种方法:
-- 通过batchNode取出其在内存中的纹理,此时创建的图片为一整张加载的图片。
local spr = cc.Sprite:createWithTexture(batchNode:getTexture())
batchNode:addChild(spr)
第三种方法:
-- 通过batchNode取出其在内存中的纹理,只取出从0,0开始宽高为100的纹理。
local spr = cc.Sprite:createWithTexture(batchNode:getTexture(), cc.rect(0, 0, 100, 100))
batchNode:addChild(spr)
ps:当然,往batchNode里面addchild的时候,不能添加与之本身纹理相异的纹理块。
彩蛋:其实第一种方法,可以解决在设置orbitCamera的时候,渲染超出屏幕的出现的黑边。:)
local function Set3dView(root)
local orbit = cc.OrbitCamera:create(0,1,0,0,-20,90, 0)
root:runAction(cc.Sequence:create{orbit})
end