📄 zonegroupmanager.cpp
字号:
if (minLoadValue >= loadBoundary || maxLoadValue-minLoadValue <= minLoadGap) { // load甫 促矫 炼荤秦具 茄促. for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; // loadValue甫 檬扁拳 矫难霖促. const hash_map< ZoneID_t, Zone* >& zones = pZoneGroup->getZones(); hash_map< ZoneID_t, Zone* >::const_iterator iZone; // 阿 Zone狼 loadValue甫 备茄促. for (iZone=zones.begin(); iZone!=zones.end(); iZone++) { Zone* pZone = iZone->second; pZone->initLoadValue(); } } return false; } } // 乞闭 load //int avgLoad = totalLoad / maxGroups; // average甫 90%肺 棱篮 版快 int avgLoad = totalLoad * averageLoadPercent / maxGroup / 100; // 货肺款 弊缝狼 load甫 拌魂窍扁 困秦辑 groups.reserve( maxGroup ); for (i=0; i<maxGroup; i++) { groups[i] = 0; } // balancing窍扁 傈狼 惑怕 免仿 //outputLoadValue(); //------------------------------------------------------------------ // // load balancing // // 距埃狼 函拳甫 霖? FirstFit 荤侩. //------------------------------------------------------------------ LOAD_INFOS::const_iterator iInfo = loadInfos.begin(); int index = 0; for (; iInfo!=loadInfos.end(); iInfo++) { LoadInfo* pInfo = iInfo->second; // 甸绢哎 货 group阑 茫绰促. int newGroupID = -1; for (int k=0; k<maxGroup; k++) { int groupLoad = groups[index]; if (groupLoad+pInfo->load <= avgLoad) { newGroupID = index; if (++index>=maxGroup) index = 0; break; } if (++index>=maxGroup) index = 0; } // 利例茄 group阑 给 茫疽栏搁 俩 蔼捞 利篮 group俊 持绰促. if (newGroupID==-1) { newGroupID = 0; for (int k=1; k<maxGroup; k++) { if (groups[k] < groups[newGroupID]) { newGroupID = k; } } } // newGroupID俊促啊 Info甫 眠啊茄促. pInfo->groupID = newGroupID + 1; // 1阑 刘啊矫难拎具 茄促. -_-; groups[newGroupID] += pInfo->load; } return true;}//---------------------------------------------------------------------------// make DefaultLoadInfo//---------------------------------------------------------------------------// DB俊 汲沥等 扁夯 ZoneGroup栏肺 汲沥茄促.//---------------------------------------------------------------------------bool ZoneGroupManager::makeDefaultLoadInfo( LOAD_INFOS& loadInfos ) throw (Error){ __BEGIN_TRY __BEGIN_DEBUG Statement* pStmt = NULL; list<ZoneGroupID_t> ZoneGroupIDList; // 刚历 粮 弊缝 酒捞叼甸阑 佬绰促. BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); Result* pResult = pStmt->executeQuery("SELECT ZoneGroupID FROM ZoneGroupInfo"); while (pResult->next()) { ZoneGroupID_t ID = pResult->getInt(1); ZoneGroupIDList.push_back(ID); } SAFE_DELETE(pStmt); } END_DB(pStmt) list<ZoneGroupID_t>::iterator itr = ZoneGroupIDList.begin(); for (; itr != ZoneGroupIDList.end(); itr++) { ZoneGroupID_t ID = *itr; BEGIN_DB { pStmt = g_pDatabaseManager->getConnection("DARKEDEN")->createStatement(); //Result* pResult = pStmt->executeQuery("SELECT ZoneID FROM ZoneInfo WHERE ZoneGroupID = %d", ID); Result* pResult = pStmt->executeQuery( "SELECT ZoneID FROM ZoneInfo WHERE ZoneGroupID = %d", ID); while (pResult->next()) { ZoneID_t zoneID = pResult->getInt(1); LoadInfo* pInfo = new LoadInfo; pInfo->id = zoneID; try { pInfo->oldGroupID = g_pZoneInfoManager->getZoneInfo(zoneID)->getZoneGroupID(); } catch (NoSuchElementException& ) { filelog("makeDefaultLoadInfoError.txt", "NoSuch ZoneInfo : %d", zoneID); pInfo->oldGroupID = ID; // 弊成 逞绢啊霸 茄促. } pInfo->groupID = ID; pInfo->load = 0; // 狼固绝促. loadInfos[zoneID] = pInfo; } SAFE_DELETE(pStmt); } END_DB(pStmt) } ZoneGroupIDList.clear(); __END_DEBUG __END_CATCH return true;}//---------------------------------------------------------------------------// balance ZoneGroup ( bForce )//---------------------------------------------------------------------------//// bForce : balacing且 鞘夸啊 绝促绊 魄窜登绰 版快俊档 // 碍力肺 ZoneGroup阑 balancing且 版快俊 荤侩等促.//// bDefault : DB俊辑 瘤沥登绢 乐绰 蔼栏肺 ZoneGroup阑 汲沥茄促.//// Zone付促狼 10檬埃狼 loop 贸府 雀荐甫 load蔼栏肺 茄促.// 拌魂俊 祈狼甫 困秦辑 角力 load绰 促澜苞 鞍狼 沥狼茄促.//// load = (loadLimit - load)*loadMultiplier;////---------------------------------------------------------------------------void ZoneGroupManager::balanceZoneGroup(bool bForce, bool bDefault) throw (Error){ __BEGIN_TRY LOAD_INFOS loadInfos; //------------------------------------------------------------------ // zoneGroup阑 balancing且 LoadInfo甫 积己茄促. //------------------------------------------------------------------ if (bDefault) { makeDefaultLoadInfo( loadInfos ); } else { if (!makeBalancedLoadInfo( loadInfos, bForce )) { // balancing且 鞘夸啊 绝促绊 魄窜登绰 版快捞促. return; } } hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr; LOAD_INFOS::const_iterator iInfo; //------------------------------------------------------------------ // // ZoneGroup 函版 // //------------------------------------------------------------------ // ZonePlayerManager::m_PlayerListQueue // m_ZoneGroups // ZoneInfoManager // Zone::m_pZoneGroup // ZonePlayerManager::m_pPlayers //------------------------------------------------------------------ try { //------------------------------------------------------------------ // LoginServerManager LOCK //------------------------------------------------------------------ //__ENTER_CRITICAL_SECTION(g_pLoginServerManager) g_pLoginServerManager->lock(); //------------------------------------------------------------------ // // LOCK all ZoneGroups // //------------------------------------------------------------------ for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; pZoneGroup->lock(); pZoneGroup->processPlayers(); // 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促. } //------------------------------------------------------------------ // Zone俊辑 唱柯 局甸阑 促矫 格钎 Zone栏肺 持绰促. //------------------------------------------------------------------ g_pIncomingPlayerManager->heartbeat(); //------------------------------------------------------------------ // 阿 ZoneGroup狼 // ZPM俊辑 Zone栏肺 甸绢哎 措扁凯俊 乐绰 荤侩磊甸阑 快急 持绢滚赴促. //------------------------------------------------------------------ for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; // ZonePlayerManager::m_PlayerListQueue甫 沥府秦霖促. --> 老窜 Zone俊 眠啊. pZoneGroup->getZonePlayerManager()->processPlayerListQueue(); } //------------------------------------------------------------------ // ZoneGroup 函版 //------------------------------------------------------------------ for (iInfo=loadInfos.begin(); iInfo!=loadInfos.end(); iInfo++) { LoadInfo* pInfo = iInfo->second; int oldGroupID = pInfo->oldGroupID; int newGroupID = pInfo->groupID; int zoneID = pInfo->id; // group捞 鞍栏搁 捞悼矫懦 鞘夸啊 绝促. if (oldGroupID==newGroupID) { //cout << "same ZoneGroup" << endl; continue; } try { //cout << "[" << (int)zoneID << "] " << (int)oldGroupID << " --> " << (int)newGroupID << endl; hash_map< ZoneGroupID_t , ZoneGroup* >::iterator iOldZoneGroup = m_ZoneGroups.find( oldGroupID ); hash_map< ZoneGroupID_t , ZoneGroup* >::iterator iNewZoneGroup = m_ZoneGroups.find( newGroupID ); ZoneGroup* pOldZoneGroup = iOldZoneGroup->second; ZoneGroup* pNewZoneGroup = iNewZoneGroup->second; // ZonePlayerManager ZonePlayerManager* pOldZPM = pOldZoneGroup->getZonePlayerManager(); ZonePlayerManager* pNewZPM = pNewZoneGroup->getZonePlayerManager(); Zone* pZone = pOldZoneGroup->getZone(zoneID); // Old ZoneGroup --> New ZoneGroup pOldZoneGroup->removeZone( zoneID ); pNewZoneGroup->addZone( pZone ); // ZoneGroup pZone->setZoneGroup( pNewZoneGroup ); // ZoneInfoManager ZoneInfo* pZoneInfo = g_pZoneInfoManager->getZoneInfo( zoneID ); pZoneInfo->setZoneGroupID( newGroupID ); //------------------------------------------------------------------ // ZonePlayerManager::m_pPlayers //------------------------------------------------------------------ // pZone狼 PCManager狼 局甸阑 // pOldZoneGroup->m_pZonePlayerManager俊辑 力芭秦辑 // pZoneGroup->m_pZonePlayerManager俊 眠啊茄促. //------------------------------------------------------------------ const PCManager* pPCManager = pZone->getPCManager(); const hash_map< ObjectID_t, Creature* >& players = pPCManager->getCreatures(); hash_map< ObjectID_t, Creature* >::const_iterator iPlayer; // 阿 Player甸狼 ZPM阑 颗变促. for (iPlayer=players.begin(); iPlayer!=players.end(); iPlayer++) { Player* pPlayer = iPlayer->second->getPlayer(); pOldZPM->deletePlayer_NOBLOCKED( pPlayer->getSocket()->getSOCKET() ); pNewZPM->addPlayer_NOBLOCKED( dynamic_cast<GamePlayer*>(pPlayer) ); } } catch (NoSuchElementException& t) { filelog("changeZoneGroupError.txt", "%s", t.toString().c_str()); } } // balancing茄 饶狼 惑怕 免仿 outputLoadValue(); //------------------------------------------------------------------ // // UNLOCK all ZoneGroups // //------------------------------------------------------------------ for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; // loadValue甫 檬扁拳 矫难霖促. const hash_map< ZoneID_t, Zone* >& zones = pZoneGroup->getZones(); hash_map< ZoneID_t, Zone* >::const_iterator iZone; // 阿 Zone狼 loadValue甫 备茄促. for (iZone=zones.begin(); iZone!=zones.end(); iZone++) { Zone* pZone = iZone->second; pZone->initLoadValue(); } pZoneGroup->unlock(); } //------------------------------------------------------------------ // LoginServerManager UNLOCK //------------------------------------------------------------------ //__LEAVE_CRITICAL_SECTION(g_pLoginServerManager) g_pLoginServerManager->unlock(); } catch (Throwable& t) { filelog("balanceZoneGroup.txt", "%s", t.toString().c_str()); for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; pZoneGroup->unlock(); } } //------------------------------------------------------------------ // loadInfos 瘤况林扁 //------------------------------------------------------------------ for (iInfo=loadInfos.begin(); iInfo!=loadInfos.end(); iInfo++) { LoadInfo* pInfo = iInfo->second; SAFE_DELETE(pInfo); } __END_CATCH}//--------------------------------------------------------------------------------// lock all ZoneGroup and LoginServerManager//--------------------------------------------------------------------------------void ZoneGroupManager::lockZoneGroups() throw( Error ){ __BEGIN_TRY //------------------------------------------------------------------ // LoginServerManager UNLOCK //------------------------------------------------------------------ g_pLoginServerManager->lock(); //------------------------------------------------------------------ // // LOCK all ZoneGroups // //------------------------------------------------------------------ hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr; for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; pZoneGroup->lock();// pZoneGroup->processPlayers(); // 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促. } __END_CATCH}//--------------------------------------------------------------------------------// lock all ZoneGroup and LoginServerManager//--------------------------------------------------------------------------------void ZoneGroupManager::unlockZoneGroups() throw( Error ){ __BEGIN_TRY //------------------------------------------------------------------ // // UNLOCK all ZoneGroups // //------------------------------------------------------------------ hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr; for (itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; pZoneGroup->unlock();// pZoneGroup->processPlayers(); // 沥府~扼绊 且鳖. 漂洒 EventResurrect锭巩捞促. } //------------------------------------------------------------------ // LoginServerManager UNLOCK //------------------------------------------------------------------ g_pLoginServerManager->unlock(); __END_CATCH}//--------------------------------------------------------------------------------// get PlayerNum. by sigi. 2002.12.30//--------------------------------------------------------------------------------int ZoneGroupManager::getPlayerNum () const throw (Error){ __BEGIN_TRY int numPC = 0; hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr = m_ZoneGroups.begin(); for (; itr != m_ZoneGroups.end() ; itr ++) { ZoneGroup* pZoneGroup = itr->second; // lock 吧 鞘夸 绝促 numPC += pZoneGroup->getZonePlayerManager()->size(); } return numPC; __END_CATCH}void ZoneGroupManager::removeFlag(Effect::EffectClass EC) throw (Error){ __BEGIN_TRY ZoneGroup* pZoneGroup = NULL; hash_map< ZoneGroupID_t , ZoneGroup *>::const_iterator itr = m_ZoneGroups.begin(); for (; itr != m_ZoneGroups.end(); itr++) { pZoneGroup = itr->second; pZoneGroup->getZonePlayerManager()->removeFlag( EC ); } __END_CATCH}//--------------------------------------------------------------------------------// get debug string//--------------------------------------------------------------------------------string ZoneGroupManager::toString () const throw (){ __BEGIN_TRY StringStream msg; msg << "ZoneGroupManager("; for (hash_map< ZoneGroupID_t , ZoneGroup* >::const_iterator itr = m_ZoneGroups.begin() ; itr != m_ZoneGroups.end() ; itr ++) { msg << itr->second->toString(); } msg << ")"; return msg.toString(); __END_CATCH}// global variable definitionZoneGroupManager* g_pZoneGroupManager = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -