Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Замирание клиента в мас замесах


jedbez

Рекомендуемые сообщения

Сталкнулся с такой проблемой:

Аддон, отображает 5 строк нанесенного урона + считает % крита, резистов и др.

Но при больших замесах, начинает загружать систему. В результате все тормозит и наступает великий слайд шоу.

Я понимаю, что обработчик события нанесения урона собирает весь урон в округе, поэтому пришлось сразу его обрубить и указать ему насильно, чтоб принимал урон, только от аватара

common.RegisterEventHandler( OnEventDamageReceived, "EVENT_UNIT_DAMAGE_RECEIVED", { source=avatar.GetId()})
 
Проблема осталась.
Может циклы виноваты, но их всего 4
- при создании создать виджеты TextView 5 штук
- Для заполнения виджетов содержимым - текстом, причем недлинным
- для смещения таблицы урона
- и в таймере для эффектов затухания
 
Подскажите где подвисанияу меня, в масс замесах.
 
Может быть получается дохрена единиц урона, который обрабатывается и не успевает отображаться, но как же его отображать тогда...

CritView.zip

Ссылка на комментарий
Поделиться на другие сайты

Отображать по секундомеру медленно..

 

Хотя... в общем сделал пока гибрид

по секундомеру если дохрена урона.

Ссылка на комментарий
Поделиться на другие сайты

У тебя при каждом событии "кто-то получил урон" идет обработка информации и вызов функции OnShow().

 

Функция OnShow() вызывает полную перерисовку всех значений + множество операций SetVal() и common.FormatInt().

 

Т.е. каждый раз когда кто-то где-то получает урон у тебя идет полная перерисовка интерфейса.

 

Перерисовывать интерфейс нужно делать не чаще раза в кадр. При этом гораздо эффективнее перерисовывать только изменившиеся элементы интерфейса. Например если у тебя изменились значения в строчках 2 и 3 - нет смысла перерисовывать все строки. Если у тебя в одной из строк изменилась надпись "крит" на "уворот" а в другой изменилась только цифра, нет смысла заново присваивать значение тексте во второй строке. Т.е. повторно присваивать то же самое значение виджету нет смысла, однако неизвестно сколько ресурсов это жрет.

 

В твоем случае за кадр может приходить четверть сотни событий о получении урона, и твой аддон каждый раз будет пытаться перерисовать весь интерфейс. При этом тратятся ресурсы системы и длина кадра увеличивается, т.е. если кадр длится в 5 раз больше ,то в следующем кадре появится в 5 раз больше новых ивентов, и следующий кадр тоже будет в 5 раз дольше.

 

Я бы советовал перерисовывать только измененные элементы интерфейса, и не чаще чем раз в 1 кадр. Т.е. разделить функции OnShow() и OnEventDamageReceived(). Первая должна перерисовывать интерфейс по необходимости, вторая - только собирать данные.

Ссылка на комментарий
Поделиться на другие сайты

Плюс в функции OnShow() у тебя сперва всем параметрам присваиваются строки " ", а уже потом нужным присваиваются форматированные значения. Т.е. если есть надпись "1 2 3", то сперва ты присваиваешь 3 параметрам значения " ", " ", " " (получаеся "     "), а потом если значение 3 изменилось на 8, например, ты присваиваешь этим параметрам значения "1", "2", "8", и так при каждом получении урона.

 

Такое неэффективное использоваие ресурсов (постоянное ненужное переприсваивание всех значений) и вызывает тормоза.

 

Я имею ввиду не присваивание значений переменным в луа, а присваивание параметрам виджетов TextView значений функцией SetVal, что вызывает (предположительно) перерисовку виджета (а может и еще чего).

Ссылка на комментарий
Поделиться на другие сайты

Зачем каждый раз получать Id персонажа, когда он не меняется, тоже можно сделать с петом, только добавить запись переменной в EVENT_ACTIVE_PET_CHANGED

объявить локальную переменную

local av

записать в OnCreat()

av=avatar.GetId()

и как то много GetTableSize, я вообще этим не пользуюсь)) записать размер массива в переменную и использовать её, менять при изменении размера

Ссылка на комментарий
Поделиться на другие сайты

Вроде учел все замечания, буду тестить...

Хотя с GetTableSize, вроде оптимально, но всеравно проверю.

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

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

Пользуясь сайтом, вы принимаете Условия использования