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

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

Закрытая тема
 
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Утечки хендлов...
Собственно прикрепляю карту со всем настроенным для тестов, кто-нибудь может объяснить почему так много хендлов создаётся ?
Я все буржуйские кнокбаки на хайве почти проверил, везде одна и та же фигня... много хендлов остаются в памяти
Может кто-нибудь знает в чём проблема или неужели нельзя толкать юнита без создания кучи утечных хендлов?
Прикрепленные файлы
Тип файла: w3x PsionicBomb.w3x (31.3 Кбайт, 12 просмотров )

Отредактировано Ranger21, 30.04.2009 в 12:45.
Старый 29.04.2009, 22:08
lKS
Grunge face
offline
Опыт: 10,442
Активность:
Ranger21
А можно по-русски объяснить в чем дело?
Старый 29.04.2009, 22:14
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Едем в джасс.
Старый 29.04.2009, 22:21
agentex

offline
Опыт: 34,834
Активность:
Цитата:
неужели нельзя толкать юнита без создания кучи утечных хендлов?

с чего ты взял? просто не юзай кривые поделки со стороны, а пиши сам такие вещи. у меня например это все умещается в 2 функции на полстраницы, а система атача данных на таймеры общая для всей карты.

agentex добавил:
вЖасс там совсем не в тему, спокойно можно обойтись и без него. одни понты
Старый 29.04.2009, 22:24
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
agentex

Спасибо))))

Ещё один повод к изучению джасса

Ей богу, просто если так подумать, то на буржуйских сайтах лишь несколько вещей юзабельны xD

Попробую сам))))


Просто нужны какие-нибудь наставления или подсказки... если не жалко...

В каком плане действовать


Хе... ну мб и понты, я так понимаю ВДжасс там замена кешу
FellGuard

Да, я забыл про джасс категорию

lKS
По-русски: Хочу найти способ написания нормального кнокбак спелла без утечек и без тормозов.


PS: А таймерютилс я сам туда засунул, я в своей карте просто активно использую=)
Старый 29.04.2009, 22:24
agentex

offline
Опыт: 34,834
Активность:
Цитата:
Хе... ну мб и понты, я так понимаю ВДжасс там замена кешу

в том то и дело что не замена, а ненужная фича. поверь это все решается грамотным использованием масивов.
Старый 29.04.2009, 22:30
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
» осторожно КОД!

Код:
globals
string Thunder = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
string FrostWyrm = "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl"
endglobals

constant function DamageConstant takes nothing returns real
return 100.
endfunction

constant function DamageInc takes nothing returns real
return 25.
endfunction

constant function EnumRadius takes nothing returns real
return 400.
endfunction

constant function KillEnum takes nothing returns boolean
return false //If true, it will kill the units that were used.
endfunction

constant function Curve takes nothing returns real
return 3. // Defines the steepness of the arc.
endfunction

constant function MaxDist takes nothing returns real
return 500.
endfunction

function Trig_Psionic_Bomb_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A025' 
endfunction

function MoveUnits takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer count = GetHandleInt(t, "count")
    local real x=GetHandleReal(t,"x")
    local real y=GetHandleReal(t,"y")
    local integer counter = 0
    local real inc = MaxDist()/30
    local unit dummy
    local real x1
    local real y1
    loop
        set counter = counter + 1
        set dummy = GetHandleUnit(t, I2S(counter))
        set x1=GetUnitX(dummy)-x
        set y1=GetUnitY(dummy)-y
        call SetUnitPosition(dummy,(x1+x)+inc*Cos(Atan2(y1,x1)),(y1+y)+inc*Sin(Atan2(y1,x1)))  
        call SetUnitFlyHeight(dummy, RMinBJ(JumpParabola(MaxDist()-SquareRoot(x1*x1+y1*y1),MaxDist(), Curve()), 799),0) 
        exitwhen counter == count
    endloop
    set dummy = null
endfunction

