Сейчас 12:15:50 Вторник, 23 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Утечки
[Вопрос] Утечки
HockДата: Воскресенье, 27 Ноября 2011, 13:51:11 | Сообщение # 1
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
Вопрос такой-Из нижеперечисленных действий - есть ли утечные?
И как это исправить?
Code
local unit u=GetTriggerUnit()
local real x=GetUnitX(u)
local real y=GetUnitY(u)
     local unit d=CreateUnit(GetOwningPlayer(u),'h008',x,y,0)
     call ForGroup( GetUnitsInRangeOfLocAll(425.00, GetUnitLoc(u)), function Trig_TimeStop_Func001A )
     call TriggerSleepAction(3 * GetUnitAbilityLevel(GetTriggerUnit(),'A00R'))
     call RemoveUnit(d)
     set d=null
     set u=null

Code
[code]local real x=-10.2
local real y=1719.1
     set udg_Hero[0]=CreateUnit(Player(0),'H000',x,y,0)

local real x=-4779.6
local real y=2400.3
call RemoveUnit( GetTriggerUnit() )
call AddHeroXP(GetKillingUnit(),30,false)
call TriggerSleepAction( 7.00 )
call CreateUnit(Player(10),'n00B',x,y,0)[/code]

Code
local real x=-4466.9
local real y=6847.5
local unit u=GetTriggerUnit()
call SetUnitX(u,x)
call SetUnitY(u,y)
call PanCameraToForPlayer(GetOwningPlayer(u),x,y)


Code
local real x=GetUnitX(GetKillingUnit())
local real y=GetUnitY(GetKillingUnit())
local real x2=-4485.5
local real y2=7793.2
     call AddHeroXP(GetKillingUnit(),5000,false)
     call DisplayTextToForce( GetPlayersAll(), ( GetPlayerName(GetTriggerPlayer()) + ( "  |cFFFF093BСтер в порошок" + ( " Морского гиганта и получает сокровенные  |cFF76FF3B" + I2S(udg_BG) ) ) ) )
     call AdjustPlayerStateBJ( udg_BG, GetOwningPlayer(GetKillingUnitBJ()), PLAYER_STATE_RESOURCE_GOLD )
     call CreateItem(udg_ItepDropChoseFromBosses[GetRandomInt(0, 19)],x,y)
     call CreateItem(udg_ItepDropChoseFromBosses[GetRandomInt(0, 11)],x,y)
     call RemoveUnit( GetTriggerUnit() )
     set udg_BG = ( udg_BG + 250 )
     set udg_WO = 1
     call TriggerSleepAction( 30.00 )
     call CreateUnit(Player(11),'n009',x2,y2,0)


Code
local real x=-10.2
local real y=1719.1
     call SetUnitX(u,x)
     call SetUnitY(u,y)
     call TriggerSleepAction( 30.00 )
     set udg_WO = 0


http://warcraft3ft.info/forum/26-34958-1
 

BorodachДата: Воскресенье, 27 Ноября 2011, 14:18:26 | Сообщение # 2
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Hock, я заметил только утечку буля и вызов ненужной бж функции.
1)решается вроде так...
local filterfunc f=Trig_TimeStop_Func001A
call ForGroup( GetUnitsInRangeOfLocAll(425.00, GetUnitLoc(u)), function f )
call DestroyFilter(f)
2)так... но это по вкусу, утечки нет просто вызов лишней функции
call SetPlayerState(GetOwningPlayer(GetKillingUnit()),PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(GetOwningPlayer(GetKillingUnit()),PLAYER_STATE_RESOURCE_GOLD)+udg_BG)


Karamba
 

lawsonДата: Воскресенье, 27 Ноября 2011, 15:07:58 | Сообщение # 3
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Borodach)
я заметил только утечку буля и вызов ненужной бж функции.

когда бул пишется сразу в функции группы то он не вызывает утечки.

Добавлено (27 Ноябрь 2011, 15:07:10)
---------------------------------------------

Quote (Hock)
GetUnitsInRangeOfLoc

Утечка

Добавлено (27 Ноябрь 2011, 15:07:58)
---------------------------------------------
Самая большая твоя утечка - это вейт!


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

Ty3uKДата: Воскресенье, 27 Ноября 2011, 15:16:15 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
+1 надо юзать GroupEnumUnitsInRange() и таймер, плюс избавиться от функций, которые создает гуи. Ну и таймер

Добавлено (27 Ноябрь 2011, 15:16:15)
---------------------------------------------
Ну и Лавс правильно сказал- бульэкспр как фильтрфунк не утекает, если писать его сразу в функцию


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

