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

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

Ответ
 
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Locust System

Описание


Вот я решил создать систему что – то типа заклинание москиты (отсюда и название системы)
Система позволяет перемещать, как захочешь. Так же можно делать с помощью системы разные прикольные спеллы

Импорт


Скопировать нестандартный код, триггер CacheInit и переменную cache в свою карту.
Другие триггеры и переменные копировать не обязательно.

Запуск


Чтоб привести систему в действие нужно через Custom script\Личный сценарий написать вот это:

call Locust(unit1, unit2, real1, real2, real3, real4, real5 , boolean)

Примечание


unit1 - Юнит которого надо двигать
unit2 - Юнит вокруг которого надо двигать
real1 - Скорость юнита( рекомендую от 10 до 30)
real2 - Высота юнита
real3 - Скорость подъёма юнита (ну по-другому не знаю как сказать)
real4 - Максимальная высота
real5 - Расстояние после которого юнит возвращается
bool - Тут надо написать true\false true - юнит будет менять высоту false - не будет

Кому не понятно смотрим примеры в карте

Новое


Изменил периоды таймеров, чтоб уменьшить торможение(LocustSystem(Low).w3x)

Переписал весь код - теперь таймер создаётся на кастере, а не на каждом моските
К сожелению оставил кешь
У меньшил утечки
Просьба проверить на утечки - Всё ещё актуальна
Прикрепленные файлы
Тип файла: w3x mylocustsystem.w3x (23.2 Кбайт, 44 просмотров )
Тип файла: w3x LocustSystem(Low).w3x (23.3 Кбайт, 24 просмотров )
Тип файла: w3x LocustSystem_v1.1(Low).w3x (23.8 Кбайт, 59 просмотров )

Отредактировано vdvMax, 05.11.2008 в 08:02.
Старый 04.11.2008, 11:32
RazArt

offline
Опыт: 11,197
Активность:
Красиво)
Старый 04.11.2008, 12:11
zer0ne

offline
Опыт: 11,119
Активность:
после esc начало немного притормаживать, но это норм, но когда я набрал в чате 5, вообще смотреть стало невозможно, я еле выключил вар
Старый 04.11.2008, 12:45
MegaPhoenix

offline
Опыт: 2,932
Активность:
vdvMax
Очень хорошая наработка! Сейчас разберусь и пойду лепить триггерные москиты
+1
Старый 04.11.2008, 12:57
CDJ
Unity 3D engine user
offline
Опыт: 5,954
Активность:
vdvMax,не плохо ресурсов ест не плохо...интересно,что будет если несколько героев ето применят...крит?
Старый 04.11.2008, 13:07
NETRAT

offline
Опыт: 83,762
Активность:
каждый запуск кушает 3 метра оперативки, совершенно очевидно, утечки есть...
запуск по цифрам жутко лагает даже на моем коре дуо... запуск через esc не лагает так сильно. Достаточно хорошо удалось смоделлировать поведение москитов, правда, в оригинале, при атаке они всей толпой налетают на цель, а тут они как-то лениво атакуют пролетая мимо.
Старый 04.11.2008, 13:24
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
NETRAT ну я так и задумывал чтоб они не налитали на врагов =)
можеш написать где утечки, кроме обнуление локалок
Цитата:
интересно,что будет если несколько героев ето применят...крит?

система написанна на джазе - по этому можно давать несколько игрокам

