三侧到,渲染流程之manger->update()

manger->update()

{
    int64_t beginTime = ::Effekseer::GetTime(); //開始時間
    for (size_t i = 0; i < m_RemovingDrawSets.size(); i++)
    {
        for (auto& ds : m_RemovingDrawSets[i])
        {
            ds.second.UpdateCountAfterRemoving++;
        }
    }
           //遍歷效果執(zhí)行預更新,每個效果執(zhí)行一次
           //遍歷效果馅闽,若效果已停止則下一次唉擂,若效果沒有粒子實例或者只有root節(jié)點存在,則停止該效果
          //遍歷效果如果GoingToStop為true场靴,則殺掉所有粒子實例包括其子實例如果GoingToStopRoot為true,則殺掉所有粒子實例但不包括其子實例
          //若效果IsRemoving為true港准,做內(nèi)存回收
          //清空 正在渲染的效果 集合旨剥;重新裝填該集合
         //更新渲染幀數(shù)
    BeginUpdate();
    for (auto& drawSet : m_DrawSets)
    {
                //若效果暫停則為0,否則是效果播放速度(幀增量)浅缸。并指定給效果
        float df = drawSet.second.IsPaused ? 0 : deltaFrame * drawSet.second.Speed;
        drawSet.second.GlobalPointer->BeginDeltaFrame(df);
    }

        //遍歷size=20的實例塊集合的集合
    for (auto& chunks : instanceChunks_)
    {
              //size=8000/16的實例塊集合
        for (auto chunk : chunks)
        {
          //更新size=16的實例塊轨帜;若實例狀態(tài)為true則執(zhí)行以下邏輯
        //若實例m_State=INSTANCE_STATE_ACTIVE,則根據(jù)幀增量更新實例
        //若實例m_State=INSTANCE_STATE_REMOVING衩椒,m_State置為INSTANCE_STATE_REMOVED
        //若實例m_State=INSTANCE_STATE_REMOVED蚌父,調(diào)用析構回收實例內(nèi)存哮兰。置實例狀態(tài)false,存活粒子減一
            chunk->UpdateInstances();
        }
    }

     //遍歷效果苟弛;遍歷每個效果的所有動態(tài)參數(shù)喝滞;
     //若效果為show的粒子實例及其子實例不為active則在實例group鏈表中回收該實例。
     //m_updatedFrame當前幀加上增量膏秫,增量置0
    for (auto& drawSet : m_DrawSets)
    {
        UpdateHandleInternal(drawSet.second);
    }
       //遍歷所有的實例塊集合(5000)右遭;
       //對于每個實例塊中粒子存活數(shù)為0的實例塊,將其加入到pooledChunks_缤削;清除掉最后一個實例塊
      //將所有的可創(chuàng)建實例塊offset置0狸演。offset最大值為5000/16,表示當前應當在 實例塊集合[offset]的實例塊中創(chuàng)建實例
    EndUpdate();

    //本次update時間
    m_updateTime = (int)(Effekseer::GetTime() - beginTime);
}

instance->Update(deltaTime, true)

InstanceGlobal 表示rootIntance

