zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    回复结束
    UVA 10537
    RTP 记录 log 该机制
    python 时间处理
    照片总结---选择适当的NoSQL
    博客测试:博客系统i94web beta1.0 申请测试
    SQL随着子查询结果更新多个字段
    2机器学习实践笔记(k-最近邻)
    Android_Service组件详解
    Android多媒体分析-通过MediaStore获取Audio信息
  • 原文地址:https://www.cnblogs.com/wantnon/p/4249914.html
Copyright © 2011-2022 走看看