для тех у кого тормозит увеличил период таймеров
Прикрепленные файлы
Тип файла: w3x mylocustsystem.w3x (23.2 Кбайт, 35 просмотров )
Старый 04.11.2008, 13:33
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Покритикую немного...
Неплохая задумка, но ужасное исполнение.
1. Не рекомендую юзать кеш, в циклических действиях он медленней, чем массивы.
2. Точки (location) - очень медленные, следует отказаться в пользу координат.
3. Зачем создавать таймер для каждого москита, если оптимальней будет создавать таймер для кастера?
4. Насчет двух идентичных функций (одна с изменением высоты, другая - без) - это еще спорно. Имхо, я бы сделал одну функцию и проверку параметра в ней.
5. О bj (CosBJ, DistanceBetweenPoints) я молчу.
6. Вот такое встречается:
Код:
function LocustMove takes nothing returns nothing
// . . .
// как сейчас:
call SetUnitFlyHeight(u1, hgt+GetRandomReal(-hgt2, hgt2), 100)
set hgt = GetUnitFlyHeight(u1)
// как немножечко получше ;) :
set hgt = hgt+GetRandomReal(-hgt2, hgt2)
call SetUnitFlyHeight(u1, hgt, 100)
// так как не вызывается функция получения высоты
// . . .
endfunction

7. Как только устранишь все вышеописанные проблемы - можешь со спокойной душой ставить период 0.025 (наиболее оптимальный период для движения снарядов)
Советую залезть в Jass-библиотеку и почитать теоретическую информацию (особенно про оптимизацию кода)
Старый 04.11.2008, 13:38
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Цитата:
3. Зачем создавать таймер для каждого москита, если оптимальней будет создавать таймер для кастера?

почему я сразу не додумался?
Цитата:
4. Насчет двух идентичных функций (одна с изменением высоты, другая - без) - это еще спорно. Имхо, я бы сделал одну функцию и проверку параметра в ней.

мне лень было логическую переменную в кеш пихать
Цитата:
О bj (CosBJ, DistanceBetweenPoints) я молчу.

а это вообще чё? =)
Цитата:
1. Не рекомендую юзать кеш, в циклических действиях он медленней, чем массивы.

не люблю я массивы, потому что, там лимит есть
Цитата:
2. Точки (location) - очень медленные, следует отказаться в пользу координат.

а как по другому двигать?
Старый 04.11.2008, 13:46
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
1. Не знаю.
2. Лень маст дай.
3. Грубо говоря, функции-посредники, вызывают другие функции. Использование таких функций тормозит процесс.
4. Очень маловероятно, что у кого-либо по карте будет летать больше 8190 москитов.
5. Двигаешь ты правильно, нужно изменить метод получения координат:
Код:
function LocustMove takes nothing returns nothing
// . . .
// как сейчас:
local location loc1= GetUnitLoc(u2)
local location loc2=GetUnitLoc(u1)
// как лучше:
local real x1=GetUnitX(u1)
local real y1=GetUnitY(u1)
local real x2=GetUnitX(u2)
local real y2=GetUnitY(u2)
// . . .
endfunction

6. Замечу, что если значение локальной переменной используется менее трех раз, следует инлайнить ее (подставить значение вместо названия функции). Что-то вроде такого:
Код:
// было:
local real dx = GetUnitX(target)
call SetUnitX(target, dx + 123.456)
// стало:
call SetUnitX(target, GetUnitX(target) + 123.456)


Автор, читай теор. инфу, она для того и лежит, чтобы неопытные джассеры учились и набирались уму-разуму)
Старый 04.11.2008, 14:05
Korneliy
DMF
offline
Опыт: 23,593
Активность:
было же такое на конкурсе старом геройском.
Старый 04.11.2008, 14:09
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Вышла новая версии см. Первый пост

Переписал весь код - теперь таймер создаётся на кастере, а не на каждом моските
К сожелению оставил кешь
У меньшил утечки
Просьба проверить на утечки - Всё ещё актуальна

Korneliy да я помню, герой вроде еретик назывался. Hадо пойти посмотреть тамошний код(там тоже вроде кеш используется)

