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

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

Ответ
 
Extremator

offline
Опыт: 40,273
Активность:
Прощай AddAction! Шучу, не прощай, или не AddAction
Напоролся на такого рода конструкцию.
Был удивлён, ибо в таком случаи можно убрать часть "Actions" у триггера
// обычно кондишн выглядит так
function Func3678 takes nothing returns boolean
   return GetSpellAbilityId() == 'A0CA'
endfunction
// а вот какой вариант я увидел (для меня всё в новинку!)
function Func3678 takes nothing returns boolean
   if GetSpellAbilityId() == 'A0CA' then
      call Func3677() // это как раз и есть экшн для триггера
   endif
   return false
endfunction
В общем:
Такой триггер каждый раз будет проверять условие и всегда будет получать фолс
(т.е. он не будет подходить к моменту когда он должен начать выполнять действия и... это вообще имеет роль? или фишка в другом?)
Но тем не менее он будет делать свою работу...
Ну и по сколько тема должна содержать вопрос, то - "Какой смысл в этой замене?"
Ведь точно так же можно убрать кондишн и сделать всё в экшене
function Func3677 takes nothing returns nothing
   if GetSpellAbilityId() == 'A0CA' then // вот сюда просто впиливать, и никаких кондишенов, да?
      local trigger t = CreateTrigger()
      local integer i = GetHandleId(t)
      local unit u = GetTriggerUnit()
      
      call Func0191(u,'A0C9')
      call SetUnitAbilityLevel(u,'A0C9',GetUnitAbilityLevel(u,'A0CA'))
      
      call SaveUnitHandle(hashtable001,(i),(14),(u))
      call TriggerRegisterTimerEvent(t, 0.2, true)
      call TriggerAddCondition(t,Condition(function Func3676))
      
      set u = null
      set t = null
   endif
endfunction

Отредактировано Extremator, 21.09.2014 в 10:45.
Старый 20.09.2014, 17:33
16GB
GhostOne User
offline
Опыт: 59,317
Активность:
too slow
Миниатюры
Кликните на картинку для увеличения
Название:  goldenslowpoke.jpg
Просмотров: 454
Размер:  24.0 Кбайт  
Старый 20.09.2014, 18:05
Extremator

offline
Опыт: 40,273
Активность:
16GB:
too slow
Это да xDD
Старый 20.09.2014, 18:13
quq_CCCP
Я белый и пушистый!
online
Опыт: 94,765
Активность:
Extremator, году в 2004 проходили, в условиях триггеров можно писать любые действия, условие выполнится немного раньше действия триггера, особого толку от таких конструкций нету.
Старый 20.09.2014, 18:34
Hellfim
Новичок
offline
Опыт: 79,890
Активность:
Если мне не изменяет память, то в условииях нельзя вейты юзать и им подобные слип экшны.
Старый 20.09.2014, 21:25
DioD

offline
Опыт: 45,184
Активность:
слипы только всякие конченные юзали, что в 2004 году что в 2014
реальных ограничений писанию всего кода прямо в кондишинах нет, ну может кроме синхронизации и кое каких специальных действий, которые не для этого и явно не в спеллах делаются.
Старый 21.09.2014, 17:58
MegaBlax

offline
Опыт: 2,352
Активность:
Это ты типо догнал что в функции Condition можно делать действия?
Старый 21.09.2014, 18:08
Кет

offline
Опыт: 111,234
Активность:
слипы только всякие конченные юзали, что в 2004 году что в 2014
Я вот так и не понял, почему. Кроме того, что они не всегда правильно работают, в отличие от таймеров, ничего плохого так и не нашёл.
Старый 25.09.2014, 18:57
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,171
Активность:
Кет, а что ты ещё хочешь "такого" найти у функции, которая должна точно отмерять время?
Старый 25.09.2014, 19:05
adic3x

offline
Опыт: 107,539
Активность:
Я вот так и не понял, почему.
Конкретно слип - считает время даже тогда, когда игра стоит на паузе, если не ошибаюсь. Вейты - костыли из слипов и таймеров. Вот и вопрос - зачем?
Старый 26.09.2014, 10:25
DioD