void Instance::Update( float deltaFrame, bool shown )
{
    assert(this->m_pContainer != nullptr);
    // 標志位,自己和父實例是否已經(jīng)更新
    m_GlobalMatrix43Calculated = false;
    m_ParentMatrix43Calculated = false;

    if (is_time_step_allowed && m_pEffectNode->GetType() != EFFECT_NODE_TYPE_ROOT)
    {
        /* 音の更新(現(xiàn)狀放置) */
        if (m_pEffectNode->SoundType == ParameterSoundType_Use)
        {
            float living_time = m_LivingTime;
            float living_time_p = living_time + deltaFrame;

            if (living_time <= (float) soundValues.delay && (float) soundValues.delay < living_time_p)
            {
                m_pEffectNode->PlaySound_(*this, m_pContainer->GetRootInstance(), m_pManager);
            }
        }
    }

    float originalTime = m_LivingTime;

    // step time
    // frame 0 - generated time
    // frame 1- now
    if (is_time_step_allowed)
    {
        m_LivingTime += deltaFrame;
    }

    if(shown)
    {
             //若已計算僻他,返回。通過manager更新intance的序列幀數(shù)腊尚;若父實例不為空(指的是父節(jié)點的第一個group里的intance)計算父節(jié)點帶來的影響(父節(jié)點調(diào)用CalculateMatrix吨拗;若節(jié)點不是root,則提取該節(jié)點的繼承參數(shù)(position婿斥,rotation劝篷,scale));
        CalculateMatrix( deltaFrame );
    }
    else if (m_pEffectNode->LocationAbs.type != LocationAbsType::None 
        || m_pEffectNode->LocalForceFields[0].Turbulence != nullptr 
        || m_pEffectNode->LocalForceFields[1].Turbulence != nullptr 
        || m_pEffectNode->LocalForceFields[2].Turbulence != nullptr)
    {
        // If attraction forces are not default, updating is needed in each frame.
        CalculateMatrix( deltaFrame );
    }

    // Get parent color.
    if (m_pParent != NULL)
    {
        if (m_pEffectNode->RendererCommon.ColorBindType == BindType::Always)
        {
            ColorParent = m_pParent->ColorInheritance;
        }
    }

    /* 親の削除処理 */
    if (m_pParent != NULL && m_pParent->GetState() != INSTANCE_STATE_ACTIVE)
    {
        CalculateParentMatrix( deltaFrame );
        m_pParent = nullptr;
    }

    // Create child particles
    if( is_time_step_allowed && (originalTime <= m_LivedTime || !m_pEffectNode->CommonValues.RemoveWhenLifeIsExtinct) )
    {
        GenerateChildrenInRequired(originalTime + deltaFrame);
    }

    UpdateChildrenGroupMatrix();
    // check whether killed?
    bool killed = false;
    if( m_pEffectNode->GetType() != EFFECT_NODE_TYPE_ROOT )
    {
        // if pass time
        if( m_pEffectNode->CommonValues.RemoveWhenLifeIsExtinct )
        {
            if( m_LivingTime > m_LivedTime )
            {
                killed = true;
            }
        }

        // if remove parent
        if( m_pEffectNode->CommonValues.RemoveWhenParentIsRemoved )
        {
            if( m_pParent == nullptr || m_pParent->GetState() != INSTANCE_STATE_ACTIVE )
            {
                m_pParent = nullptr;
                killed = true;
            }
        }

        // if children are removed and going not to generate a child
        if( !killed && m_pEffectNode->CommonValues.RemoveWhenChildrenIsExtinct )
        {
            int maxcreate_count = 0;
            InstanceGroup* group = childrenGroups_;

            for (int i = 0; i < m_pEffectNode->GetChildrenCount(); i++, group = group->NextUsedByInstance)
            {
                auto child = (EffectNodeImplemented*) m_pEffectNode->GetChild(i);

                if (maxGenerationChildrenCount[i] <= m_generatedChildrenCount[i] && group->GetInstanceCount() == 0)
                {
                    maxcreate_count++;
                }
                else
                {
                    break;
                }
            }
            
            if( maxcreate_count == m_pEffectNode->GetChildrenCount() )
            {
                killed = true;
            }
        }
    }
    if(killed)
    {
        // if it need to calculate a matrix
        if( m_pEffectNode->GetChildrenCount() > 0)
        {
            // Get parent color.
            if (m_pParent != nullptr)
            {
                if (m_pEffectNode->RendererCommon.ColorBindType == BindType::Always)
                {
                    ColorParent = m_pParent->ColorInheritance;
                }
            }
        }

        // Delete this particle with myself.
        Kill();
        return;
    }

    // allow to pass time
    is_time_step_allowed = true;
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民宿,一起剝皮案震驚了整個濱河市娇妓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌活鹰,老刑警劉巖哈恰,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異志群,居然都是意外死亡着绷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門锌云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠医,“玉大人,你說我怎么就攤上這事桑涎”蛳颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵攻冷,是天一觀的道長娃胆。 經(jīng)常有香客問我,道長讲衫,這世上最難降的妖魔是什么缕棵? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任孵班,我火速辦了婚禮,結果婚禮上招驴,老公的妹妹穿的比我還像新娘篙程。我一直安慰自己,他們只是感情好别厘,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布虱饿。 她就那樣靜靜地躺著,像睡著了一般触趴。 火紅的嫁衣襯著肌膚如雪氮发。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天冗懦,我揣著相機與錄音爽冕,去河邊找鬼。 笑死披蕉,一個胖子當著我的面吹牛颈畸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播没讲,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眯娱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爬凑?” 一聲冷哼從身側響起徙缴,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘁信,沒想到半個月后于样,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吱抚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年百宇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘豹。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡携御,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出既绕,到底是詐尸還是另有隱情啄刹,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布凄贩,位于F島的核電站誓军,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疲扎。R本人自食惡果不足惜昵时,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一捷雕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壹甥,春花似錦救巷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溯职,卻和暖如春精盅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜酒。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工叹俏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人僻族。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓她肯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鹰贵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355