XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Проверил на практике: метод движения юнита по системе SCV + таймеры + SetUnitX(Y) примерно в 2 раза быстрее любого способа, который я применял раньше. Приятный результат дискуссии :).
Старый 02.11.2005, 19:34
tysch_tysch
Работаем
offline
Опыт: отключен
Sergey ты в следующий раз, так и говори, что это иследование начал из-за виспсворма, тут даже я бы тебе сказал из-за чего тормозила, так как один из первых тестил этот спел и рекомендовал димону уменьшить количество виспов.
А то Алексей Б Х сказал...=)
Старый 02.11.2005, 21:51
Sergey
Старейший
offline
Опыт: 44,363
Активность:
Я исследование начал с целью разрушить или подтвердить миф о кеше. Цель свою вполне достиг, а также получил и другие интересные результаты, которых не знал раньше.
Может про это все написать статью?
Старый 02.11.2005, 22:50
Toadcop

offline
Опыт: 54,313
Активность:
Sergey Toadcop's Projectile Creator полон кеша и работае отлично !
И вообще как ты правильнго заметил главное алгоритм, ну в джассе правильный выбор нативных функ. ! А Сасодемон просто идёт своим путём, и чесно говоря и я этим восхищяюсь ! Он молодец, хоть чтото особенно делает а не дефолты !
Старый 13.11.2005, 15:26
Celebrate

offline
Опыт: 849
Активность:
Sergey а как выглядит код движения юнитов таймерами? (я с таймерами почти не работал; все что я о них знаю почерпнуто из статьи о SCV).
Старый 15.11.2005, 18:59
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
NETRAT

offline
Опыт: 83,712
Активность:
Код:
call TimerStart(t, <период>, true, function <Функция2>)
call set_object_iparam(t,"Munit",H2I(u))

Мне, наверное, никогда не понять, почему запись в кешь производится именно ПОСЛЕ вызова таймера - ведь, теоретически, если в последовательности после вызова таймера возникнет лаг, то таймер не получит параметр. Разумеется шанс этого лага достаточно мал, чтобы его учитывать, но тем не менее - ведь ничего не поменяется если писать в кешь непосредственно ДО вызова таймера. Если рассмастривать таймер с периодом 0 то можем получить каку в кеше.

Наверное это признак мастерства, но в любом другом языке программирования такая фича не пройдет.
Старый 18.11.2005, 06:14
Celebrate

offline
Опыт: 849
Активность:
Sergey спасибо.
Старый 18.11.2005, 16:34
Daniil

offline
Опыт: 164
Активность:
К вопросу о быстродействии.
Допустим, есть N юнитов, которые нужно программно перемещать независимо друг от друга, используя интервал в 0.04 - 0.05 секунд.
Что будет лучше: один триггер, который в цикле пробегает по всем юнитам и перемещает, или N триггеров - для каждого юнита отдельно?
(Подразумевается, что N - константа)
Теперь усложним задачу.
Опять же есть N юнитов, которые надо программно перемещать, но некоторые из них в данный момент должны двигаться, а некоторые нет.
Соответственно, или опять же используем цикл, в который просто добавляем условие, или делаем N триггеров, которые или включаем или выключаем.
Чтобы было понятней, приведу почти классический пример - лёд.
Некоторые юниты находятся на льду и поэтому должны катиться, другие или стоят на нормальной земле, или мертвы - катиться не должны.
Старый 19.09.2006, 10:52
Toadcop

offline
Опыт: 54,313
Активность:
Daniil я наверно скоро выложу САМУЮ новую версию ТРС и ты увидишь что такое скорость =)

Массивы САМОЕ быстрое что есть ! на дня тестировал с помощю дополнительных нативок....

кеш кстати имеет ОДНО НО ! да он не плохой но ! в ЛУТЧЕМ случаии у него производительность в 12 раз хуже массивов переменных ! а в нормальном случаии где то в раз 20 а то и больше ! т.к. создание новой таблици требует приличное время ! т.е. делать что динамическое надо ТОЛЬКО на МАСИВАХ + с прямим чтением !
Старый 19.09.2006, 11:17
Daniil

offline
Опыт: 164
Активность:
Ну, я спросил не про массивы vs кеш, а один триггер и цикл vs много триггеров.
Причём, во втором случае (при условии, что N небольшое) можно вообще вместо массива использовать кучу глобальных переменных.
Что, по идее, будет ещё быстрее (избавляемся от операции доступа к элементу массива), но, разумеется, значительно геморройнее при написании скрипта (N раз писать один и тот же код и N раз дублируя все допущенные ошибки).
Просто я тут прочитал одну статейку. Там рекомендовалось делать как можно больше триггеров и как можно больше потоков, вместо одного общего - получается оптимизация за счёт того, что избавляемся от проверки кучи условий.
Хотя чисто интуитивно кажется, что один запуск триггера с циклом должен быть быстрее, чем запуск кучи триггеров.
Старый 19.09.2006, 12:00
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 06:36.