A Leak Lurks Inside

Ghan

Administrator - Servers are fun
Staff member
Reaction score
888
So I have some code here:

JASS:
scope Abilities initializer StartAbilities

    private function AbilitiesActions takes nothing returns nothing
        local unit tower = GetEventDamageSource()
        local unit target = GetTriggerUnit()
        local real towerX = GetUnitX(tower)
        local real towerY = GetUnitY(tower)
        local unit dummy = CreateUnit(GetOwningPlayer(tower), dummyID, towerX, towerY, 0.0)
        
        if(GetUnitTypeId(GetEventDamageSource()) == 'o00N' and GetRandomInt(1, 10) < 4) then
            call UnitApplyTimedLife(dummy, 'BTLF', 1.0)
            call UnitAddAbility(dummy, 'A02C')
            call IssueTargetOrder(dummy, "chainlightning", target)
        endif
        
        set tower = null
        set target = null
        set dummy = null
    endfunction
    
    private function CheckUnitType takes nothing returns boolean
        return GetUnitPointValue(GetEventDamageSource()) == 10
    endfunction
        
    private function StartAbilities takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerAddAction(t, function AbilitiesActions)
        call TriggerAddCondition(t, Condition(function CheckUnitType))
        call Damage_RegisterEvent(t)
    endfunction
endscope


Unfortunately for me, as I watch my test map progress with this trigger, it gets laggier and laggier. Not so when I disable this trigger. So I naturally think there must a leak somewhere. Can anybody find one?

Update: Well, well. Curiouser and curiouser. When I comment the random integer part, it does not lag. So it seems I need to find a way to prevent random integers from leaking? But I thought integers didn't leak. :(

Update 2: So now I have this code:

JASS:
scope Abilities initializer StartAbilities

    private function AbilitiesActions takes nothing returns nothing
        local unit tower = GetEventDamageSource()
        local unit target = GetTriggerUnit()
        local real towerX = GetUnitX(tower)
        local real towerY = GetUnitY(tower)
        local unit dummy = CreateUnit(GetOwningPlayer(tower), dummyID, towerX, towerY, 0.0)
        local integer temp
        
        if(GetUnitTypeId(GetEventDamageSource()) == 'o00N') then//and GetRandomInt(1, 10) < 4) then
            set temp = GetRandomInt(1, 10)
            if(temp < 4) then
                call UnitApplyTimedLife(dummy, 'BTLF', 1.0)
                call UnitAddAbility(dummy, 'A02C')
                call IssueTargetOrder(dummy, "chainlightning", target)
            endif
        endif
        
        set tower = null
        set target = null
        set dummy = null
        set temp = 0
    endfunction
    
    private function CheckUnitType takes nothing returns boolean
        return GetUnitPointValue(GetEventDamageSource()) == 10
    endfunction
        
    private function StartAbilities takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerAddAction(t, function AbilitiesActions)
        call TriggerAddCondition(t, Condition(function CheckUnitType))
        call Damage_RegisterEvent(t)
    endfunction
endscope


The lagging proceeds as normal. How odd.


Update 3: Using a recycled global for the integer makes no difference. Also, if it helps, I'm using Jesus4Lyf's Damage system.
 

Tom_Kazansky

--- wraith it ! ---
Reaction score
157
so errm... the dummy is created and if the chance isn't right ( GetRandomInt(1, 10) >= 4) => the dummy doesn't get time life applied and will not die? => leak?

try:
JASS:
scope Abilities initializer StartAbilities

    private function AbilitiesActions takes nothing returns nothing
        local unit tower = GetEventDamageSource()
        local unit target = GetTriggerUnit()
        local real towerX = GetUnitX(tower)
        local real towerY = GetUnitY(tower)
        local unit dummy
        
        if(GetUnitTypeId(GetEventDamageSource()) == 'o00N' and GetRandomInt(1, 10) < 4) then
            set dummy = CreateUnit(GetOwningPlayer(tower), dummyID, towerX, towerY, 0.0)
            call UnitApplyTimedLife(dummy, 'BTLF', 1.0)
            call UnitAddAbility(dummy, 'A02C')
            call IssueTargetOrder(dummy, "chainlightning", target)
            set dummy = null
        endif
        
        set tower = null
        set target = null
    endfunction
    
    private function CheckUnitType takes nothing returns boolean
        return GetUnitPointValue(GetEventDamageSource()) == 10
    endfunction
        
    private function StartAbilities takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerAddAction(t, function AbilitiesActions)
        call TriggerAddCondition(t, Condition(function CheckUnitType))
        call Damage_RegisterEvent(t)
    endfunction
endscope
 

Ghan

Administrator - Servers are fun
Staff member
Reaction score
888
Bwahaha. Logic fail. Thank you. Sometimes it just takes a second pair of eyes. :)
 

Azlier

Old World Ghost
Reaction score
461
Also it should be noted that unit creation leaks. A lot. Nothing can be done besides not creating the unit in the first place. Recycling dummies helps, but with an odd spell like chain lightning things get complicated...
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
but with an odd spell like chain lightning things get complicated...
Code the chain lightning. :)
 

Ghan

Administrator - Servers are fun
Staff member
Reaction score
888
:D

Unfortunately, I will need to be doing lots of dummy spells here besides Chain Lightning. But that sounds like a cool system.
 

Troll-Brain

You can change this now in User CP.
Reaction score
85
Also it should be noted that unit creation leaks. A lot. Nothing can be done besides not creating the unit in the first place. Recycling dummies helps, but with an odd spell like chain lightning things get complicated...

I could be wrong, but last time i checked, you really have to create many units in a very short time to have this kind of leak.
Something like creating/removing an unit every 0.01 s during 10 s didn't cause any leak, where creating 1000 units in less than 1 s did some.
(Yes i've waited for the stability of the memory used by the process wc3).
Should be confirmed though, i can't (don't want) test it again.

So if i'm true, it's something odd where the wc3 process is to much busy and "forgot" to clean totally what he has to do (sorry, i don't have better words to say it).
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top