Сейчас 11:04:20 Пятница, 10 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Максимальная оптимизация периодического триггера (Код где используются группы юнитов, группы >>>> фильтры)
[Вопрос] Максимальная оптимизация периодического триггера
FatalBladeДата: Пятница, 06 Января 2012, 15:50:00 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Мне нужно МАКСИМАЛЬНО оптимизировать 2 кода, где проверяются юниты с помощью групп. Как всё это преобразить в фильтры.
Код 1. Тут есть глобальная группа udg_MagesGroup, которая в итоге должна быть постоянной, то есть остаться с тем же составом юнитов.
Code
      
      local integer uid
      local unit un
      local unit uc
      local unit ur
      local player p
      local group h1 = CreateGroup()
      local group h2 = CreateGroup()
      local group h3 = CreateGroup()

         loop
             set un = FirstOfGroup(udg_MagesGroup)
             exitwhen un == null
             call GroupRemoveUnit( udg_MagesGroup, un )
             call GroupAddUnit( h1, un )
             call GroupEnumUnitsInRange( h2, GetWidgetX(un), GetWidgetY(un), 900., null )
             set uid = GetHandleId(un)
             loop
                 set uc = FirstOfGroup(h2)
                 exitwhen uc == null
                 call GroupRemoveUnit( h2, uc )
                 set p = GetOwningPlayer(un)
                 if (тут мои всякие условия, их очень много) then
                     call GroupAddUnit( h3, uc )
                 endif
             endloop
             set ur = GroupPickRandomUnit(h3)
             call SaveAgentHandle(udg_Hash, uid, 445, ur)
             call IssueTargetOrderById( un, 851971, ur )
         endloop

         loop
             set un = FirstOfGroup(h1)
             exitwhen un == null
             call GroupRemoveUnit( h1, un )
             call GroupAddUnit( udg_MagesGroup, un )
         endloop


Код 2. Тут есть глобальная группа udg_MagesGroup, которая в итоге должна быть постоянной, то есть остаться с тем же составом юнитов.
Code

      local integer uid
      local unit un
      local group g = CreateGroup()
      local real x1
      local real y1
      local real x2
      local real y2

        set un = FirstOfGroup(udg_MagesGroup)
        exitwhen un == null
          set uid = GetHandleId(un)
          call GroupRemoveUnit( udg_MagesGroup, un )
          call GroupAddUnit( g, un )
          set x1 = LoadReal(udg_Hash, uid, 460)
          set y1 = LoadReal(udg_Hash, uid, 461)
          set x2 = GetWidgetX(un)
          set y2 = GetWidgetY(un)
          if x1 == x2 and y1 == y2 then
              (Тут мои действия)
          elseif x1 != x2 or y1 != y2 then
              (Тут тоже мои действия)
          endif
          call SaveReal(udg_Hash, uid, 460, x2)
          call SaveReal(udg_Hash, uid, 461, y2)
      endloop

      loop
        set un = FirstOfGroup(g)
        exitwhen un == null
          set uid = GetHandleId(un)
          call GroupRemoveUnit( g, un )
          call GroupAddUnit( udg_MagesGroup, un )
        endloop

      call DestroyGroup(g)
      set g = null
      set un = null


Напишите мне плз как это должно выглядеть с фильтрами


 

SirNikolasДата: Пятница, 06 Января 2012, 15:53:58 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
FatalBlade, фильтрами этого не сделаешь. Используй ForGroup.

 

FatalBladeДата: Пятница, 06 Января 2012, 15:58:00 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
FatalBlade, фильтрами этого не сделаешь. Используй ForGroup.

А это быстрее в плане обработки чем то как у меня сделано?


 

SirNikolasДата: Пятница, 06 Января 2012, 16:07:11 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
ForGroup - одна native'ка, хотя и неизвестно, что у нее внутри, она явно должна быть быстрее манипуляций с созданием временной группы.
Может, помнишь, был на сайте такой человек, rixt7956, он даже несколько функций написал, вроде копирования юнитов из одной группы в другую, лишь бы не использовать ForGroup. А зря.


 

FatalBladeДата: Пятница, 06 Января 2012, 16:22:34 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Второй код мне всё понятно.

В первом коде, у меня используется 3 локальные группы + 1 глобальная. 1 локалка для "переливания" из глобальной в локальную, и обратно. 2 локалка, группа внутри группы - выделение всех юнитов в радиусе 900 от выбранного юнита из глобальной группа. 3 локалка, это "отфильтрованные" юнита 2-ой локальной группы, откуда в итоге выбирается рандомный юнит.

Если сделать это с ForGroup, то у меня получаеся запускается функция ForGroup, а оттуда N-ное количество раз запускается фильтр, проверяющий всех юнит в радиусе 900. "Отфильтрованные" юниты будут сохранены другую, новую глобальную/локальную группу, откуда будет выбран рандомный юнит. Тут не используются локальные группы, но зато запускается функция из функции. Раз у меня карта на 10 игроков, то запускаться она может от 0 до 10 раз.

Так что же тут быстрее выходит, ForGroup или локалки?




Сообщение отредактировал FatalBlade - Пятница, 06 Января 2012, 16:24:36
 

SirNikolasДата: Пятница, 06 Января 2012, 16:26:08 | Сообщение # 6
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Если в группе уже есть юниты, и их не нужно терять - ForGroup. Если юниты есть, но они больше не нужны - цикл. Если в группу набираются юниты - фильтры.

 

