Обновил аддон до версии 2.1.7-r4. Ссылка в первом посте обновлена.
Исправление кэширования файлов! Довольно серьезное исправление, которое улучшит производительность.
Для понимания требуется немного ввести в курс дела по функционалу аддона "под капотом".
После загрузки аддона (входа в игровой мир), аддон запускает цикл по всем предметам в игре (от 1 до 40000) и начинает записывать в свой кэш все эти 40000 предметов в игре. Эти данные необходимы, чтобы в аддоне работал функционал автозаполнения и предложения вариантов в момент ввода названия предмета. Это разовая процедура. Как только кэш аддона заполнится, при каждом входе в игру будет просто осуществляться проверка полноты заполнения кэша.
Небольшое дополнение:
аддон записывает информацию о предметах в две таблицы:
- aux.account.items - таблица со всеми предметами в игре.
- aux.account.unused_item_ids - таблица со всеми неиспользуемыми ID предметов.
К сожалению, в WOTLK используется "старая" система кэширования. Сервер не возвращает никакой информации для какого предмета получены данные и, самое важное, в какой момент времени они были получены. В более поздних версиях добавили специальное событие "GET_ITEM_INFO_RECEIVED" c этой информацией.
В версии 2.1.7-r3 и ранее кэширование файлов работало только частично. Предметы, которые уже были в кеше игры добавлялись в кэш аддона, а которых не было в кэше игры соответственно не добавлялись и не было никакого функционала по запросу информации о некэшированном предмете у сервера (точнее был функционал, но он основан на информации от события "GET_ITEM_INFO_RECEIVED", которого в WOTLK просто не существует, соответственно этот код не работал). Это приводило к следующей проблеме:
Например у вас в кэше клиента содержится информация о 10000 предметах из 40000. При входе в игру аддон записывает в кэш информацию об этих 10000 предметах в таблицу aux.account.items
Остается еще 30000 предметов. Как я писал выше, функционал по запросу информации о некэшированном предмета у сервера не работал, соответственно таблица aux.account.unused_item_ids вообще не заполнялась.
Поэтому при каждом заходе в игру аддон пытался получить информацию о всех необработанных ID (их оставалось 30000)!
К слову, скорость обработки составляет всего 2-3 ID в секунду. Это необходимо для того, чтобы сервер успевал ответить на запрос и аддон обработал полученную информацию. Вот и считайте, сколько времени при каждом входе в игру аддон в холостую "пыхтел".
Мои изменения, связанные с бекпортом или локализацией:
- увеличен порог файлов кэширования с 40000 до 55000 (иными словами, добавил в кэширование предметы WOTLK). Взял с запасом в 1-2к так как точно не знаю какой ItemID в WOTLK последний.
- исправлен функционал запроса у сервера информации по некэшированным в файлах игры предметам.
Как я писал выше, так как в WOTLK используется "старая" система кэширования и сервер не возвращает никакой информации для какого предмета получены данные и в какой момент времени они были получены это пораждает некоторую проблему:
Если после отправки запроса серверу и по прошествии времени ожидания (~250 мс) информация о предмете по-прежнему недоступна - этот ID записывается в таблицу aux.account.unused_item_ids.
Но бывают случаи (очень редко), когда сервер просто не успел ответить. Таким образом часть валидных ID записывает в неиспользуемые и у аддона информации по этим предметам нет.
Решением такой проблемы является банальное увеличение времени ожидания. Я его не увеличивал специально так как малейшее его увеличение резко и на много увеличит суммарное время выполнения цикла по всем 55000 предметам. Когда я это дело отлаживал, я засек время заполнения кэша аддона. При самом худшем варианте, кэш аддона полностью пустой (удален файл "aux-addon.lua" из папки WTF) и кэш игры полностью пустой (перед запуском игры удалена папка Cache) время заполнения составило 2,5 часа! При этом количество незаписанных предметов достигало примерно 1-2к (из ~50к).
В дальнейшем я попробую исправить эту проблему вычислив методом "тыка" оптимальное время ожидания.
Пока могу предложить 2 варианта по корректному заполнению кэша:
[1 вариант]
1. подождать ~3 часа, пока завершится первичное заполнение
2. ввести в чат команду для очистки таблицы aux.account.unused_item_ids
Код:
/run aux.account.unused_item_ids = {}
3. закрыть игру
4. запустить игру и подождать завершения вторичного заполнения (оно в разы быстрее. Примерно час, может меньше. Со вторичного заполнения все предметы будут корректно заполнены.).
[2 вариант]
1. Скачать уже заполненный кэш
2. переименовать файл в "aux-addon.lua"
3. поместить в папку
Код:
<ДИРЕКТОРИЯ_ИГРЫ>\WTF\Account\<НАИМЕНОВАНИЕ_АККАУНТА>\SavedVariables
Либо вы можете так не заморачиваться и ограничиться первичным заполнением, уверен, вы маловероятно, что заметите отсутствие какого-либо предмета в кэше.