OxygenDДата: Понедельник, 28 Ноября 2011, 14:41:17 | Сообщение # 5
2 уровень
Группа: Проверенные
Сообщений: 25
Награды: 0
Репутация: 11
Блокировки:
Quote (Hock)
 call DisplayTextToForce( GetPlayersAll(), ( GetPlayerName(GetTriggerPlayer()) + ( "  |cFFFF093BСтер в порошок" + ( " Морского гиганта и получает сокровенные  |cFF76FF3B" + I2S(udg_BG) ) ) ) )


Не хорошо.

Юзай >>>

Code
     
   function Msg takes string s, integer id, real time returns nothing
       call DisplayTimedTextToPlayer(Player(id), 0, 0, time, s)
   endfunction


Пою в душе на паскале.


Сообщение отредактировал OxygenD - Понедельник, 28 Ноября 2011, 14:41:51
 

HockДата: Понедельник, 28 Ноября 2011, 14:47:20 | Сообщение # 6
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
OxygenD, придется юзать 10 раз,разве лучше?)
Ибо нужно показать 10-м


http://warcraft3ft.info/forum/26-34958-1
 

HexingДата: Понедельник, 28 Ноября 2011, 15:06:18 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Hock, юзай
Code
call DisplayTextToPlayer(GetLocalPlayer(),GetPlayerName(GetTriggerPlayer())+" |cFFFF093BСтер в порошок" +" Морского гиганта и получает сокровенные|cFF76FF3B"+I2S(udg_BG))

меньше скобок = лучшая читабельность ;)




Сообщение отредактировал Hexing - Понедельник, 28 Ноября 2011, 15:06:37
 

HockДата: Понедельник, 28 Ноября 2011, 16:30:42 | Сообщение # 8
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
Hexing, Просто я делал карту в смеси гуй и жасса
Т.к вроде знаю что да как в последнем,но все же,все на нем еще не получается,и столкнулся
с проблемой гдет после 30 минут активной игры,лаги оО у меня комп староватый,но все же.
У тестеров как они говорят и после часа не было,но я решил переделать все что смогу,вот и спросил
Устранено ли в этих кодах все?))
А эту строчку поменять как ненашел,более быстрой замены,чем цикл,для смены показам игрокам.


http://warcraft3ft.info/forum/26-34958-1
 

HexingДата: Понедельник, 28 Ноября 2011, 16:49:12 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (Hock)
карту в смеси гуй и жасса

заранее неудачная идея, в результате ничего хорошего не получится
Code
call SetUnitX(u,x)
call SetUnitY(u,y)
меняй на SetUnitPosition(u,x,y)
Code
call TriggerSleepAction( 7.00 )

убрать все sleep-ы нахрен
лепи из таймеров+хэша
часто функция просто дохнет иззи слипов(обрывается)
Code
AdjustPlayerStateBJ

раскрой bj - юзай SetPlayerState(player, state, GetPlayerState(player, state) + value)
остальное вроде нормуль
но советую вместо x и y писать ручками числа ибо это быстрее
переменные используются в случаях, когда они могут принять неизвестное нам значение
удачи ;)
кстати не знаю быстрее ли это, но я завожу 12 констант типа player со значениями Player(0)...Player(11) соответственно, и по возможности использую эти константы вместо Player(0) и т.п. ведь Player(0) это лишний вызов функции, но опять же это дело каждого


 

SirNikolasДата: Вторник, 29 Ноября 2011, 15:17:27 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Hexing)
call SetUnitX(u,x)
call SetUnitY(u,y)
Работает чуть быстрее, чем SetUnitPosition, т. к. не проверяет проходимость точки, зато если юнит вылетит за границы карты, будет Fatal Error.


 

YaNeZnauJassДата: Вторник, 29 Ноября 2011, 19:44:22 | Сообщение # 11
1 уровень
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 15
Блокировки:
Code
local real x=GetUnitX(u)  
  local real y=GetUnitY(u)


Code
local real x=GetWidgetX(u)  
  local real y=GetWidgetY(u)
 

Ice_AirДата: Вторник, 29 Ноября 2011, 23:24:43 | Сообщение # 12
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: -56
Блокировки:
Quote (Hock)
утечные

Quote (Hock)
ForGroup( GetUnitsInRangeOfLocAll(425.00, GetUnitLoc(u)), function Trig_TimeStop_Func001A )

Quote (Hock)
GetUnitsInRangeOfLocAll

Quote (Hock)
GetUnitLoc(u)
 

FatalBladeДата: Среда, 30 Ноября 2011, 01:51:01 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Hock)
call ForGroup( GetUnitsInRangeOfLocAll(425.00, GetUnitLoc(u)), function Trig_TimeStop_Func001A )

