美文网首页
5-GL calls

5-GL calls

作者: porridgechen890 | 来源:发表于2018-12-08 00:53 被阅读20次

渲染调用的次数越少,游戏的执行效率越高。

一、渲染一张图片就有一次draw call

bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto sp1 = Sprite::create("CloseNormal.png");
    sp1->setPosition(Vec2(origin.x + visibleSize.width/2 - 200, origin.y + visibleSize.height/2));
    this->addChild(sp1);

    auto sp2 = Sprite::create("HelloWorld.png");
    sp2->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2));
    this->addChild(sp2);

    return true;
}
image.png

这里是2张不同的图,所以GL calls是2。

二、cocos 3.x 版本里自动实现了批量渲染

bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto sp1 = Sprite::create("CloseNormal.png");
    sp1->setPosition(Vec2(origin.x + visibleSize.width/2 - 200, origin.y + visibleSize.height/2));
    this->addChild(sp1);

    auto sp2 = Sprite::create("HelloWorld.png");
    sp2->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2));
    this->addChild(sp2);

    for (int i = 0; i < 5; ++i)
    {
        auto sp = Sprite::create("CloseNormal.png");
        sp->setPosition(Vec2(origin.x + visibleSize.width/2 - 200 + i*100, origin.y + 150));
        this->addChild(sp);
    }

    return true;
}
image.png

比我预想的要多一次,具体原因不清楚。

三、利用SpriteFrameCache来减少GL calls

bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    SpriteFrameCache::getInstance()->addSpriteFramesWithFile("x.plist");

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto sp1 = Sprite::createWithSpriteFrameName("CloseNormal.png");
    sp1->setPosition(Vec2(origin.x + visibleSize.width/2 - 200, origin.y + visibleSize.height/2));
    this->addChild(sp1);

    auto sp2 = Sprite::createWithSpriteFrameName("HelloWorld.png");
    sp2->setPosition(Vec2(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2));
    this->addChild(sp2);

    for (int i = 0; i < 5; ++i)
    {
        auto sp = Sprite::createWithSpriteFrameName("CloseNormal.png");
        sp->setPosition(Vec2(origin.x + visibleSize.width/2 - 200 + i*100, origin.y + 150));
        this->addChild(sp);
    }

    return true;
}
image.png

三、cocos 3.x 版本里的绘制剔除

当一个元素移动到屏幕之外,就不进行绘制。

bool HelloWorld::init()
{
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto sp1 = Sprite::create("CloseNormal.png");
    sp1->setPosition(Vec2(origin.x + visibleSize.width/2 - 200, origin.y + visibleSize.height/2));
    this->addChild(sp1);

    auto sp2 = Sprite::create("HelloWorld.png");
    sp2->setPosition(Vec2(origin.x - sp2->getContentSize().width*10, origin.y + visibleSize.height/2));
    this->addChild(sp2);

    return true;
}
image.png

三、相关话题

cocos2dx性能优化
https://blog.csdn.net/wxc237786026/article/details/50924408

四、参考文章

https://www.cnblogs.com/zsychanpin/p/7250314.html
https://www.cocos.com/docs/native/v2/optimizations/how-to-optimise-memory-usage/zh.html

相关文章

网友评论

      本文标题:5-GL calls

      本文链接:https://www.haomeiwen.com/subject/orrkdxtx.html