|
|
在mangos里面,好象多线程用得不多,所有的npc,怪,和人物的处理,都是由World::Update(time_t diff),去更新的,此函数会去遍历所有的物体的updata,当在某处物体更新阻塞的情况下会影响到整个地图物体的更新。
另外在人物属性发生一次变化的时候,不会马上去发包去通知客户端,比如属性更新了两次SetUInt32Value( PLAYER_FIELD_COINAGE , m_dismountCost);SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID , 0);,如果每更新一个小小的属性发一次包实在是浪费网络带宽,也不利于客户端处理。
实际上,它会把更新收集起来,
void Object::SetUInt32Value( const uint16 &index, const uint32 &value )
{
ASSERT( index < m_valuesCount );
m_uint32Values[ index ] = value;
if(m_inWorld)
{
m_updateMask.SetBit( index );
if(!m_objectUpdated)
{
ObjectAccessor::Instance().AddUpdateObject(this);
m_objectUpdated = true;
}
}
}
在 ObjectAccessor::_update()的时候一并更新到客户端,这个updata间隔很短的,客户端可以接受这个速度。
(我不是太喜欢mangos大量用模板技术的风格,因为这样我用source insight跟踪代码经常跟不到,造成分析障碍,貌似这个工具对模板支持不好) [em14] |
|