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

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

Ответ
 
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
local trigger
Где то слышал, что локальный триггер меньше памяти занимает, поэтому пользуюсь
Код:
local trigger trig=CreateTrigger()

в конце обнуляю
Такое нужно использовать всегда или нет? Или бывают случаи, когда такое нельзя? Разъясните, пожалуйста.
[+] замечание от alexkill: 1.2 (учим русский язык)

Отредактировано alexkill, 11.01.2011 в 16:49.
Старый 10.01.2011, 19:21
Nekit1234007

offline
Опыт: 11,916
Активность:
Триггер — он и в Африке триггер.
Старый 10.01.2011, 19:23
agentex

offline
Опыт: 34,834
Активность:
как он может меньше памяти занимать? хД
Старый 10.01.2011, 19:35
ScorpioT1000
Работаем
online
Опыт: отключен
на 8 байт, и то не факт
ScorpioT1000 добавил:
я бы советовал как "правило приличия" оставлять все ссылки под контролем, чтобы потом можно было ими управлять, т.е. частный случай триггеры
Старый 10.01.2011, 22:14
Method

offline
Опыт: 152
Активность:
Klop:
local trigger t = CreateTrigger()
local integer i = 0
loop
exitwhen i > 15
   call TriggerRegistryPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
   set i = i+1
endloop
call TriggerAddAction(t,function Actions)
set t = null
пользуюсь так
у тебя 15 игроков играют?
Делай exitwhen всегда внизу/в конце лопа:
 loop
    call TriggerRegistryPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    set i = i+1
    exitwhen i > 15
 endloop
Да и вообще не понимаю зачем через лоп добавлять событие, по-моему слегка глуповато

Отредактировано Method, 10.01.2011 в 23:19.
Старый 10.01.2011, 23:12
agentex

offline
Опыт: 34,834
Активность:
да локально обьекты вобще нельзя создавать (если ты их не уничтожаешь в этой же функции)
Старый 10.01.2011, 23:14
Forsaken
has left the game
offline
Опыт: 3,404
Активность:
Method, глуповато писать "лоп". =)
Старый 10.01.2011, 23:15
agentex

offline
Опыт: 34,834
Активность:
Делай exitwhen всегда внизу/в конце лопа:
бред
Да и вообще не понимаю зачем через лоп добавлять событие, по-моему слегка глуповато
тоже отчасти
Старый 10.01.2011, 23:15
ScorpioT1000
Работаем
online
Опыт: отключен
ну иногда полезно регистрировать только для активных игроков, т.е. i от 0 до n
ScorpioT1000 добавил:
особенно когда стопицот таких триггеров
Старый 10.01.2011, 23:18
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
Где то слышал што локальный триггер меньше памяти занимает, поэтому пользуюсь
как соотносятся 8 байт со средними 2-4 Гб оперативной у геймера? одна/пятисотмиллионная. ещё 1 гений оптимизации -_-. за это бессмысленное порево, ты афтар, хочешь ещё и потерять глобал ссылку на триггер, исключая возможности управления им после. гениально
Скайнет добавил:
Method, варик просто порвёт и разорвёт на куски от одной лишней проверки. сегодня собрались гениальные люди -_-
Старый 11.01.2011, 00:12
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Method:
Делай exitwhen всегда внизу/в конце лопа:
лол в чём разница цикла с пред условием и пос условием,в том что проверка находится после выполнения дейсвий цикла или перед дейсвиями цикла,отсюда понятно что разницы нету
обьясняю почему 15,это так примерно на всех игроков включая нейтралов всяких,если так хочется поставь кол-во играющих игроков
зачем цикл? обьясняю,так код выглядит компакнее чем кол-во строк,так как пользуюсь cJass сокращается до минимума или же можно делать отдельной функцией указывать кол-во игроков
 private void Init(){
    trigger t = CreateTrigger()
    int i = 0
    whilenot i > 11{
        TriggerRegisterPlayerUnitEvent(t,Player(i),EPUSE,null)
        i++
    }
    TriggerAddAction(t,function Create)
    t = null
 }
