Мне нужен эффективный способ вызвать функцию//метод//код из переменной//массива//хеш-таблицы. Я знаю, что можно вызвать функцию через функцию (непомню название) по имени или прикрепить функцию к тригеру и вызвать его. Это решение к которому я прибегну, если не найду ничего лучше. Также я видел в мемхаке функции типа fast_call и std_call, их можно использовать для вызова моих функций без неприятных последствий и есть ли в этом смысл?
Какие еще есть варианты? Какой способ самый быстрый, и какие будут побочные эффекты, если они есть?

Что делать то собрался? fast_call и std_call это жутко медленные костыли чтобы вызывать внутренние функции игры из жасса, к примеру функции оглушения юнита (которая находятся внутри game.dll), и использовать их бездумно = увидеть фпс в 6 кадров.
функция это code, указатель на функцию, она не может быть обьявлена массивом, но через C2I функцию мемхака можно получить целочисленный указатель на эту функцию, и записать его в массив целочисленных, после вернуть обратно и вызвать через ForGroup или ForForce, execute func не очень по производительности по сравнению с калбеками. ExecuteTrigger еще хуже в этом плане, скидывали же мемхак с тестом скорости.
В целом можно сделать массив групп\триггеров \таймеров и добавлять каждому по фунцкции, и вызывать.

Так же стоит сразу задуматься о том как передать в калбеки данные...
`
ОЖИДАНИЕ РЕКЛАМЫ...
15
fast_call и std_call в мемхаке это для вызова СИшных функций и не должны использоваться если не понимаешь о чем речь.
На чистом джассе работа с функциями очень ограничена и ооп не получится
Ответы (2)
11
fenathesnake, Спасибо. Дальше вопрос не обязательно к тебе, но в контексте данного ответа.
Мне не нужно полноценное ООП, а только более быстрый способ вызвать функцию по ссылке (чем бы эта "ссылка" не была). Разве нет ничего кроме ExecuteFunc и TriggerEvaluate (ну и утекающего TriggerEvaluate)? Фильтры вроде можно класть в массив, есть ли способ вызвать фильтр через мемхак?
Если и в правду нет других способов, то, по моим не очень проверенным данным, TriggerEvaluate самый быстрый (в среднем) способ. Есть такие у кого другое мнение? Буду рад вас услышать.
Ну и возвращаясь к функциям из мемхака. У меня есть ряд задач, где нужно много однотипных вычислений над массивами или хеш-таблицами размером, грубо скажем, 70 000 элементов. Насколько будет сложной задача, для незнающего человека, написать функцию на С и внедрить её в карту? Этому где-то учат? =)
21
jass_dev, что точно работает, так это boolexpr и trigger evaluate. Утечки можно убрать через trigger remove condition и destroy boolexpr. И boolexpr, и triggercondition можно сделать массивами, ведь они handle. Так что через них можно запилить подобие function array
38
Есть тип code, это коллбек и вроде как он может быть в хештейбле, по крайней мере в ujapi я видел разные преобразования, и в мемхаке там есть код в интежер для хранения в массиве

Ещё есть ExecuteFunc, который принимает строку с именем функции
Ответы (1)
32
ScorpioT1000, ну это в UJAPI, с мемхаком в калбеки аргументы передавать можно, че дальше то?
Ни в хт, никуда не записать, code чисто для калбеков и никуда в jass его не запихать. ExecuteFunc не очень в плане производительности, нет конечно в обычных условиях похер, но вот 70000 вызовов наверное кончатся фаталом. Там создается новый поток и вычисляется событие которое его вызвало для того чтобы из потока родителя, в дочерний поток перешли все GetTrigger*** нативки, его можно представить как создание еще 1 триггера, добавления ему указанной функции и подцеплению к событию что вызвало поток родитель.
32
Что делать то собрался? fast_call и std_call это жутко медленные костыли чтобы вызывать внутренние функции игры из жасса, к примеру функции оглушения юнита (которая находятся внутри game.dll), и использовать их бездумно = увидеть фпс в 6 кадров.
функция это code, указатель на функцию, она не может быть обьявлена массивом, но через C2I функцию мемхака можно получить целочисленный указатель на эту функцию, и записать его в массив целочисленных, после вернуть обратно и вызвать через ForGroup или ForForce, execute func не очень по производительности по сравнению с калбеками. ExecuteTrigger еще хуже в этом плане, скидывали же мемхак с тестом скорости.
В целом можно сделать массив групп\триггеров \таймеров и добавлять каждому по фунцкции, и вызывать.

Так же стоит сразу задуматься о том как передать в калбеки данные...
Принятый ответ
Ответы (3)
11
quq_CCCP, Я много чего хочу сделать. =) Во многих механиках которые я хочу реализовать используются конечные автоматы, разумеется, мне нужно как-то переключать им состояние и крутить код. Возьмем к примеру ИИ. В каждого игрока есть несколько колонистов, которым он может давать задачи. У них есть глобальная задача, например, рубить дрова. Также есть локальная задача - найти дерево, срубить дерево, поесть, сбежать от волка, атаковать волка... Вот я и хочу разузнать различные нюансы, чтобы решить, как лучше всего это реализовать.
На данный момент склоняюсь к тому, чтобы на каждое состояние создать цикл и группу. Если отключать таймер для пустых груп, то вроде будет норм, да и состояние нужно обновлять не часто, 0.3-0.5 сек должно быть норм. А еще можно разбить на несколько груп со сдвигом в 0.1 секунды, чтобы распределить нагрузку, лишь бы не наложились таймеры с других механик.
Как же мне не хватает ООП...
31
Как же мне не хватает ООП...
Ну так что мешает использовать AngelScript?
11
nazarpunk, мешает то, что у меня нет влияния на массы, нет фанбазы, чтобы сделав карту на UJApi не сидеть в пустом единственном лобби с приставкой UJ.
38
Полиморфизм, кстати, не особо связан с функциями высшего порядка. Хотя одно может использоваться через другое. Полиморфизм - это разная реализация логики в зависимости от типов входных аргументов метода или функции.
Этот комментарий удален
Чтобы оставить комментарий, пожалуйста, войдите на сайт.