offline
Опыт: 45,184
Активность:
слип считает время независимо от скорости игры паузы и лагов, что может нехило доставлять когда игра идёт не стабильно.
дада когда идёт "ожидание игроков" по сети, что не редкость было 10 лет назад, эти "ожидания" шли дальше, что очень доставляло.
поллед вейт - ядрёный костыль, который использует таймер таким образом, что в принципе можно было просто использовать таймер без него самого с тем же результатом, соответственно смысл в вейте отсутствует.
соответственно те кто были неспособны это заметить и понять (или хотя бы прочитать что написано про этот метод разработчиками) не очень умные люди по умолчанию.
Лично, в качестве эксперемента реализовывал "спеллы из доты" без ретурн бага, без хеша и кеша, без вейтов, на основе структур по образу и подобию FAT, стека, набора "регистров", одного таймера и распределительной карусели, производительность была выше любых других аналогов (в ущерб "расширяемости" само собой, еще были ограничения и выравнивание, был существенный оверхеад на структурах под метаданные(вообще тупой костыль ряди экономии на числе массивов чтобы не делать под каждый спелл свой, экономия была необоснована ничем, просто ради лулзов), которые человек заметить мог только если знал что они есть) лет таки 5 назад.
Сейчас чуточку поднявшись заметил, что методом карусели делают чуть ли не все движки и вообще другой вариант работы на современных ЭВМ маловероятен.
Отличный пример майнкрафт, который работает методом карусели с клокрейтом 20 для сервера, а рендер в отдельном потоке работает с произвольным клокрейтом и тянет данные с сервера в тот момент когда он спит.
Старый 26.09.2014, 12:43
Hellfim
Новичок
offline
Опыт: 79,890
Активность:
DioD, под FAT ты имеешь в виду FAT ? И что за метод карусели? Я прочитал, что ты написал про распаралеливание, но всё же хотелось бы подробнее узнать об этом методе.
Старый 26.09.2014, 21:59
Hate
конь вакуумный
offline
Опыт: 43,124
Активность:
ну в варе метод карусели на сколько я знаю это 1 таймер и стак чеголибо, при каждом тике таймера мы пробегаемся по всему стаку и делаем действия
Старый 26.09.2014, 22:36
DioD

offline
Опыт: 45,184
Активность:
да, карусель делает действия над всеми объектами из списка через равные промежутки.
внезапно попытки оптимизировать, тормозить стартовать таймер и тому подобное даёт большой штраф, по этой причине карусель просто стабатывает каждые Х секунд и делает вещи, позволяет реализовывать многие вещи без ретурнбага и хештаблиц, но в ущерб масштабируемости, после некоторого размера массива хеш становится быстрее.
Старый 27.09.2014, 06:56
adic3x

offline
Опыт: 107,539
Активность:
да, карусель делает действия над всеми объектами из списка через равные промежутки.
Во многих случаях это очень эффективно, легко программируется и обеспечивает хорошую производительность.
Старый 27.09.2014, 22:35
ScorpioT1000
Работаем
online
Опыт: отключен
Прощай WorldEdit*
Старый 29.09.2014, 18:39
Doc

offline
Опыт: 63,163
Активность:
Когда осознаешь, что твоя карусель и сама наверняка крутится на карусели побольше, понимаешь, что пора уже удалить папочку wc3 с кампуктерна :^)
Старый 29.09.2014, 20:01
ScorpioT1000
Работаем
online
Опыт: отключен
и мамочку.
А вообще у реальных пацанов всё через плитки удаляется <3
Старый 29.09.2014, 20:48
DioD

offline
Опыт: 45,184
Активность:
начнём с того что любая карусель на любом языке крутится на x86 или x64 от одной этой мысли все байтодрочеры должны начинать цитировать ассемблер, но этого не происходит...
Старый 30.09.2014, 11:58
Doc

offline
Опыт: 63,163
Активность:
DioD, по такой логической цепочке очень далеко можно зайти, ведь на самом деле это аллах крутит главную карусель!
Старый 30.09.2014, 13:47
Ответ

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

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

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

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



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