function Trig_Psionic_Bomb_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local unit dummy
local integer level = GetUnitAbilityLevel(u, GetSpellAbilityId())
local integer counter = 0
local integer counter2 = 0
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local group v = CreateGroup()
local group v2 = CreateGroup()
local timer t = CreateTimer()
local effect array s

    call GroupEnumUnitsInRange(v, x, y, EnumRadius(), null)
    call GroupEnumUnitsInRange(v2, x, y, EnumRadius(), null)
    call GroupRemoveUnit(v,u)
    call GroupRemoveUnit(v2,u)
    call SetHandleReal(t, "x", x)
    call SetHandleReal(t, "y", y)
        loop
            set dummy = FirstOfGroup(v)
            exitwhen dummy == null
            if IsUnitEnemy(dummy,GetOwningPlayer(u)) == true and GetUnitState(dummy, UNIT_STATE_LIFE) > 0 and IsUnitType(dummy, UNIT_TYPE_STRUCTURE) != true then
            set counter = counter + 1
            call UnitAddAbility(dummy, 'Amrf')
            call SetUnitPathing(dummy, true)
            call SetHandleHandle(t,I2S(counter), dummy)
            set s[counter] = AddSpecialEffectTarget(FrostWyrm,dummy, "chest")
            call GroupRemoveUnit(v, dummy)
            else 
            call GroupRemoveUnit(v2, dummy)
            call GroupRemoveUnit(v, dummy)
            endif
        endloop
if counter > 0  then
call SetHandleInt(t, "count", counter)
call TimerStart(t, .04, true, function MoveUnits)
call TriggerSleepAction(1.2)
call PauseTimer(t)
call DestroyTimer(t)
    loop
    set dummy = FirstOfGroup(v2)
    exitwhen dummy == null
    set counter2 = counter2 + 1
    set x = GetUnitX(dummy)
    set y = GetUnitY(dummy)
    call GroupRemoveUnit(v2, dummy)
    call DestroyEffect(s[counter2])
    call SetUnitFlyHeight(dummy, 0,0)
    set s[counter2] = null
    call UnitDamageTarget(u,dummy,DamageConstant()+(level *DamageInc()),true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_LIGHTNING, WEAPON_TYPE_WHOKNOWS)
    call DestroyEffect(AddSpecialEffect(Thunder,x,y))
    if KillEnum() then
    call KillUnit(dummy)
    call RemoveUnit(dummy)
    endif
   endloop

endif
call FlushHandleLocals(t)
call DestroyGroup(v)
call DestroyGroup(v2)
set v = null
set v2 = null
set u = null
set dummy = null
set t = null
endfunction

//===========================================================================
function InitTrig_Psionic_Bomb takes nothing returns nothing
    set gg_trg_Psionic_Bomb = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Psionic_Bomb, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Psionic_Bomb, Condition( function Trig_Psionic_Bomb_Conditions ) )
    call TriggerAddAction( gg_trg_Psionic_Bomb, function Trig_Psionic_Bomb_Actions )
endfunction


Можно как-нибудь оптимизировать код? Что-нибудь серьёзное например?

Код использует такие кастом скрипты
» осторожно КОД набмер ту!

Код:
// ===========================
function LocalVars takes nothing returns gamecache
    return InitGameCache("jasslocalvars.w3v")
endfunction
function SetHandleHandle takes handle subject, string name, handle value returns nothing
    if value==null then
        call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
    else
        call StoreInteger(LocalVars(), I2S(H2I(subject)), name, H2I(value))
    endif
endfunction
 
