Как я делаю свою систему объекта компонента ориентированной на многопотоковое исполнение?

Я в настоящее время интегрирую систему компонента объекта, как замечено здесь, с механизмом физики и графическим механизмом. Это было всем штрафом до недавнего времени решение, что физика должна работать в ее собственном потоке. (Спасибо Glenn Fiedler!)

Поскольку это теперь, я просто блокирую взаимное исключение, совместно использованное всеми подсистемами при доступе к компонентам.

Отрывок от цикла физики:

lock_guard lock( m_EntMutex );
entitymap::iterator it;
for ( it = m_Ents.begin(); it != m_Ents.end(); ++it )
{
    // Get physics component from entity
    // This is guaranteed to work ( component must exist for it to present in the map )
    shared_ptr phys( static_cast( it->second->getComponent( COMP_PHYS ).lock().get() ) );
    // Get resulting Box2D vector
    b2Vec2 vec = phys->getBody()->GetPosition();

    // Get position component from entity
    // Same as above, but this is the component shared with the graphics subsystem   
    shared_ptr pos( static_cast( it->second->getComponent( COMP_POS ).lock().get() ) );
    // Update position component from Box2D vector
    pos->setPosition( vec.x, vec.y, 0 );
}

Отрывок от графического цикла:

lock_guard lock( m_EntMutex );
entitymap::iterator it;
for ( it = m_Ents.begin(); it != m_Ents.end(); ++it )
{
    // Get position component from entity
    // This is shared with the physics subsystem
    shared_ptr pos( static_cast( it->second->getComponent( COMP_POS ).lock().get() ) );
    // Get position from position component
    doubleVec3 vec = p->getPosition();

    // Get graphics component from entity
    shared_ptr gfx( static_cast( it->second->getComponent( COMP_GFX ).lock().get() ) );
    // Update graphics component from position component
    gfx->getObject()->getParentSceneNode()->setPosition( float(vec.x), float(vec.y), float(vec.z) );
} 

Это - очевидно, очень наивная реализация, таким образом, я пытался заставить отдельные компоненты иметь свои собственные взаимные исключения. Это казалось логическим выбором производительности, но затем результаты физики (как запрошено через компонент положения) не всегда будут последовательны и надежны.

Каков был бы самый эффективный способ выполнения гладкого процесса обновления? Я должен позволить ему обновить весь мир сразу или сделать что-то более возрастающее?

Править: Это привлекло мое внимание, что схема приобретения указателя испорчена, но давайте предположим, что указатели допустимы.

6
задан nilekurt 24 July 2010 в 21:46
поделиться