Cocos2d 通过QuadCommand在同一渲染层级下进行GL Call 优化

在Cococs2d中同时顺序绘制N个材质ID/纹理ID相同的可绘制对象时(同一绘制帧内),可以节省大量DrawCall(同一渲染层级)

function testButtonOpt:runTest1()
    --在同一帧内 在同一绘制顺序下 绘制材质ID/TextureID 可节省大量DrawCall 即使可绘制对象的材质纹理发生变化,但是只要是同一材质 都可以节省

    --这个情况下 默认绘制顺序为
    -- ZOrder 0:
    -- InsertSprite->InsertSprite->InsertSprite ...
    -- ZOrder 1:
    -- bing->bing->bing ...

    --绘制顺序未被打乱

    display.addSpriteFrames("map_res/demon_siege_march.plist")
    display.addSpriteFrames("map_res/dress_1_battle_line.plist")
    for i=1,100 do
        display.newSprite("map_res/map_foot_print.png"):addTo(self, 0):pos(display.cx, display.cy)
        local pFrames = display.newFrames(string.format("walker_ds_d%s_%%.5d.png", 6 ),0,6)
        local pAnimation = display.newAnimation(pFrames, 0.125)
        local bing = cc.Sprite:createWithSpriteFrame(pFrames[1]):addTo(self, 1):pos(display.cx, display.cy + 100)
        bing:playAnimationForever(pAnimation)
    end
end

function testButtonOpt:runTest2()
    --这个情况下 默认绘制顺序为
    -- InsertSprite->bing->InsertSprite->bing
    -- 打乱了绘制顺序

    display.addSpriteFrames("map_res/demon_siege_march.plist")
    display.addSpriteFrames("map_res/dress_1_battle_line.plist")
    for i=1,100 do
        local InsertSprite = display.newSprite("map_res/map_foot_print.png"):addTo(self, 1):pos(display.cx, display.cy)
        local pFrames = display.newFrames(string.format("walker_ds_d%s_%%.5d.png", 6 ),0,6)
        local pAnimation = display.newAnimation(pFrames, 0.125)
        local bing = cc.Sprite:createWithSpriteFrame(pFrames[1]):addTo(self, 1):pos(display.cx, display.cy + 100)
        bing:playAnimationForever(pAnimation)
    end
end

function testButtonOpt:runTest3()
    --这个情况下 因为所有绘制对象都是InsertSprite所使用的TextureID 所以顺序不会被打乱, 但是在实际情况下 很难做到不被打乱(因为不会一次性渲染这么多 基本都是随需求添加 所以没办法保证绘制顺序)

    display.addSpriteFrames("map_res/demon_siege_march.plist")
    display.addSpriteFrames("map_res/dress_1_battle_line.plist")
    for i=1,100 do
        local InsertSprite = display.newSprite("map_res/map_foot_print.png"):addTo(self, i):pos(display.cx, display.cy)
    end
end

猜你喜欢

转载自blog.csdn.net/qq_29094161/article/details/85231266