• cocos2dx 3.x避免空customCommand


    1,导致性能悲剧的写法:

    class A:public CCNode{

    public:

      A(){

        m_sprite=NULL;

        m_isDrawDebug=false;

      }

      virtual~A(){}

      bool init(){

        this->CCNode::init();

        //create m_sprite

        m_sprite=CCSprite::create();

        m_sprite->initWithFile("a.png");

        addChild(m_sprite);

        ....

        return true;

      }

      void draw(Renderer* renderer, const Mat4& transform, uint32_t transformFlags){

        _customCommand_drawDebug(_globalZOrder);

            _customCommand_drawDebug = CC_CALLBACK_0(A::onDrawDebug,this,transform, transformFlags);

            renderer->addCommand(&_customCommand_drawDebug);

        }

      void onDrawDebug(const Mat4 &transform, uint32_t transformFlags){

          if(m_isDrawDebug){

          //draw debug

          ...

        }

      }

    public:

      CCSprite*m_sprite;

      bool m_isDrawDebug;

      CustomCommand _customCommand_drawDebug;

    };

    上面写法,无论m_isDrawDebug是true还是false,如果场景中加1000个对象a,drawCall数量为1000。

    2,不损失性能的写法:

    class A:public CCNode{

    public:

      A(){

        m_sprite=NULL;

        m_isDrawDebug=false;

      }

      virtual~A(){}

      bool init(){

        this->CCNode::init();

        //create m_sprite

        m_sprite=CCSprite::create();

        m_sprite->initWithFile("a.png");

        addChild(m_sprite);

        ....

        return true;

      }

      void draw(Renderer* renderer, const Mat4& transform, uint32_t transformFlags){

              if(m_isDrawDebug){

                  _customCommand_drawDebug(_globalZOrder);

                  _customCommand_drawDebug = CC_CALLBACK_0(A::onDrawDebug,this,transform, transformFlags);

                  renderer->addCommand(&_customCommand_drawDebug);

              }

          }

      void onDrawDebug(const Mat4 &transform, uint32_t transformFlags){

        //draw debug

        ...

      }

    public:

      CCSprite*m_sprite;

      bool m_isDrawDebug;

      CustomCommand _customCommand_drawDebug;

    };

    上面写法当m_isDrawDebug为false时,如果场景中加1000个对象a,则drawCall数量为1。

  • 相关阅读:
    js基础 ---- 为什么定时器时间不准确
    vue 3.0 ---- reactive函数
    vue 3.0 ---- ref函数
    vue 3.0 ---- setup函数
    vue 3.0 ---- 什么是vite
    Vue warn]: Error in event handler for "click": "TypeError: fns.apply is not a function"
    vueJs 自动清除文本框的 空格
    vue 报错解决 -------- DOMException: Failed to execute 'insertBefore' on 'Node' --------------------"NotFoundError: Failed to execute 'insertBefore' on 'Node': The node before
    vue 中 uuid 的使用以及作用
    赞不绝口钉钉自动点赞器
  • 原文地址:https://www.cnblogs.com/wantnon/p/4249914.html
Copyright © 2020-2023  润新知