|
Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.
Повод для гордости. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
16.12.2010, 13:49 | #1 |
Пользователь
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
|
[10893][patch]Оптимизация загрузки gossip_menu_option
Суть проблемы: большая задержка при загрузке gossip_menu_option.
Автор:я. В данный момент загрузка gossip_menu_option занимает очень много времени, хотя записей в таблице порядка около 5 тысяч. В этом "виноват" цикл Код:
for(uint32 i = 1; !found_flags_uses && i < CreatureStorage.MaxEntry; ++i) В итоге тело цикла выполняется около 70 000 000 раз. Предлагаю формировать список CreatureInfo, которые содержат GossipMenu в multimap вне цикла по элементам gossip_menu_option. После данной модификации загрузка gossip_menu_option занимает менее 1 секунды. Патч. Код:
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index ee8f234..b49c355 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -9443,6 +9443,18 @@ void ObjectMgr::LoadGossipMenuItems() for(ScriptMapMap::const_iterator itr = sGossipScripts.begin(); itr != sGossipScripts.end(); ++itr) gossipScriptSet.insert(itr->first); + std::multimap<uint32, const CreatureInfo*> CreatureInfoMap; + typedef std::multimap<uint32, const CreatureInfo*>::iterator TMI; + for(uint32 i = 1; i < sCreatureStorage.MaxEntry; ++i) + if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(i)) + { + if (cInfo->GossipMenuId !=0) + { + CreatureInfoMap.insert(std::make_pair(cInfo->GossipMenuId,cInfo)); + + } + } + do { bar.step(); @@ -9523,12 +9535,13 @@ void ObjectMgr::LoadGossipMenuItems() { bool found_menu_uses = false; bool found_flags_uses = false; - for(uint32 i = 1; !found_flags_uses && i < sCreatureStorage.MaxEntry; ++i) - { - if (CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(i)) - { - if (cInfo->GossipMenuId == gMenuItem.menu_id) - { + + std::pair<TMI,TMI> tm_range=CreatureInfoMap.equal_range(gMenuItem.menu_id); + for (TMI it2=tm_range.first;!found_flags_uses && it2!=tm_range.second;it2++) + { + + CreatureInfo const* cInfo=it2->second; + found_menu_uses = true; // some from creatures with gossip menu can use gossip option base at npc_flags @@ -9538,9 +9551,7 @@ void ObjectMgr::LoadGossipMenuItems() // unused check data preparing part if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) menu_ids.erase(cInfo->GossipMenuId); - } } - } if (found_menu_uses && !found_flags_uses) sLog.outErrorDb("Table gossip_menu_option for menu %u, id %u has `npc_option_npcflag` = %u but creatures using this menu does not have corresponding`npcflag`. Option will not accessible in game.", gMenuItem.menu_id, gMenuItem.id, gMenuItem.npc_option_npcflag); |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[10893] Speedup check code at `gossip_menu_option` loading. | newsbot | CMaNGOS Commits | 0 | 19.12.2010 21:00 |
[10720] Implement check `gossip_menu_option`.`npc_option_npcflag`. | newsbot | CMaNGOS Commits | 0 | 11.11.2010 17:10 |
[patch] Оптимизация IsPositiveSpell | zergtmn | Патчи на рассмотрении | 0 | 04.07.2010 10:37 |
Оптимизация Mysql {my.cnf} | lina | Прочая документация | 10 | 20.06.2010 00:12 |
вырубается мир после загрузки | kartez | Установка MaNGOS | 19 | 09.06.2010 15:46 |