vdvMax добавил:
Выяснил что утечки есть при около штук 100 москитов начинает тормозить. Прошу подскажите где утечки!
Старый 05.11.2008, 08:11
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Утечек "почти" нету, зато медленные или просто лишние конструкции везде и всюду. Как исправить - читай статьи (ссылка выше). Если сейчас тебе скажут, где ненужные вещи в твоем коде, ты сразу же исправишь их, не особо вникая в суть отличий. Разве не приятно, когда выкладываешь чистенькую опрятную систему, довольны и кодеры, и простые игроки? Имхо, пора повышать кодерские навыки, чтобы делать тру вещи.

Цитата:
Korneliy да я помню, герой вроде еретик назывался. Hадо пойти посмотреть тамошний код(там тоже вроде кеш используется)

Ну, во-первых, там кеш не используется, только параллельные массивы, во-вторых, в коде Адольфа трудно разобраться.
Старый 05.11.2008, 08:34
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Цитата:
медленные или просто лишние конструкции везде и всюду

можешь хотябы намeкнуть?
Мне кажется, ты имел ввиду, что я не правельно использую такие нативки как Atan2, SquareRoot

и вопрос:

Что быстрее
set x1 = x1 + speed * Cos(a*bj_DEGTORAD)
set y1 = y1 + speed * Sin(a*bj_DEGTORAD)

или
set x1 = x1 + speed * CosBJ(a)
set y1 = y1 + speed * SinBJ(a)


vdvMax добавил:
Цитата:
Ну, во-первых, там кеш не используется, только параллельные массивы, во-вторых, в коде Адольфа трудно разобраться.

я вообще-то про героя Сергея подумал http://xgm.guru/files.php?id=910
Старый 05.11.2008, 11:56
NETRAT

offline
Опыт: 83,762
Активность:
первое конечно быстрее...
Старый 05.11.2008, 11:59
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
а еще лучше вместо bj_DEGTORAD юзать 0.017, но мне кажется ты не совсем там копаешь (карту не смотрел), хотя от бж избавляться надо =)
Старый 05.11.2008, 12:35
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
мне кажеться надо использвать ForGroup

» или вариант Адольфа
Код:
globals
 group gr_temp=CreateGroup()
 boolexpr ex=null
endglobals

function xXx takes nothing returns boolean
 // action
 return false
endfunction

 // --->
 call GroupEnumUnitsInRange(gr_temp, x, y, r, ex)
 // <---

function init takes nothing returns nothin
 set ex=Condition(function xXx)
endfunction
Старый 05.11.2008, 13:53
zer0ne

offline
Опыт: 11,119
Активность:
я всегда ползуюсь вариантом адольфа, он для меня понятней и удобнее, ну и он явно оптимизированный
Старый 05.11.2008, 13:56
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
vdvMax,
1. У тебя каждый раз создается и удаляется группа, 2 (ненужных вызова функции) * 100 (снарядов) / 0.05 (период таймера) = 4000 вызовов функций в секунду. Естественно, перечисление с условием (aka GroupEnum) быстрее всего пикает юнитов. К тому же, не нужно создавать/удалять группу, что дает прирост к производительности.

2. Очевидно, что возврат значения переменной быстрее, чем функции (тем более bj). Для дальнейшего ускорения следует использовать переменные для хранения значений х, у, фейсинга, и в особенности числа снарядов, так как CountUnitsInGroup - жуткий тормоз.

3. Все-таки советую отказаться от кеша в пользу параллельных массивов, или хотя бы, на худой конец, от функций-оберток:
Код:
// ужас:
call set_object_rparam(locust, "Speed", speed)
// плохо:
call StoreReal(udg_cache, I2S(H2I(locust)), "Speed", speed)
// хорошо:
set LS_speed[i] = speed
Старый 05.11.2008, 15:01
vdvMax
\\_Max_//
offline
Опыт: 4,123
Активность:
Завтро начну делать на массивах. Пытался сделать с вариантом Адольфа, но не получилось (у меня вообще что-то ген пак глючит) буду делать с ForGroup
Старый 05.11.2008, 19:04
Ответ

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

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

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

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



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