5-GL calls

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

一、渲染一张图片就有一次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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容