请选择 进入手机版 | 继续访问电脑版
查看: 965|回复: 2

crossapp渲染机制教程

[复制链接]
最佳答案
0 
a6965921 发表于 2014-5-30 10:25:35 | 显示全部楼层 |阅读模式
crossapp渲染机制教程


先从最起始的地方开始看
从mainloop开始 这个地方就是每秒刷新60次 
void CCDisplayLinkDirector::mainLoop(void)
{
    if (m_bPurgeDirecotorInNextLoop)
    {
        m_bPurgeDirecotorInNextLoop = false;
        purgeDirector();
    }
    else if (! m_bInvalid)
     {
         // calculate "global" dt
         calculateDeltaTime();
         
         if (! m_bPaused)
         {
             CAScheduler::getScheduler()->update(m_fDeltaTime);
         }
         
         if (m_bDisplayStats)
         {
             showStats();
         }
         
         // draw the notifications node
         if (m_pNotificationNode)
         {
             m_pNotificationNode->visit();
         }
         
         drawScene();
         
         CCPoolManager::sharedPoolManager()->pop();        
     }
}


我先说下 为什么mainloop为什么要加个参数void 据说是为了兼容c 反正就当成没这个参数好了
 if (! m_bPaused)
         {
             CAScheduler::getScheduler()->update(m_fDeltaTime);
         }
         这个是定时器的东西 现在先不说这个 下次再说 视图里的定时器刷新都来自这里



  CCPoolManager::sharedPoolManager()->pop();  这个是释放变量的东西 今天也不说这个 下次再说

  然后看到drawScene()方法 这个是渲染的地方 今天就讲渲染

看到下他的定义
  void CCDirector::drawScene(float dt)
{
    //tick before glClear: issue #533
    
    if (m_nDrawCount > 0)
    {
        --m_nDrawCount;
        
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        
        //做动画用的 矩形变换 今天不做详解 下次再讲
        kmGLPushMatrix();
        
        // draw the scene
        if (m_pRootWindow)
        {
            m_pRootWindow->visit();
        }
        
        kmGLPopMatrix();
        
        m_uTotalFrames++;
        
        // swap buffers
        if (m_pobOpenGLView)
        {
            m_pobOpenGLView->swapBuffers();
        }
        
        if (m_bDisplayStats)
        {
            calculateMPF();
        }
    }
}


 // draw the scene


        if (m_pRootWindow)
        {
            m_pRootWindow->visit();
        }
        看到这个核心的地方   visit就是渲染视图的核心函数 接下来我们看看他是怎么实现的
m_pRootWindow这个是根节点。。。渲染都从这个节点开始 往下面渲染的




void CAView::visit()
{
    // quick return if not visible. children won't be drawn.
    if (!m_bVisible)
    {
        return;
    }
    
    if (m_bDisplayRange)
    {
        CAView::rendering();
    }
    else
    {
        glEnable(GL_SCISSOR_TEST);// 开启显示指定区域
        
        CCPoint point = this->convertToWorldSpace(CCPoint(0, this->getContentSize().height));
        point = CCDirector::sharedDirector()->convertToGL(point);
        CCSize size = this->getContentSize();
        
        CCEGLView* pGLView = CCEGLView::sharedOpenGLView();
        float glScaleX = pGLView->getScaleX();
        float glScaleY = pGLView->getScaleY();
        
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
        
        float off_X = 0;
        float off_Y = 0;
        
#else
        
        float off_X = pGLView->getViewPortRect().origin.x;
        float off_Y = pGLView->getViewPortRect().origin.y;
        
#endif
        
        float scaleX = this->getScaleX();
        float scaleY = this->getScaleY();
        
        CAView* parent = this->getSuperview();
        while (parent)
        {
            scaleX *= parent->getScaleX();
            scaleY *= parent->getScaleY();
            parent = parent->getSuperview();
        }
        
        float x = point.x * glScaleX + off_X;
        float y = point.y * glScaleY + off_Y;
        float width = size.width * scaleX * glScaleX;
        float height = size.height * scaleY * glScaleY;
        
        glScissor(x, y, width, height);// 只显示当前窗口的区域
        
        CAView::rendering();
        
        glDisable(GL_SCISSOR_TEST);// 禁用
    }
}

直接看
 CAView::rendering();




 void CAView::rendering()
{
    kmGLPushMatrix();
    
    if (m_pGrid && m_pGrid->isActive())
    {
        m_pGrid->beforeDraw();
    }
    
    this->transform();
    
    CAView* pNode = NULL;
    unsigned int i = 0;
    
    //这个地方就是从根节点 到子节点渲染
    if(m_pSubviews && m_pSubviews->count() > 0)
    {
        this->sortAllSubviews();
        // draw children zOrder data;
        for( ; i num; i++ )
        {
            pNode = (CAView*) arrayData->arr;
            
            if ( pNode && pNode->m_nZOrder visit();
            }
            else
            {
                break;
            }
        }
        
        // self draw
        this->draw();
        
        for( ; i num; i++ )
        {
            pNode = (CAView*) arrayData->arr;
            if (pNode)
            {
                pNode->visit();
            }
        }
    }
    else
    {
        this->draw();
    }
    
    //this->draw();
    
    // reset for next frame
    m_uOrderOfArrival = 0;
    
    if (m_pGrid && m_pGrid->isActive())
    {
        m_pGrid->afterDraw(this);
    }
    
    kmGLPopMatrix();

//    if(m_pSubviews && m_pSubviews->count() > 0)
//    {
//        this->sortAllSubviews();
//        // draw children zOrder data;
//
//        for(unsigned int i = 0 ; i num; i++ )
//        {
//            CAView* pNode = (CAView*) arrayData->arr;
//            if (pNode)
//            {
//                pNode->visit();
//            }
//        }
//    }
    
}
教程写完了 写的有点简单了    下次时间多的话 再写的详细点


最佳答案
0 
C男 发表于 2014-5-30 11:05:28 | 显示全部楼层
干得漂亮!!又见到你了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐阅读 More>

© 2001-2015 9秒社团

合作伙伴

公司简介 | 联系方式
COPYRIGHT©2015 ZHONGQINGLONGTU NETWORK CO.LTD ALL RIGHTS RESERVED.ICP备11023195号-4
北京中清龙图网络技术有限公司
返回顶部 返回列表