FatalBladeДата: Пятница, 06 Января 2012, 16:30:54 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Ок, и последний вопрос. Если для юнита U из глобальной группы выбраны все юниты в радиусе 900, и для каждого из них нужно что то сравнивать юнитом U... Короче как передать юнита U в фильтр? А то мне в фильтре нужно например проверять владельцев юнитов U и фильтрованного юнита.

 

SirNikolasДата: Пятница, 06 Января 2012, 16:33:43 | Сообщение # 8
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Занести U в глобальную переменную. Вернее, можно даже не U, а GetOwningPlayer(U).

 

FatalBladeДата: Пятница, 06 Января 2012, 16:39:01 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
Занести U в глобальную переменную. Вернее, можно даже не U, а GetOwningPlayer(U).

Весь этот процесс может происходить сразу хоть с 10 игроками. Если уж глобалка то массив нужен, не? А нельзя что бы функция что то брала? Если есть "takes nothing returns nothing", и раз можно что то возвращать, значит можно и получать. Тогда и глобалки не нужны.


 

SirNikolasДата: Пятница, 06 Января 2012, 16:41:34 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Одной глобалки хватит на всех игроков, она не перезапишется. Функции, прогоняемые в Filter и Condition, must take nothing.

 

FatalBladeДата: Пятница, 06 Января 2012, 17:05:49 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
ок спс

Добавлено (06 Январь 2012, 17:05:49)
---------------------------------------------

Quote (SirNikolas)
Одной глобалки хватит на всех игроков, она не перезапишется.

Почему не перезапишется? По какому принципу работают группы/фильтры?


 

SirNikolasДата: Пятница, 06 Января 2012, 17:07:17 | Сообщение # 12
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Потому что действия будут выполняться последовательно.

 

lawsonДата: Пятница, 06 Января 2012, 17:07:51 | Сообщение # 13
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
По какому принципу работают группы/фильтры?

Выбирает юнитов в группу согласно условиям которые должны вернуть true.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Пятница, 06 Января 2012, 17:08:03
 

FatalBladeДата: Пятница, 06 Января 2012, 17:17:13 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
И это будет утечкой? Нужно потом писать DestroyFilter/DestroyCondition ?

 

SirNikolasДата: Пятница, 06 Января 2012, 17:20:12 | Сообщение # 15
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ну, как бы тебе сказать...
Близзы утверждают, что с патча 1.24 они безутечны. Тем не менее, в BJ фильтр уничтожается.

Добавлено (06 Январь 2012, 17:20:12)
---------------------------------------------

Quote (FatalBlade)
DestroyFilter/DestroyCondition
DestroyBoolexpr*


 

FatalBladeДата: Пятница, 06 Января 2012, 17:26:42 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (SirNikolas)
DestroyBoolexpr*

А если фильтр = null?
Например - call GroupEnumUnitsInRange( g, x, y, 900., null)
Тоже удалять? Или не надо раз оно null?


 

Ty3uKДата: Пятница, 06 Января 2012, 17:30:00 | Сообщение # 17
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
А что ты удалять собираешься? Нулл- нет значения. Пустота

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

FatalBladeДата: Пятница, 06 Января 2012, 17:31:14 | Сообщение # 18
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Вот что получилось:




Сообщение отредактировал FatalBlade - Пятница, 06 Января 2012, 17:31:34
 

lawsonДата: Пятница, 06 Января 2012, 17:33:47 | Сообщение # 19
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
А если фильтр = null?

Это не фильтр нулл, это значит что там ни чего нет.

Добавлено (06 Январь 2012, 17:32:34)
---------------------------------------------

Quote (FatalBlade)
  call DestroyBoolExpr(Condition(function FilterUnits))

Не надо.

Добавлено (06 Январь 2012, 17:33:47)
---------------------------------------------

Quote (FatalBlade)
call GroupClear(g)

А это зачем, если ты ее удаляешь потом?


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

FatalBladeДата: Пятница, 06 Января 2012, 17:35:18 | Сообщение # 20
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (lawson)
А это зачем, если ты ее удаляешь потом?

Ну вродь говорят что ссылки на юнитов которые были в группре, всё равно где то там остаются


 

lawsonДата: Пятница, 06 Января 2012, 17:41:36 | Сообщение # 21
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
 if (Тут очень много условий) then           set un = null           set p = null           return true         else           set un = null           set p = null           return false       endif

Зачем дважды обнулять переменные и устанавливать что функция возвращает?
if (conditions) then
set un = null
set p = null
return true
endif
return false

Добавлено (06 Январь 2012, 17:36:52)
---------------------------------------------
И игрока обнулять не обязательно.

Добавлено (06 Январь 2012, 17:41:36)
---------------------------------------------

Quote (FatalBlade)
Ну вродь говорят что ссылки на юнитов которые были в группре, всё равно где то там остаются

Даже если бы и было так - clear тебе бы в этом не помог.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Пятница, 06 Января 2012, 17:38:24
 

FatalBladeДата: Пятница, 06 Января 2012, 17:43:22 | Сообщение # 22
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (lawson)
Зачем дважды обнулять переменные и устанавливать что функция возвращает?
if (conditions) then
set un = null
set p = null
return true
endif
return false

Действия которые написано после return, уже не могут выполняться, так ведь?


 

Ty3uKДата: Пятница, 06 Января 2012, 18:36:28 | Сообщение # 23
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Да

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Пятница, 06 Января 2012, 18:41:10 | Сообщение # 24
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
return true
endif
Но ведь до return может и не дойти - он ведь в if'е.


 

FkoFFДата: Суббота, 07 Января 2012, 11:56:34 | Сообщение # 25
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Не используй локальные группы - достаточно вредно для памяти.

 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Максимальная оптимизация периодического триггера (Код где используются группы юнитов, группы >>>> фильтры)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz