Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Принятые патчи

Важная информация

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.12.2010, 13:49   #1
Warlord123
Пользователь
 
Регистрация: 09.03.2010
Сообщений: 37
Сказал(а) спасибо: 4
Поблагодарили 63 раз(а) в 21 сообщениях
Warlord123 Скоро придёт к известности
По умолчанию [10893][patch]Оптимизация загрузки gossip_menu_option

Суть проблемы: большая задержка при загрузке gossip_menu_option.
Автор:я.
В данный момент загрузка gossip_menu_option занимает очень много времени, хотя записей в таблице порядка около 5 тысяч.
В этом "виноват" цикл
Код:
for(uint32 i = 1; !found_flags_uses && i < CreatureStorage.MaxEntry; ++i)
, который выполняется для каждого элемента из gossip_menu_option.
В итоге тело цикла выполняется около 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);
Вложения
Тип файла: patch gossips.patch (2.4 Кб, 14 просмотров)
Warlord123 вне форума  
15 пользователя(ей) сказали cпасибо:
Ambal (22.12.2010), Den (16.12.2010), D_f (18.12.2010), KiriX (16.12.2010), Lightunit (19.12.2010), Mayss (16.12.2010), narma (17.12.2010), PSZ (16.12.2010), selector (16.12.2010), srv38 (17.12.2010), Vladimir (19.12.2010), xex (16.12.2010)
Старый 19.12.2010, 20:54   #2
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

В [10893]. Спасибо
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Пользователь сказал cпасибо:
Ranger (24.02.2012)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[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


Текущее время: 08:30. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot