silumin
offline
Опыт:
11,153Активность: |
Оптимизация кода
Что имеемДля примера и для возможности объяснить наглядно привожу один полностью рабочий спелл: » Spell Код:
Все спеллы делаю на параллельных массивах. Меня постоянно напрягает вот этот участок кода, так и хочется убрать его с глаз долой: » Code Код:
Нетрудно заметить, что для вычисления угла Ang = Atan2(dy,dx) и расстояния SquareRoot(dx*dx+dy*dy) используются всего 2 переменные dx и dy. Поэтому родилась справедливая мысль затолкать их в отдельные функции, дабы облегчить создание новых триггспеллов, основанных на движении по полярным координатам. Что решаетсяТ.к. для вычисления расстояния абсолютно безразлично, как мы будем отнимать координаты, всёравно результат возводится в квадратную степень, складывается и вычисляется корень. Как ни крути а полученное значение всегда будет положительным. Но для вычисления угла все значения координат имеют большое значение. Соответственно для удобства обозначения функций лучше подойдёт класификация по требуемому углу. У меня в карте пока только 4 глобальных массива от содержимого ячеек которых берутся координаты: udg_DYN_Hero[i] (юнит), udg_DYN_Target[i] (юнит), udg_DYN_Dummy[i] (юнит), udg_DYN_Point[i] (точка). Я составил много (вроде 16) функций, необходимых для обозначения вычисляемого угла. Примеры выглядят так: fadHT (вычисляет угол между Hero и Taget), fadDP (вычисляет угол между Dummy и Point), fadDT (вычисляет угол между Dummy и Taget). Суть в том, что заглавные буквы (HT, DP, DT) подсказывают между кем и кем или кем и чем вычисляется угол. Все 16 функций возвращают значение угла. Расстояние тоже вычисляется внутри этих функций, но записывается в глобальную переменную, имеющую назваии туже пару загавных букв. Как всё выглядит на практикеИтак функция импользуемая в вышеприведённом спелле имеет такой код: » Function Код:
Аргумент, передаваемый в функцию - есть индекс ячеек массивов. Возвращаемое значение, как уже говорил выше, - требуемый угол. После всех переделок триггерный спелл выглядит так: » Spell Код:
Единственное, что начало немного напрягать, так это необходимость повторно брать координаты X и Y перемещаемого юнита: Код:
Собственно вопросИмеетли смысл такая косметическая оптимизация хотябы для удобства составления спеллов или это "шаг назад"? п.с. Заранее спасибо всем, дочитавшим до конца. (: Отредактировано silumin, 15.08.2010 в 20:51. |
15.08.2010, 20:43 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Я бы сказал, что это шаг назад, шагом вперед можно назвать использование векторов. |
15.08.2010, 20:59 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Hellfim, я бы назвал это делом вкуса. Кто-то любит гуи, кто-то джасс, кто-то вджасс, кто-то сджасс. Равнозначно кто-то полярки, а кто-то вектора.
Да и вопрос поставлен совсем в другом аспекте. |
15.08.2010, 21:14 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
use defines, luke. |
15.08.2010, 22:35 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexKARASb
Learning cpp
offline
Опыт:
22,103Активность: |
если расстояние тебе не важно то смысл выведения корня? Может проще и вроде считать вару меньше:
еще можно было таймер сразу сделать периодик 0.025, чтобы не запускать каждый раз, а просто в один момент запаузить и запустить непереодично его же через 2 сек
Ну отошел вижу я от темы =) Запись тебе сократит, но ведь отправка и возврат требуют времени, хотя сократит время на написание. Но вариант Дока хорош, задефайнить функцию вычисления угла и выйдет код скомпилированный то что надо. |
15.08.2010, 22:52 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
У тебя в самом коде используются массивы, я считаю лучше бы было записать их в локалки, исполнялось бы быстрее, т.к. каждый раз когда ты вызываешь тот же udg_DYN_Dummy[i], сначало вызывается значение i, а потом ищется значение массива udg_DYN_Dummy[i], лучше 1 раз сделать так local unit u = udg_DYN_Dummy[i], быстрее работать будет, аналогично и с другими массивами поступи.
|
15.08.2010, 23:07 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
Faion, я все свои спеллы тестирую на загруженность. Триггерно запускаю сразу 10 кастов и увеличиваю с шагом +5 кастов. На моём слабом компе (Селерон 2.4Мгц, 512Мб, 128Мб видео) стабильно работает 15-30 кастов, взависимости от самого спелла. Ну а поскольку игроков в Варе максимум 12, то я очень доволен такой рабоспособностью.
Да и локалки типа юнит нужно обнулять, что тоже немаловажно для высокопереодического триггера. Вопрос первого поста заключался как раз в том, насколько сильно тормознёт дополнительная функция работу спелла. AlexKARASb, если таймер делать переодическим, то может возникнуть неадекватная работа спелла из-за наложения. Лично для меня надёжнее сделать все процедуры, вычисления, расчёты, а потом запускать таймер заново. Вариант без корня интересен, обязательно подумаю, точнее подумал, буду применять. |
16.08.2010, 02:31 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
silumin:
У меня цифра 400-500 была(причем в 3д). на таком-же компе. а 15-30 кастов будет вообще прекрасно..
ЗЫ: использовал локалки в jass'e тока в цыклах. |
16.08.2010, 21:15 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexKARASb
Learning cpp
offline
Опыт:
22,103Активность: |
сударь, а вы не привераете? 400-500 юнитов на карте да еще с одновременным кастом, что-то сомневаюсь в ваших словах. В 100та кастах еще можно поверить. |
16.08.2010, 21:18 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
AlexKARASb:
до 700 доходило с небольшими лагами. |
16.08.2010, 21:20 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
AlexKARASb
Learning cpp
offline
Опыт:
22,103Активность: |
ZeToX2007, процессор значит у тебя хороший. Моя машина таких чудес не выдаст. |
16.08.2010, 21:24 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
silumin
offline
Опыт:
11,153Активность: |
ZeToX2007, 400-500? Откровенная ложь! Даже отключая все активные мониторы, антивирус, прочее ПО. Производительность самого вара увеличивалась несущественно.
Ну было бы неплохо ещё трейлер в студию, очень хочется взглянуть как Селерон 2.4Мгц, 512Мб, 128Мб видео тянет 700 кастов с небольшими лагами. п.с. лол! |
16.08.2010, 21:57 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|