Tom_Kazansky
--- wraith it ! ---
- Reaction score
- 157
My map is having some fps drops, well actually, it's not "smooth" so I think this has something to do with periodic trigger and I suspect the unit regeneration trigger.
Here is my code:
note on members:
the size of this linked list is about 60 at map start and later 100 (and it increases as the number of creeps increases)
when a unit dies, it will be removed from this list immediately.
so erm... is this efficient enough? is there anyways to improve this?
---
I also have other period trigger to check unit buffs which run every 0.05s but when there is no buffs, I doubt it would affect anything.
Here is my code:
JASS:
globals
constant real tj_REGENERATION_FRAMES = 10.
constant integer tj_InCombatTime = 30 //3 seconds
endglobals
struct myUnit
static trigger Trig
implement LinkedList // Kenny's
static method UnitRegeneration takes nothing returns boolean
local thistype this = UnitDataList.head
local real st
local real stm
loop
exitwhen 0==this
if this.inCombat > 0 then
set this.inCombat = this.inCombat-1
endif
if this.lifeRegenTick>0. then
if this.lifeReserved>0. then
set st = GetUnitState(this.SELF,UNIT_STATE_LIFE) + this.lifeRegenTick
if st>this.lifeCurReserved then
set st=this.lifeCurReserved
endif
call SetUnitState(this.SELF, UNIT_STATE_LIFE, st)
else
call SetUnitState(this.SELF, UNIT_STATE_LIFE, GetUnitState(this.SELF,UNIT_STATE_LIFE) + this.lifeRegenTick)
endif
endif
if this.manaRegenTick>0. then
if this.manaReserved>0. then
set st = GetUnitState(this.SELF,UNIT_STATE_MANA) + this.manaRegenTick
if st>this.manaCurReserved then
set st=this.manaCurReserved
endif
call SetUnitState(this.SELF, UNIT_STATE_MANA, st)
else
call SetUnitState(this.SELF, UNIT_STATE_MANA, GetUnitState(this.SELF,UNIT_STATE_MANA) + this.manaRegenTick)
endif
endif
set this = this.next
endloop
return false
endmethod
static method TimerEx takes nothing returns nothing
call TriggerEvaluate( thistype.Trig )
endmethod
//... other members
endstruct
function MapInit takes nothing returns nothing
set tjunit.Trig = CreateTrigger()
call TriggerAddCondition( tjunit.Trig, Condition( function myUnit.UnitRegeneration ))
call TimerStart( CreateTimer(), 1 / tj_REGENERATION_FRAMES , true, function myUnit.TimerEx )
//...
endfunction
note on members:
- lifeRegenTick/manaRegenTick: life/mana regenerated every interval (currently: 0.1)
- lifeReserved/manaReserved: as the name implied, this will reserve life/mana.
e.g: you have 500 max life and 100 reserved life, normally you can have 500/500 life but now you can only have 400/500 life - lifeCurReserved/manaCurReserved: this is the max life/mana that have subtracted the reserved amount (lifeReserved/manaReserved)
- inCombat: determine whether or not a unit is in-combat
- SELF: the unit that this struct is attached to
the size of this linked list is about 60 at map start and later 100 (and it increases as the number of creeps increases)
when a unit dies, it will be removed from this list immediately.
so erm... is this efficient enough? is there anyways to improve this?
---
I also have other period trigger to check unit buffs which run every 0.05s but when there is no buffs, I doubt it would affect anything.