Sergey
Старейший
offline
Опыт:
44,363Активность: |
Проверил на практике: метод движения юнита по системе SCV + таймеры + SetUnitX(Y) примерно в 2 раза быстрее любого способа, который я применял раньше. Приятный результат дискуссии :). |
02.11.2005, 19:34 | #21
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
tysch_tysch
Работаем
online
Опыт: отключен
|
Sergey ты в следующий раз, так и говори, что это иследование начал из-за виспсворма, тут даже я бы тебе сказал из-за чего тормозила, так как один из первых тестил этот спел и рекомендовал димону уменьшить количество виспов.
А то Алексей Б Х сказал...=) |
02.11.2005, 21:51 | #22
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
44,363Активность: |
Я исследование начал с целью разрушить или подтвердить миф о кеше. Цель свою вполне достиг, а также получил и другие интересные результаты, которых не знал раньше.
Может про это все написать статью? |
02.11.2005, 22:50 | #23
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
Sergey Toadcop's Projectile Creator полон кеша и работае отлично !
И вообще как ты правильнго заметил главное алгоритм, ну в джассе правильный выбор нативных функ. ! А Сасодемон просто идёт своим путём, и чесно говоря и я этим восхищяюсь ! Он молодец, хоть чтото особенно делает а не дефолты ! |
13.11.2005, 15:26 | #24
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Celebrate
offline
Опыт:
849Активность: |
Sergey а как выглядит код движения юнитов таймерами? (я с таймерами почти не работал; все что я о них знаю почерпнуто из статьи о SCV).
|
15.11.2005, 18:59 | #25
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
44,363Активность: |
Celebrate, извини что не ответил сразу.
Вообщем динамическое создание таймера очень похоже на создание триггера с периодом. Схема применения следующая:
Функция2
local timer t = GetExpiredTimer() получение данных из SCV local <переменная> = get_object_iparam(t,"...") ... Если (условие выхода из таймера) то call flush_object(t) call DestroyTimer(t) конецесли set t = null конец Функция1
local timer t = CreateTimer() call TimerStart(t, <период>, true, function <Функция2>) call set_object_iparam(t,"Munit",H2I(u)) сопоставление при помощи SCV call set_object_iparam(t,"...",...) ... set t = null конец Итого, при запуске функции 1 будет создан таймер с указанным периодом, который будет запускать функцию2, пока не будет выполнено условие окончания. Тогда таймер будет уничтожен.
Если используешь действие перемещения юнита, то вместо MoveUnit юзаешь функции call SetUnitX(u,GetLocationX(p)) call SetUnitY(u,GetLocationY(p)) |
17.11.2005, 23:33 | #26
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Код:
Мне, наверное, никогда не понять, почему запись в кешь производится именно ПОСЛЕ вызова таймера - ведь, теоретически, если в последовательности после вызова таймера возникнет лаг, то таймер не получит параметр. Разумеется шанс этого лага достаточно мал, чтобы его учитывать, но тем не менее - ведь ничего не поменяется если писать в кешь непосредственно ДО вызова таймера. Если рассмастривать таймер с периодом 0 то можем получить каку в кеше. Наверное это признак мастерства, но в любом другом языке программирования такая фича не пройдет. |
18.11.2005, 06:14 | #27
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Celebrate
offline
Опыт:
849Активность: |
Sergey спасибо.
|
18.11.2005, 16:34 | #28
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Daniil
offline
Опыт:
164Активность: |
К вопросу о быстродействии.
Допустим, есть N юнитов, которые нужно программно перемещать независимо друг от друга, используя интервал в 0.04 - 0.05 секунд. Что будет лучше: один триггер, который в цикле пробегает по всем юнитам и перемещает, или N триггеров - для каждого юнита отдельно?
(Подразумевается, что N - константа) Теперь усложним задачу.
Опять же есть N юнитов, которые надо программно перемещать, но некоторые из них в данный момент должны двигаться, а некоторые нет. Соответственно, или опять же используем цикл, в который просто добавляем условие, или делаем N триггеров, которые или включаем или выключаем. Чтобы было понятней, приведу почти классический пример - лёд. Некоторые юниты находятся на льду и поэтому должны катиться, другие или стоят на нормальной земле, или мертвы - катиться не должны. |
19.09.2006, 10:52 | #29
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
Daniil я наверно скоро выложу САМУЮ новую версию ТРС и ты увидишь что такое скорость =)
Массивы САМОЕ быстрое что есть ! на дня тестировал с помощю дополнительных нативок.... кеш кстати имеет ОДНО НО ! да он не плохой но ! в ЛУТЧЕМ случаии у него производительность в 12 раз хуже массивов переменных ! а в нормальном случаии где то в раз 20 а то и больше ! т.к. создание новой таблици требует приличное время ! т.е. делать что динамическое надо ТОЛЬКО на МАСИВАХ + с прямим чтением ! |
19.09.2006, 11:17 | #30
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Daniil
offline
Опыт:
164Активность: |
Ну, я спросил не про массивы vs кеш, а один триггер и цикл vs много триггеров.
Причём, во втором случае (при условии, что N небольшое) можно вообще вместо массива использовать кучу глобальных переменных. Что, по идее, будет ещё быстрее (избавляемся от операции доступа к элементу массива), но, разумеется, значительно геморройнее при написании скрипта (N раз писать один и тот же код и N раз дублируя все допущенные ошибки). Просто я тут прочитал одну статейку. Там рекомендовалось делать как можно больше триггеров и как можно больше потоков, вместо одного общего - получается оптимизация за счёт того, что избавляемся от проверки кучи условий. Хотя чисто интуитивно кажется, что один запуск триггера с циклом должен быть быстрее, чем запуск кучи триггеров. |
19.09.2006, 12:00 | #31
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|