function SetHandleInt takes handle subject, string name, integer value returns nothing
    if value==0 then
        call FlushStoredInteger(LocalVars(),I2S(H2I(subject)),name)
    else
        call StoreInteger(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction
 
function SetHandleReal takes handle subject, string name, real value returns nothing
    if value==0 then
        call FlushStoredReal(LocalVars(), I2S(H2I(subject)), name)
    else
        call StoreReal(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction
 
function SetHandleString takes handle subject, string name, string value returns nothing
    if value==null then
        call FlushStoredString(LocalVars(), I2S(H2I(subject)), name)
    else
        call StoreString(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction
 
function GetHandleHandle takes handle subject, string name returns handle
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleInt takes handle subject, string name returns integer
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleReal takes handle subject, string name returns real
    return GetStoredReal(LocalVars(), I2S(H2I(subject)), name)
endfunction
function GetHandleString takes handle subject, string name returns string
    return GetStoredString(LocalVars(), I2S(H2I(subject)), name)
endfunction
 
function GetHandleUnit takes handle subject, string name returns unit
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleTimer takes handle subject, string name returns timer
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleTrigger takes handle subject, string name returns trigger
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
function GetHandleEffect takes handle subject, string name returns effect
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    return null
endfunction
 
function FlushHandleLocals takes handle subject returns nothing
    call FlushStoredMission(LocalVars(), I2S(H2I(subject)) )
endfunction
//JumpParabola
function JumpParabola takes real dist, real maxdist,real curve returns real
    local real t = (dist*2)/maxdist-1
    return (-t*t+1)*(maxdist/curve)
endfunction



Например полностью избавиться от кэша ? Максимум юнитов доступных для кнокбака пускай будет в районе 20-25

Отредактировано Ranger21, 30.04.2009 в 00:51.
Старый 30.04.2009, 00:44
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
agentex, понты, говоришь? Ага, потом отсутствие понтов и выливается вот в такие куски кода
» code
Код:
constant function DamageConstant takes nothing returns real
return 100.
endfunction

constant function DamageInc takes nothing returns real
return 25.
endfunction

constant function EnumRadius takes nothing returns real
return 400.
endfunction

constant function KillEnum takes nothing returns boolean
return false //If true, it will kill the units that were used.
endfunction

constant function Curve takes nothing returns real
return 3. // Defines the steepness of the arc.
endfunction

constant function MaxDist takes nothing returns real
return 500.
endfunction
когда на вДжасс-е всё свелось бы к
» code
Код:
globals
    constant real DamageConstant=100.
    constant real DamageInc=25.
    constant real EnumRadius=400.
    constant boolean KillEnum=false //If true, it will kill the units that were used.
    constant real Curve=3.  // Defines the steepness of the arc.
    constant real MaxDist=500.
endglobals
думаю несложно судить что и насколько быстрее и лучше

FellGuard добавил:
В том то и дело, что лучше уж пользоваться вДжассом чем городить огород. Это дядькам, которые не первый год табуретки протирают, структуры кажутся ерундой. Кстати, не грех и посмотреть, как структуры интерпретируются в норм Джасс, многому можно научиться.
Старый 30.04.2009, 02:08
ScorpioT1000
Работаем
online
Опыт: отключен
Цитата:
agentex, понты, говоришь? Ага, потом отсутствие понтов и выливается вот в такие куски кода» code

вобще убило. я кстати у кого-то видел уже такое извращенство, мб он тоже с хайва?)
Старый 30.04.2009, 05:02
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Sc Этот спелл тоже с хайва вообще тоXD

FellGuard
Ну да... вызывать функции вместо занесения этих данных в переменные - лишняя причина для тормозов.

А ещё варианты? Можно ли как-то без кэша сделать спелл?

Код
» раскрыть

Код:
scope PsionicBomb

globals
string Thunder = "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl"
string FrostWyrm = "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl"
private constant real DamageConstant=100.
private constant real DamageInc=25.
private constant real EnumRadius=400.
private constant boolean KillEnum=false //If true, it will kill the units that were used.
private constant real Curve=3.  // Defines the steepness of the arc.
private constant real MaxDist=500.
endglobals

function Trig_Psionic_Bomb_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A025' 
endfunction

function MoveUnits takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer count = GetHandleInt(t, "count")
    local real x=GetHandleReal(t,"x")
    local real y=GetHandleReal(t,"y")
    local integer counter = 0
    local real inc = MaxDist/30
    local unit dummy
    local real x1
    local real y1
    loop
        set counter = counter + 1
        set dummy = GetHandleUnit(t, I2S(counter))
        set x1=GetUnitX(dummy)-x
        set y1=GetUnitY(dummy)-y
        call SetUnitPosition(dummy,(x1+x)+inc*Cos(Atan2(y1,x1)),(y1+y)+inc*Sin(Atan2(y1,x1)))  
        call SetUnitFlyHeight(dummy, RMinBJ(JumpParabola(MaxDist-SquareRoot(x1*x1+y1*y1),MaxDist, Curve), 799),0) 
        exitwhen counter == count
    endloop
    set dummy = null
endfunction

function Trig_Psionic_Bomb_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local unit dummy
local integer level = GetUnitAbilityLevel(u, GetSpellAbilityId())
local integer counter = 0
local integer counter2 = 0
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local group v = CreateGroup()
local group v2 = CreateGroup()
local timer t = CreateTimer()
local effect array s

    call GroupEnumUnitsInRange(v, x, y, EnumRadius, null)
    call GroupEnumUnitsInRange(v2, x, y, EnumRadius, null)
    call GroupRemoveUnit(v,u)
    call GroupRemoveUnit(v2,u)
    call SetHandleReal(t, "x", x)
    call SetHandleReal(t, "y", y)
        loop
            set dummy = FirstOfGroup(v)
            exitwhen dummy == null
            if IsUnitEnemy(dummy,GetOwningPlayer(u)) == true and GetUnitState(dummy, UNIT_STATE_LIFE) > 0 and IsUnitType(dummy, UNIT_TYPE_STRUCTURE) != true then
            set counter = counter + 1
            call UnitAddAbility(dummy, 'Amrf')
            call SetUnitPathing(dummy, true)
            call SetHandleHandle(t,I2S(counter), dummy)
            set s[counter] = AddSpecialEffectTarget(FrostWyrm,dummy, "chest")
            call GroupRemoveUnit(v, dummy)
            else 
            call GroupRemoveUnit(v2, dummy)
            call GroupRemoveUnit(v, dummy)
            endif
        endloop
if counter > 0  then
call SetHandleInt(t, "count", counter)
call TimerStart(t, .04, true, function MoveUnits)
call TriggerSleepAction(1.2)
call PauseTimer(t)
call DestroyTimer(t)
    loop
    set dummy = FirstOfGroup(v2)
    exitwhen dummy == null
    set counter2 = counter2 + 1
    set x = GetUnitX(dummy)
    set y = GetUnitY(dummy)
    call GroupRemoveUnit(v2, dummy)
    call DestroyEffect(s[counter2])
    call SetUnitFlyHeight(dummy, 0,0)
    set s[counter2] = null
    call UnitDamageTarget(u,dummy,DamageConstant+(level *DamageInc),true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_LIGHTNING, WEAPON_TYPE_WHOKNOWS)
    call DestroyEffect(AddSpecialEffect(Thunder,x,y))
    if KillEnum == true then
    call KillUnit(dummy)
    call RemoveUnit(dummy)
    endif
   endloop

endif
call FlushHandleLocals(t)
call DestroyGroup(v)
call DestroyGroup(v2)
set v = null
set v2 = null
set u = null
set dummy = null
set t = null
endfunction

//===========================================================================
function InitTrig_Psionic_Bomb takes nothing returns nothing
    set gg_trg_Psionic_Bomb = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Psionic_Bomb, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Psionic_Bomb, Condition( function Trig_Psionic_Bomb_Conditions ) )
    call TriggerAddAction( gg_trg_Psionic_Bomb, function Trig_Psionic_Bomb_Actions )
endfunction

endscope

Отредактировано Ranger21, 30.04.2009 в 08:15.
Старый 30.04.2009, 08:04
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Ranger21
На самом деле вджасс заинлайнит все эти функции
Лично я использую параллельные массивы
Старый 30.04.2009, 09:14
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Garret Да просто все кнокбаки почему-то создают кучу не удаляемых хендлов

Только один кнокбак нашёл без такой проблемы - сделан нашим Manhant'oм)))


А мне нужно именно этот спелл оптимизировать
Старый 30.04.2009, 09:42
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Максимум юнитов доступных для кнокбака пускай будет в районе 20-25

чем вас собсвенно смущают массивы тебе надо-то пару функций, ща посмотрю что у тебя там и сделаю пример

ELDAR добавил:
Цитата:
Лично я использую параллельные массивы

не стоит при столь малом числе юнитов
Старый 30.04.2009, 11:10
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Пример нужен, я правда нашёл другой тип кнокбака и сделал функцию запускающую систему для каждого юнита в определённом range

Вышел MUI без утечек

Правда выглядит может не так эффектно, но это не шибко важно.

Если не выйдет оптимизировать псионик бомб, то придётся использовать эту системку)))

Если бы внедрить в неё ParabolaZ кнокбак... было бы круто


ELDAR

Не смотри карту прикреплённую ВВЕРХУ!

ТАм бред!

Вообщем можно не напрягаться, я уже настроил сделанный под себя пример)))

Но мне для дальнейшего обучения интересно всё таки... как работать с этими массивами

Ranger21 добавил:
Всё... теперь отлично работает и юниты не улетают в недоступные места)

Настроил всё под себя

Ranger21 добавил:
Топик можно закрыть, если никто всё таки не решится оптимизировать код выложенный выше. (не использовать кэш)

Ибо я нашёл более классный способ))))))

Отредактировано Ranger21, 30.04.2009 в 12:24.
Старый 30.04.2009, 12:25
Закрытая тема

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

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

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

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



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