91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

簡述CCNode和Sprite的渲染過程

發布時間:2020-04-01 06:08:53 來源:網絡 閱讀:478 作者:螞蟻雄心 欄目:開發技術

Sprite創建時,加載紋理,產生紋理id。Sprite重寫(override)Node中的draw

void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

{

    // Don't do calculate the culling if the transform was not updated

    _insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;


    if(_insideBounds)

    {

        _quadCommand.init(_globalZOrder, _texture->getName(), getGLProgramState(), _blendFunc, &_quad, 1, transform);

        renderer->addCommand(&_quadCommand);

#if CC_SPRITE_DEBUG_DRAW

        _debugDrawNode->clear();

        Vec2 vertices[4] = {

            Vec2( _quad.bl.vertices.x, _quad.bl.vertices.y ),

            Vec2( _quad.br.vertices.x, _quad.br.vertices.y ),

            Vec2( _quad.tr.vertices.x, _quad.tr.vertices.y ),

            Vec2( _quad.tl.vertices.x, _quad.tl.vertices.y ),

        };

        _debugDrawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0));

#endif //CC_SPRITE_DEBUG_DRAW

    }

}

將對應的頂點信息,紋理id,視圖矩陣加入render隊列。

draw函數在什么時候被調用?

請看Node中的visit函數

void Node::visit(Renderer* renderer, const Mat4 &parentTransform, uint32_t parentFlags)

{

    // quick return if not visible. children won't be drawn.

    if (!_visible)

    {

        return;

    }


    uint32_t flags = processParentFlags(parentTransform, parentFlags);


    // IMPORTANT:

    // To ease the migration to v3.0, we still support the Mat4 stack,

    // but it is deprecated and your code should not rely on it

    Director* director = Director::getInstance();

    director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

    director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewTransform);

    

    bool visibleByCamera = isVisitableByVisitingCamera();


    int i = 0;


    if(!_children.empty())

    {

        sortAllChildren();

        // draw children zOrder < 0

        for( ; i < _children.size(); i++ )

        {

            auto node = _children.at(i);


            if ( node && node->_localZOrder < 0 )

                node->visit(renderer, _modelViewTransform, flags);

            else

                break;

        }

        // self draw

        if (visibleByCamera)

            this->draw(renderer, _modelViewTransform, flags);


        for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)

            (*it)->visit(renderer, _modelViewTransform, flags);

    }

    else if (visibleByCamera)

    {

        this->draw(renderer, _modelViewTransform, flags);

    }


    director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

    

    // FIX ME: Why need to set _orderOfArrival to 0??

    // Please refer to https://github.com/cocos2d/cocos2d-x/pull/6920

    // reset for next frame

    // _orderOfArrival = 0;

}

visit首先根據zorder排列子節點,先調用zorder小于0的子節點的draw函數,再調用自身的draw,接著再調用zorder大于0的子節點的draw函數,最后渲染時,按照render中隊列的先后順序,渲染所有節點。

void Director::drawScene()

  if (_runningScene)

    {

        //clear draw stats

        _renderer->clearDrawStats();

        

        //render the scene

        _runningScene->render(_renderer);---------調用所有節點的visit和draw函數,添加節點渲染信息到渲染隊列中

        

        _eventDispatcher->dispatchEvent(_eventAfterVisit);

    }


    // draw the notifications node

    if (_notificationNode)

    {

        _notificationNode->visit(_renderer, Mat4::IDENTITY, 0);

    }


    if (_displayStats)

    {

        showStats();

    }

    _renderer->render();------------------渲染所有節點

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山丹县| 淮南市| 海丰县| 兴城市| 集贤县| 海盐县| 安乡县| 姚安县| 昭平县| 德州市| 塔河县| 新巴尔虎右旗| 乐平市| 突泉县| 阿坝县| 泰宁县| 嘉义市| 秭归县| 墨竹工卡县| 平潭县| 西昌市| 汽车| 牙克石市| 民县| 南召县| 株洲市| 平舆县| 治县。| 米易县| 罗田县| 商河县| 明溪县| 天祝| 铁力市| 平定县| 黑河市| 曲阳县| 梅州市| 诏安县| 洱源县| 张家港市|