так как этот триггер будет использоваться часто его можно сделать одной функцией и получится так
 define{
    EPUSE = EVENT_PLAYER_UNIT_SPELL_EFFECT
 }

 void EventUnit(int maxp,playerunitevent p,code fun){
    trigger t = CreateTrigger()
    int i = 0
    whilenot i >maxp{
        TriggerRegisterPlayerUnitEvent(t,Player(i),p,null)
        i++
    }
    TriggerAddAction(t,fun)
    t = null
 }

 private void Init(){
    EventUnit(11,EPUSE,function Create)
 }
Старый 11.01.2011, 00:43
agentex

offline
Опыт: 34,834
Активность:
ололо, а если экзитвен в конце и условие не выполнится - лишняя итерация?
не знаешь - не пиши
я то знаю, поэтому пишу.
Старый 11.01.2011, 00:47
JassMan
свободен
offline
Опыт: 4,193
Активность:
Во-первых, для цикла придётся создавать лишнюю интегер — это раз!
На эту интегер тоже тратиться время на её инициализацию — это два.
В-третьих, будут происходить лишние операции set i=i+1
когда можно тупо самому ручками написать несколько раз 1 действие без всяких i+1
Ну а в-четвёртых, это не имеет никакого отношения к теме данного топика.
local trigger trg
Локальность всего лишь навсего позволяет обнулить переменную в конце функции set trg=null (тем самым удалив какую-то жалкую ссылку ("ярлык").
Хотя это же можно сделать и с глобальной переменной.
Глобальность только позволяет использовать данный триггер в любом месте кода.
А так они ничем не отличаются ни по весу ни чем вообще, кроме того, что к локальной переменной происходить быстрее обращение, чем к глобальной.
Локальный триггер используется в основном для динамических систем (особенно в триггерных скиллах).
Использование локального триггера позволяет сохранить "локальность" его ссылки. В отличии от глобального, где поверх старого может писаться новое значение.
Рекомендую почитать статьи. И разобрать такое понятие как "локальность" и его преимущества, чтобы в дальнейшем не задавать такие вопросы.
Старый 11.01.2011, 00:54
agentex

offline
Опыт: 34,834
Активность:
Это как?
globals
integer n = -1 //n меняется во время игры, от -1. используется к примеру в счетчиках структур
endglobals
local integer i = 0
loop
exitwhen i>n
//mnogo koda
endloop
и
local integer i = 0
loop
//mnogo koda
exitwhen i>n
endloop
Старый 11.01.2011, 00:58
Klop
Папа римский
offline
Опыт: 13,006
Активность:
JassMan:
Во-первых, для цикла придётся создавать лишнюю интегер — это раз!
На эту интегер тоже тратиться время на её инициализацию — это два.
В-третьих, будут происходить лишние операции set i=i+1
скажи у тебя Pentium 1,что ыт так беспокоишся про эти 3 несчасные операции?
и у тебя карта повиснет от них на 5 сек,но лучше скопирую 12 строк чем сокращу но - 3 операции,это того стоит???,может я ещё чего не допонимаю,но всёже
Старый 11.01.2011, 01:00
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Скайнет:
хочешь ещё и потерять глобал ссылку на триггер, исключая возможности управления им после. гениально
я так понял что вообще нужно следить по ситуации(какой триггер),если его нужно будет отключать тогда глобал,хотя в джаззе с отключениями ,удалением,вообщем одноразовые триггеры,а для спеллов покупок предметов и прочего лучше использовать локал так как дальнейшее отключение не нужно
зафлудили бедную тему мы,всё началось пока один не вокрикнул что не там exitwhen поставили
Старый 11.01.2011, 01:08
agentex

offline
Опыт: 34,834
Активность:
не ну в ДАННОМ случае да, правильно ставить экзитвен вконце потому что игроков 0 не может быть. однако утверждать что верхний экзитвен вселенское зло может только нешарящий человек.
Старый 11.01.2011, 01:34
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Холи вар тут равзели))Я вроде понял)
Старый 11.01.2011, 17:16
DioD

offline
Опыт: 45,134
Активность:
Где то слышал, что локальный триггер меньше памяти занимает, поэтому пользуюсь
на заборе тоже написано, а там дрова.
Старый 11.01.2011, 17:54
Ответ

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

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

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

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



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