Могу ошибаться, но помоему тут 2 утечки. Точку и группу то надо удалять. А вообще лучше без точки. Вот так:

Code
local group g = CreateGroup()
call GroupEnumUnitsInRange(u, GetWidgetX(u), GetWidgetY(u), 425.00, function Trig_TimeStop_Func001A)

Это даже не БЖ, что очень хорошо.

Затем, можно и без отдельной функции делать действия для каждого юнита в группе. Для выделения юнита делаешь

Code
set un = FirstOfGroup(g)
loop
   exitwhen un == null
     бла бла бла
endloop
call DestroyGroup(g)
set g = null
set un = null


 

SirNikolasДата: Среда, 30 Ноября 2011, 14:49:06 | Сообщение # 14
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (FatalBlade)
Code
set un = FirstOfGroup(g)
loop
     exitwhen un == null
     бла бла бла
endloop
call DestroyGroup(g)
set g = null
set un = null
Code
globals
     constant group udg_G = CreateGroup()
endglobals

//...
     local unit u
     call GroupEnumUnitsInRange(u, GetWidgetX(u), GetWidgetY(u), 425., null)
     loop
         set u = FirstOfGroup(udg_G)
         exitwhen u == null
         call GroupRemoveUnit(udg_G, u)
         //...
     endloop
//...
По крайней мере так. А лучше перебирать юнитов прямо в функции-условии.


 

Ty3uKДата: Среда, 30 Ноября 2011, 14:50:05 | Сообщение # 15
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, но такое объявление глобалок работает только в jngp, разве нет?

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

SirNikolasДата: Среда, 30 Ноября 2011, 14:54:06 | Сообщение # 16
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ctrl+B еще никто не отменял.

 

YaNeZnauJassДата: Среда, 30 Ноября 2011, 15:25:24 | Сообщение # 17
1 уровень
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 15
Блокировки:
SirNikolas, А лучше фильтром.
Code

constant group Group=CreateGroup()

boolean FilterG ()
{
if GetWidgetLife(GetEnumUnit())>.425
{
  return true
  }
}

// и вызывать этим:

GroupEnumUnitsInRange (Group, x, y, 500., Condition(function FilterG))
 

HockДата: Среда, 30 Ноября 2011, 20:22:54 | Сообщение # 18
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
Спасибо всем)
Есть еще вопрос:
Как раскрыть бж тут?
Code
        call RemoveItem( GetItemOfTypeFromUnitBJ(GetTriggerUnit(), 'I00M') )


http://warcraft3ft.info/forum/26-34958-1
 

lawsonДата: Среда, 30 Ноября 2011, 20:40:56 | Сообщение # 19
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Hock)
Как раскрыть бж тут?

помоему в две функции раскрывается. Дуратский бж, посмотри как он работает в function list


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

HockДата: Среда, 30 Ноября 2011, 20:54:50 | Сообщение # 20
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
Code
call RemoveItemFromStock(u,'I00M')

Это заменит?


http://warcraft3ft.info/forum/26-34958-1
 

BorodachДата: Среда, 30 Ноября 2011, 20:59:33 | Сообщение # 21
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Hock,
Code
local integer i=0
local item    Item
     loop
         set Item=UnitItemInSlot(GetTriggerUnit(),i)
         if (Item != null) and (GetItemTypeId(Item)=='I00M') then
             call RemoveItem(Item)
         endif
         set i=i+1
         exitwhen i>=bj_MAX_INVENTORY
     endloop


Karamba
 

HockДата: Среда, 30 Ноября 2011, 21:02:36 | Сообщение # 22
3 уровень
Группа: Проверенные
Сообщений: 57
Награды: 0
Репутация: 14
Блокировки:
К сожалению нет

Добавлено (30 Ноябрь 2011, 21:02:36)
---------------------------------------------
Borodach,
Спс попробую


http://warcraft3ft.info/forum/26-34958-1
 

lawsonДата: Среда, 30 Ноября 2011, 21:05:19 | Сообщение # 23
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
А, я думал тебе вообще надо его раскрыть а не только для этого случая.

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

Ty3uKДата: Среда, 30 Ноября 2011, 21:28:21 | Сообщение # 24
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
bj_MAX_INVENTORY - мы не знаем, сколько максимум предметов в инвентаре может быть? О.о пишите сразу 8, ибо использование бж- лишнее действие для процессора

Добавлено (30 Ноябрь 2011, 21:28:21)
---------------------------------------------
Фу, 6, перепутал


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

FatalBladeДата: Среда, 30 Ноября 2011, 21:57:09 | Сообщение # 25
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
А можно как то попроще раскрыть БЖ - GetItemOfTypeFromUnitBJ ?
Или какая нибудь альтернатива?


 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Утечки
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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