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

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

Закрытая тема
 
zer0ne

offline
Опыт: 11,119
Активность:
Перенос данных
» code
Код:
function BBB takes nothing returns nothing
    local timer t = GetExpiredTimer ( )
    local unit u
//…………………………………
    call RemoveUnit (u)
    set u = null
    call DestroyTimer (t)
    set t = null
endfunction

private function AAA takes real x,real y, real radius returns nothing
    local timer t = CreateTimer ( )
    local unit st = CreateUnit(Player (13), 'h000',x,y,GetRandomInt (0, 360))
//………………………………..
    call TimerStart (t, 1, false, function BBB)
    set st =null
    set t = null
endfunction


Как мне переместить данные о юните из переменной st (function AAA) в переменную u (function BBB), что бы была мультиприменимость (ну или как назвать хз)?
Я на Spell Contest 2 для этого пользовался XAT, но жюри сказало, что это слишком для одного спела. Кеш не предлагать.
Старый 04.11.2008, 14:55
agentex

offline
Опыт: 34,534
Активность:
ну вобщето именно кеш для этого и используется. как вариант - глобалка
Старый 04.11.2008, 14:58
zer0ne

offline
Опыт: 11,119
Активность:
Цитата:
ну вобщето именно кеш для этого и используется. как вариант - глобалка


agentex, с глобалкой не будет мультипременимости, там таймер на 1 секунду, если я за эту секунду функцию AAA вызову 5 раз
Старый 04.11.2008, 15:00
J
expert
offline
Опыт: 48,747
Активность:
Кеш имхо самое лучше для таких проблем, одна операция - это несмертельно...
Но если тебя интересует именно сам способ как сделать это без кеша, то это зависит от действий в таймере...
Раскажу на примере движения прожектила, если хочеш сделать без кеша то нужно создавать структуру прожектила, и как только создается экземпляр структуры помещать его в стек, как только удаляется, высвобождать стек от него
Иметь глобальный таймер который каждые 0,04 сек проходится по всему стеку и обновляет все структуры, кеш ненужен потомучто все нужные данные уже содержатся в структурах, паузить таймер при размере стека равном нулю, при создании структуры если на даный момент стек пуст то включить таймер...
Старый 04.11.2008, 15:06
zer0ne

offline
Опыт: 11,119
Активность:
Jon, сложновато для меня, но попробую). А вообще я думал может можно сделать небольшую систему параллельных массивов
Старый 04.11.2008, 15:10
J
expert
offline
Опыт: 48,747
Активность:
zer0ne дык, поралельными масивами надо делать в лбом случае, когда юзаеш или неюзаеш кеш, тогда будет всего одна операция с кешем - передача индекса
по поводу того способа что я сказал - он будет некорректно работать при больших периодах таймера, 1 сек это уже принцепи многовато...
Старый 04.11.2008, 15:15
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Я когда-то давно юзал вот такую системку:
Код:
library SS
// Shadow Storage :)
globals
  private integer array s
endglobals

private function H2I takes handle h returns integer
  return h
  return 0
endfunction

function SetInt takes handle h, integer i returns nothing
  set s[H2I(h)-0x100000] = i
endfunction

function GetInt takes handle h returns integer
  return s[H2I(h)-0x100000]
endfunction

endlibrary

Функции GetInt и SetInt прекрасно инлайнятся JassHelper'ом, кстати.

Для периодических действий я бы рекомендовал использовать не аттачи, а массив с индексами (что-то вроде стека) и пробегаться при каждой "работе" по стеку.
Старый 04.11.2008, 15:30
J
expert
offline
Опыт: 48,747
Активность:
черезчур не надежно, я бы не рекомендовал пользоватся в любом случае...
Старый 04.11.2008, 15:49
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
но жюри сказало, что это слишком для одного спела

но это сказал тока НТ, впринципе оно так на так и выходит, мона ХАТ, мона коректно кешем

но, если период таймера крайне мал мона одним таймером делать и вообще ничего не аттачить)

(хотел было сказать позри мой код там это есть, но потом передумал)

Цитата:
черезчур не надежно, я бы не рекомендовал пользоватся в любом случае...

это надо смотреть уже "по месту", т.е. как создаются/удаляються хендлы, но согласен как вариант "универсального" аттача это не подходит

у меня есть некоторые идеи по этому поводу, только хз будут ли они быстрее)
Старый 04.11.2008, 16:26
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, можно, конечно, использовать "бешенный массив" от векса:
Код:
globals
  private integer array s[131056] // или другое большое число до 400000
endglobals

но тогда пострадает производительность.
Если серьезно, то мне такой системы хватало (при проверках индекс не переваливал даже за 1000). В случае чего можно пофиксить оффсет =).
Старый 04.11.2008, 16:43
zer0ne

offline
Опыт: 11,119
Активность:
ну я наверно воспользуюсь способом ShadoW DaemoNа, он короткий и понятный)

zer0ne добавил:
Цитата:
у меня есть некоторые идеи по этому поводу, только хз будут ли они быстрее)

ADOLF, может покажешь, просто интересно)
Старый 04.11.2008, 17:40
adic3x

offline
Опыт: 107,539
Активность:
нет, т.к. он - просто немного по другому офрмленный от свдн)
Старый 04.11.2008, 17:42
J
expert
offline
Опыт: 48,747
Активность:
zer0ne я надеюсь ты осознаеш что способом swdn (кторый кастрирование) тебе надо будет избавлятся от опсалютно любой утечки в периодических действиях?
Старый 04.11.2008, 18:17
zer0ne

offline
Опыт: 11,119
Активность:
Jon, ну я может не понимаю, но у меня этот способ будет использоваться только между 2мя функциями и там все обнулено
Старый 04.11.2008, 18:21
adic3x

offline
Опыт: 107,539
Активность:
Цитата:
Jon, ну я может не понимаю, но у меня этот способ будет использоваться только между 2мя функциями и там все обнулено

дык любая утечка в коде, который использцется неоднократно может привести к вертолету)
Старый 04.11.2008, 18:32
zer0ne

offline
Опыт: 11,119
Активность:
я сейчас тестю, ничего не вылетает
Старый 04.11.2008, 18:33
J
expert
offline
Опыт: 48,747
Активность:
zer0ne без утечку должно быть все периодические функции, если будет улпывать хоть одна точка каждые 0,04 сек, то через 5 минут все полетит...
Старый 04.11.2008, 18:34
adic3x

offline
Опыт: 107,539
Активность:
ну скажем так, оно то и кешь и ХАТ тоже не безрезмерные, но они куда вместительнее одного массива, причем повязанного на хендлы
Старый 04.11.2008, 18:37
zer0ne

offline
Опыт: 11,119
Активность:
не думаю что у меня переполнится массив, там записывается только один юнит и он обнуляется и удаляется в конце
Старый 04.11.2008, 18:44
J
expert
offline
Опыт: 48,747
Активность:
ничего ты так и не понял)
когда будеш долговремено (5-10 минут) тестить карту
в функции SetInt() выводи на экран I2S(H2I(h)-0x100000)
Старый 04.11.2008, 18:49
Закрытая тема

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

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

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

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



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