鍍金池/ 教程/ Java/ 批次渲染
游戲暫停和觸摸屏蔽
游戲場(chǎng)景過(guò)渡
碰撞檢測(cè)
跨平臺(tái)移植和廣告植入
批次渲染
觸摸事件和優(yōu)先級(jí)
背景音樂(lè)和音效
別急,先處理好CCScene和CCLayer的關(guān)系
自定義敵機(jī)精靈
UFO層特殊道具
主角的登場(chǎng)和幀動(dòng)畫(huà)
引擎坐標(biāo)系,錨點(diǎn)和背景滾動(dòng)
分?jǐn)?shù)的本地存儲(chǔ)
子彈層的處理
搞個(gè)飛機(jī)來(lái)玩玩

批次渲染

飛機(jī)發(fā)射子彈要注意的幾點(diǎn)是:

1.子彈的渲染效率

2.子彈的初始位置和飛行效果

3.子彈的回收

4.子彈層提供的接口

本文先講解子彈的渲染效率問(wèn)題。看兩個(gè)很典型的例子,將1000個(gè)icon圖精靈加入游戲。(左下角三個(gè)值從上到下分別是精靈數(shù),渲染每幀所需要的時(shí)間,幀數(shù))

1.普通渲染

(1)示例

    for(int i = 0;i < 1000;++i){
     int x = arc4random()%960;
     int y = arc4random()%640;
     CCSprite* testIcon = CCSprite::create("Icon.png");
     testIcon->setPosition( ccp(x, y) );
     this->addChild(testIcon);
    }

(2)效果

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/5.1.jpeg" alt="" />

2.批次渲染

(1)示例

    CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);
    batchNode->setPosition(CCPointZero);
    this->addChild(batchNode);

    for(int i = 0;i < 1000;++i){
     int x = arc4random()%960;
     int y = arc4random()%640;
     CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());
     testIcon->setPosition( ccp(x, y) );
     batchNode->addChild(testIcon);
    }

(2)效果圖

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/5.2.jpeg" alt="" />

3.渲染機(jī)制

從左下角的渲染次數(shù)(第一行)和渲染FPS(第三行),我們就可以看出,普通渲染需要進(jìn)行1000次,而批次渲染只要1次就可以完成。差別在哪?CCSpriteBatchNode這個(gè)精靈批次渲染類。

普通渲染機(jī)制:

    準(zhǔn)備,渲染,清除。準(zhǔn)備,渲染,清除。...準(zhǔn)備,渲染,清除。100次啊100次!?。?/code>

批次渲染機(jī)制:

    準(zhǔn)備,渲染,渲染....渲染,清除。是不是快多了?

但必須注意的是,使用CCSpriteBatchNode,所有的精靈必須是同一張圖,也不能指定精靈的深度,所有精靈必須在同一渲染層。

4.子彈的添加

子彈的添加其實(shí)就是使用CCSpriteBatchNode的最佳例子。

    bool BulletLayer::init()
    {
        bool bRet=false;
        do
        {
            CC_BREAK_IF(!CCLayer::init());
            CCTexture2D *texture = CCTextureCache::sharedTextureCache()->textureForKey("ui/shoot.png");
            bulletBatchNode = CCSpriteBatchNode::create(texture);//bulletBatchNode為CCSpriteBatchNode類型成員變量
            this->addChild(bulletBatchNode);

            bRet=true;
        } while (0);
        return bRet;
    }

    void BulletLayer::AddBullet(float dt)
    {
        CCSprite* bullet=CCSprite::createWithSpriteFrameName("bullet1.png");
        bulletBatchNode->addChild(bullet);//這里子彈要添加到bulletBatchNode中,效果如下左圖
        //this->addChild(bullet);換成這句渲染批次和FPS,如下右圖
    }

我們這里調(diào)用

    this->schedule(schedule_selector(BulletLayer::AddBullet),0.01f);

看一下效果,因?yàn)殚g隔時(shí)間0.01s,所以子彈看起來(lái)是柱狀的,好丑。。。看一下,渲染批次和FPS的比較:一個(gè)是4(有其他精靈),另一個(gè)則是181。如果你發(fā)現(xiàn)子彈只是在左下角而且精靈數(shù)不對(duì),淡定。。。這里子彈已經(jīng)做了回收處理,而且子彈的初始位置和移動(dòng)都設(shè)置好了。這些將在[下一篇][3]介紹,這里先放圖。

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/5.3.jpeg" alt="" />

http://wiki.jikexueyuan.com/project/cocos2d-x-getting-real/images/5.4.jpeg" alt="" />