DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
Создание безопасного и эффективного кода(перевод)
О статьеЭта статья является переводом статьи Themerion с сайта wc3c Это мой первый публичный перевод, поэтому просьба тапками не закидывать,и если вы нашли ошибку в переводе написать в теме,или мне в ПМ,что бы я её исправил ссылка на саму статью Благодарности: Hellfim tgonta О чём пойдёт речьЭта обучающая статья не рассчитана на новичка. Предполагается, что читатель уверенно владеет основами языка Jass и vJass. Кроме того, он должен знать про утечки, и как от них избавится. Я не буду добавлять примеры к статье, т.к я не хочу просматривать wc3campaigns часами, что бы найти их. Если у тебя есть ссылки на результаты тестов или что - то подобное, пожалуйста, напишите тут «План» статьи:
Краткая информация о защите
Группы юнитовСоздание / УничтожениеМы все знаем, что когда создаёшь локальную группу, то её надо уничтожить, что бы предотвратить утечки. Это так. Проблема состоит в том, что создание группы занимает некоторое время(хоть и не большое). Это имеет значение, если вы хотите использовать много групп периодически . Кроме того, уничтожение группы юнитов в определённых ситуациях может вызвать утечки. Лучше будет, если вы будете использовать глобальную группу вместо локальной: Код:
Иногда только одной группы бывает не достаточно. Тогда ты можешь создать свой собственный стэк групп, при помощи любой структуры. Можно использовать это: Код:
Работа с цикламиДействие выбора всех юнитов из группы..это ForGroupBJ(), которая является «оболочкой» вокруг ForGroup(). Если у Вас уже есть группа, самый быстрый путь к циклу это действительно через ForGroup(). Используйте временные(уникальные) глобальные переменные, если надо. Код:
Если вам нужно сделать лишь одиночный цикл по группе, то не используйте ForGroup. Это очень важно для создания заклинаний. Ты можешь подключить цикл напрямую в вызове GroupEnum Код:
Прикрепление(aka аттач)Используйте нестандартную функцию H2I(на новом патче нативка GetHandleId – примеч. переводчика) для трансформации чего- либо в целочисленное(integer). Код:
Аттач используется для того, что бы прикрепить данные к объектам (есть несколько способов осуществить это). Для безопасности вам рекомендуется прикреплять только целые числа(integer) и структуры(struct). Иногда Warcraft ведёт себя довольно интересно, если вы прикрепляете(или восстанавливаете(вытаскиваете)) другие вещи, кроме целых чисел и структур. Поэтому желательно, если вы откажетесь от использования следующих вещей:
Естественно существуют более современные и устойчивые системы для аттача. Их много.Timer Utils (ссылка на наработку [1.24+]) - одна из самых популярных систем такого рода. Она позволяет прикреплять данные только к таймерам. Цитата:
Разъяснение: когда он(Vexorian) говорит, что скорость не важна, он подразумевает, что вы должны найти другое решение чем нестандартное прикрепление(такое как gamecache/table). Если вам и вправду нужно быстрое прикрепление к чему – либо, кроме таймеров посмотрите HSAS, HAIL , или более старый CSData(для юнитов, используйте индексирование). Пример прикрепления с помощью TimerUtils: Код:
Обратите внимание как TimerUtils связывает функции старого(ReleaseTimer(timer)) и нового(NewTimer()) таймера. Они работают более безопасно и быстро, нежели Создание/Уничтожение Таймера. Индексирование юнитовПрикрепление данных к юнитам довольно проблематично. Юнит может умереть/ разложиться/быть удалённым из игры, и мы должны удалить прикреплённые к нему данные. Однако, нет такого событие «Юнит удалён из игры» Уже только поэтому нам нужно использовать систему индексации. Такие системы сосредотачиваются на юнитах и управляют процессом быстрого "связывания" числа с ними. Вместе PUI и DUI дадут функцию, которая для каждого юнита создаёт уникальный индекс. Затем можно использовать этот индекс для сохранения чего-либо в массив. DUI предлагает ещё и callback-функцию, когда замечает удаление юнита. Простой подсчётчик убийств : Код:
Динамические триггерыПроблемы безопасностиТриггер, у которого есть свои атрибуты (событие/условие/действие), созданный скриптом, который запускается не при инициализации карты называется динамическим. Если вы не знаете о триггерах в Jass, порекомендую вам прочитать статью Vexorian'a.(Ссылка на статью) После того, как вы сможете создавать триггеры на лету, вам нужно будет их уничтожать для того, чтобы избежать утечек памяти. Это плохо, так как, уничтожая триггер по определённым условиям (использованные или вызванные триггером wait-функции в коде) мы можем заставить два разных хендла получить один и тот же идентификатор. Конечно, без динамических триггеров в некоторых случаях не обойтись. К примеру, узнать, получил ли юнит урон, можно лишь динамическими триггерами. Единственное решение - вообще их не уничтожать и принять как должное небольшие утечки. Лучше принять триггер с маленькой утечкой, чем вылетающую игру. Для аур и других событий, которые связаны с входом в дистанцию, используйте периодический GroupEnum. Условия против действийТриггерные условия работаю быстрее действий, но в условии вы не можете сможете ждать, однако выбор за вами Код:
Спасибо за вниманиеОтредактировано DragonSpirit, 05.11.2009 в 22:19. |
|
04.11.2009, 23:36 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
tgonta
Pixelated Sora Coder
offline
Опыт:
3,160Активность: |
Из~DragonSpirit:
Услышал впервые. Вообще, найс статья, пригодится прогрессирующим кодерам, некоторые вещи(как выше процитированная) я услышал впервые. |
04.11.2009, 23:55 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Статья действительно хорошая, и будет полезна как новичкам в джасс-коддинге, так и "середнячкам". Перевод довольно хороший, в общем хорошая работа =) |
05.11.2009, 00:36 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
KotoBog
Meow
offline
Опыт:
36,046Активность: |
Хоть я и понял далеко не всё, но выглядит аппетитно) Молодец) Ща ещё раз перечитаю, мб больше чем 40% дойдёт)) |
05.11.2009, 15:46 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,531Активность: |
такой функции не существует) ололо? О_О в последнем примере "enfunction"
Enein добавил: ну а так впринципе статья ниочем... |
05.11.2009, 16:04 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
Enein, спасибо,очепятки исправил
мб ты для себя ничего нового не узнал,но некоторые что то может и откроют |
05.11.2009, 16:05 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
XOR
offline
Опыт:
38,284Активность: |
Неплохая статья, только перевод иногда шалит)
XiMiKs добавил: Жаль только маленькая статья.. |
05.11.2009, 16:10 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ShadoW DaemoN
offline
Опыт:
37,078Активность: |
Что-то мне подсказывает, что для хгм такого рода статья должна писаться отечественными, а не заграничными кодерами. Упоминание систем, сделанных ими же (то есть загранкодерами), считаю не совсем уместным, так как большинство не юзают их.
Также, если делаешь так:
то указывай ссылку на статью. А вообще лучше так НЕ делай. Кроме того, статья не первой свежести (1 августа 2008 года), что как бы намекает нам о необходимости добавления и обновления информации по теме касательно патчей 1.24+. Практически все нестандартные системы аттача после выхода 1.24 нежно выкидываются.
Алсо, Адольфушка писал статью об оптимизации, в которой более подробно рассмотрен один из вопросов данной статьи.
В общем и в целом, я против данного варианта статьи. |
05.11.2009, 16:13 | #8
+1/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
ShadoW_DaemoN, про 1.24 я написал(в пункте про H2I)
та же TimerUtils переведена на 1.24 сейчас добавлю ссылки на статьи |
05.11.2009, 16:23 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,531Активность: |
DragonSpirit, ты не ответил по поводу этого:
помоему или ты что-то неправильно перевел, или автор статьи дугак -.- |
05.11.2009, 16:31 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
Enein, Destroying a timer and then setting its variable to null might sometimes cause a crash. если я неправильно перевёл, укажите на ошибку - буду очень благодарен,хотя не исключён и второй вариант.. |
05.11.2009, 16:36 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Enein, так и есть, хотя я лично такого ни разу не встречал. |
05.11.2009, 22:07 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Enein
Silenced by ZlaYa1000
offline
Опыт:
43,531Активность: |
доказательства?) я специально переспросил у нескольких реально шарящих людей - все на 100% согласны с тем, что это бред тоже бред, ибо jngp провернуть такое не даст с этой статьи как минимум половину содержимого нужно выпилить) ибобред |
05.11.2009, 22:17 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
я помню был подобнй бред про то, что IsUnitType может вернуть не 1 и не 0, и поэтому надо проверять ее через сравнение с булькой. по моим личным исследованиям вар весьма православно обрабатывает подобные ситуации, считя все, что не равно 00h - true |
05.11.2009, 22:24 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Sunn
To feel joy, not be blue
offline
Опыт:
4,975Активность: |
Хм, немного непонятно с "Условия против действий". Не совсем уверен, что это хорошая идея... ну точнее что это всегда хорошая идея. Например, имея кондишн вида:
Код:
который запускается каждый раз, когда для любого юнита на карте выполняется EVENT_PLAYER_UNIT_SPELL_EFFECT, будет выделятся память под набор локалок, что не есть хорошо. Не лучше ли в таких случаях делать действия отдельно от условий?(время на аллокацию vs вызов Action) |
07.11.2009, 17:35 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
DragonSpirit
у - уходи
offline
Опыт:
22,625Активность: |
Sunn,
|
07.11.2009, 18:38 | #16
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
bee
vjass.optimizer
offline
Опыт:
16,615Активность: |
стать ниочем имхо а разве про таймеры он не приувеличил? что возможен десинк... бред ничего нового не узнал |
23.11.2009, 03:43 | #17
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|