NETRAT
offline
Опыт:
83,762Активность: |
FellGuard не-а, все равно работать не будет, ибо функция будет вызываться не в конце а внутри =\
Dragoon другого выхода нет, разбивать таймером, скажем по 1000 итераций в каждом |
03.05.2006, 13:23 | #21
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
Цитата:
Тоесть, Код:
разбивается на четыре ф-ии по j > 50 Как может это закупорить вар? Единственный недостаток - лишний вызов ф-ии, но при нечастом и немассовом использовании конструкции его можно опустить.. FellGuard добавил: А , все допер... =\ FellGuard добавил: NETRAT, а если вот тут то и использовать ExecuteFunction()??? Или проще представить ф-ию в наборе триггеров (можно текстовых) и в конце периода в j=50 звать ConditionalTriggerExecute()? |
|
03.05.2006, 13:58 | #22
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Dragoon
offline
Опыт:
544Активность: |
А что можете сказать насчет моего предпоследнего поста, решение этого вопроса путем использования динамически создаваемых триггеров ? Какие у него недостатки ?
Dragoon добавил: В общем данным методом я смог прогнать вот такой цикл и он не повис и не самозавершился. Код:
Отредактировано Dragoon, 03.05.2006 в 14:34. |
03.05.2006, 14:19 | #23
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
ExecuteFunction() вроде бы вызывает функцию в отдельном потоке - то есть если грамотно использовать то по идее должно помогать
Dragoon или я не понял, или это мало чем отличается от тех же таймеров с 0 интервалом - фактически это то же самое что и запустить новый поток - то есть основной принцип разрешения этой проблемы |
03.05.2006, 14:54 | #24
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Dragoon
offline
Опыт:
544Активность: |
Отличается. Здесь присутствует всего два потока - главный и побочный, причем побочный вызывается столько раз, сколько необходимо главному. Тут не используется ни одного таймера и нет необходимости использовать РБ и тому подобное, так как выглядит достаточно естественно с точки зрения человека, читающего код - просто выполняется вызов функции не напрямую. а через некоторую оболочку. Ну и выполняется ожидание, пока отработает эта функция. Т.е. никаких проблем синхронизации , перемешивания данных. И кстати, этот метод абсолютно не лагает, так как время тратится лишь на прямое вполнение кода. Дополнительно время тратится лишь на создание триггера в самом начале функции и уничтожение его в конце (кстати, я правильно уничтожаю его - TriggerClearActions ? ).
Dragoon добавил: Вот ... http://xgm.guru/forum/showthread.php?p=88748#post88748 |
03.05.2006, 17:20 | #25
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
zibada
offline
Опыт: отключен
|
сорри, если что не в тему, я все внимательно не читал...
call TriggerSleepAction(0) паузит поток вовсе не на 0, а на вполне реальный промежуток времени в ~0.1с. с таймерами таких эффектов нет. длинные действия удобно разбивать на несколько этапов с помощью ExecuteFunc, которая сбрасывает счетчик, и отрабатывает моментально. Цитата:
DestroyTrigger() |
|
03.05.2006, 17:29 | #26
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Dragoon
offline
Опыт:
544Активность: |
Хе, а я честно говоря думал, что там проверка стоит , если промежуток <= 0 , то return.... и спасиб за DestroyTrigger :) |
03.05.2006, 18:29 | #27
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
DimonT честно, не уверен что ExecFunc помогает - каки образом нужно бить вложенность типа
Funct1 { последовательность функций } Funct2 { loop Funct1(Looper) } то есть где использовать ExecFunc? Dragoon не, в варе все так - минимальные интервалы проверяются через константу-трешхолд. В качестве яркого примера глянь триггерную функцию Wait в Blizzard.j (по ней часто встречается фразы типа "Вот какая Wait классная функция - жаль что интервал меньше чем 0.1 сек поставить нельзя..." |
04.05.2006, 01:12 | #28
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
FellGuard
Losyash
offline
Опыт:
39,547Активность: |
NETRAT
Цитата:
Вообще, мне нравится вариант Dragoonа. Наверно из-за своей простоты - таким макаром можно разложить сколь угодно великое количество повторов без мудростей с таймерами, лагов и автостопа. NETRAT, приведи плиз пример того же кода только чрез таймер, сильно хочется взглянуть на альтернативу... |
|
04.05.2006, 06:23 | #29
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
zibada
offline
Опыт: отключен
|
NETRAT
Код:
ну или через кэш счетчик передавать... то же через таймеры: Код:
|
04.05.2006, 09:48 | #30
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
43,563Активность: |
Наверное прочитал не очень внимательно, но совершенно не понял, щзачем вообще связываться со строками? war3 со строками вообще плохо работает. А тут полно операций вроде склеивания, перевода строки в число и наоборот.
Не проше ли так:
mas1[1]= false mas1[2]= true mas1[3]= true mas1[4]= true n1=4 - число задействованных разрядов
mas2[2]= ... mas2[3]= ... ... n2=... - число задействованных разрядов
Все операции делаются в рамках одной функции с несколькими циклами. Никаких рекурсий.
Замечу, что при желании можно обойтись 1 локальным массивом, в который определенным образом записывать все три числа. Кроме того, чтобы уменьшить (if then else), можно указать тип массиву не boolean, а integer. Получится довольно таки компактный алгоритм и быстрая функция. |
04.05.2006, 09:54 | #31
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
DimonT ну да, я так и делал, но результат не отличался от того на котором обрыв происходит
|
04.05.2006, 10:05 | #32
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Dragoon
offline
Опыт:
544Активность: |
Sergey, вот ты говоришь, что вар медленно работает со строками, а попробуй написать тестик, который какую либо операцию будет прогонятиь много-много раз. Например то же самое склеивание строки. Скорость ненамного ниже, чем на языках высокого уровня.
Далее, а как ты думаешь, человеку, который будет пытаться воспользоваться твоим вариантом системы будет вообще удобно делать ввод-вывод данных (не конечных типа integer, а промежуточных)? Т.е. ему придется писать еще пару функций для представления результатов операций в удобоваримом виде. Да и чем отличается строка от массива (массива символов) ?????? Опять же, протестируй. Увидишь весьма интересные результаты. Скорость работы просто одинаковая.... Dragoon добавил: И кстати, Цитата:
ммм, как универсально получится :) Своеобразная возможность - производить только 1 операцию максимум в единицу времени. В JASS ведь нельзя передавать массивы в качестве параметров функции ? Dragoon добавил: Хотя при некотором желании это возможно - RB рулит. Отредактировано Dragoon, 04.05.2006 в 12:58. |
|
04.05.2006, 12:46 | #33
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sergey
Старейший
offline
Опыт:
43,563Активность: |
Dragoon, я знаю о чем говорю. Работа со строками намного медленнее, чем с числами. Предлагаю тебе самому провести эксперимент: реализовать 2 способа: перегонять число в строку и в массив. Создай триггер, который будет проводить операцию первым и вторым способом N раз в секунду. Постепенно увеличивай число N, чтобы добиться торможения в игре. Сопоставь число N для первого и второго способа. Думаю, ты будешь удивлен результатом.
Кроме того, при работе со строками в jass возникают драцкие утечки - результат халтурного программирования blizzard. Чем меньше работаешь со строками - тем лучше. Если можно обойтись без строк - значит лучше сделать без них. Функции для представления промежуточных результатов - не такая уж сложная вещь. Что касается глобальности массива - ну замени глобальный массив типа boolean на локальный массив типа integer. Для каждого запуска функции будет создан свой массив. Тогда операцию можно будет производить сколько угодно раз одновременно. |
04.05.2006, 13:04 | #34
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Dragoon
offline
Опыт:
544Активность: |
А я и не говорил, что работа с числами медленнее, чем со строками... это изначально бредовое утверждение. Я сказал, что строка - это массив символов. Да и честно говоря, когда 1 функция XOR(999999,999999) выполняется быстрее, чем за 0,000 сек и после 6 часов работы в цикле не подтормаживает систему - чего то это да стоит. Нет смысла переписывать алгоритм, когда он оправдывает себя
Dragoon добавил: а тестик я писал - забивал массив со ста ячейками цифрами 0 и строку символами "0". Далее засекал, сколько выполняется 1 перевод цифры 0 из числа в строку и в соответствии с этим делал вычисления скорости. |
04.05.2006, 13:53 | #35
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
Цитата:
|
|
04.05.2006, 14:01 | #36
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
zibada
offline
Опыт: отключен
|
тип string в джассе - это вовсе никакой не массив символов, а всего лишь номер в таблице строк =) прямого доступа к которой средствами джасса нет.
поэтому, например, сравнение строк через == выполняется не медленнее, чем сравнение 2-х интов =) и не двухбайтовые, а utf-8, английские символы вполне себе однобайтовые. |
04.05.2006, 16:57 | #37
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|