First Jass script laggy.

Chewbalka

New Member
Reaction score
14
This is my first JASS Script, also it is a JASS version of a GUI system i created, Cone Vision.

Firstly i used "Convert to Custom Text" as a starting point so i didint have to actuall re-write everything. I then reduced it from about 50 functions to 3 and I put all loops into local variables. other then that its almost exactly the same as after conversion.

The problem with this code is that it has more lag then the GUI version. Meaning I can run less units (in the unit group) before lag starts appearing. In the original (GUI) I had 24 units before lag starts with this one I have 18 and its already slightly noticeable.

What can be changed to reduce the lag/performance?

If your to test this script you will need to create the same varaibles as the GUI version needs, these variables are not local.

  • VISCount int
  • VISGroup UnitGroup
  • VISLocation Point
  • VISTest Visibility Modifier (Array)


JASS:
function Trig_Vision_pathing takes nothing returns boolean
    if ( IsTerrainPathableBJ(udg_VISLocation, PATHING_TYPE_WALKABILITY) == true ) then
    	if ( IsTerrainPathableBJ(udg_VISLocation, PATHING_TYPE_FLOATABILITY) == true ) then
        	return true
    	endif
    endif
    return false
endfunction

function Trig_Vision_main takes nothing returns nothing
    local integer forLoopAIndex = 0
    local integer forLoopAIndexEnd = 0
    if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then
        return
    else
    endif
    set udg_VISCount = ( udg_VISCount + 1 )
    // 1
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 50.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 150.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    set forLoopAIndex = 50
    set forLoopAIndexEnd = 100
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 2
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 100.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 225.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    set forLoopAIndex = 100
    set forLoopAIndexEnd = 200
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 3
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 200.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 300.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    set forLoopAIndex = 200
    set forLoopAIndexEnd = 310
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 4
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 310.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 400.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    call RemoveLocation (udg_VISLocation)
    set forLoopAIndex = 310
    set forLoopAIndexEnd = 475
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
            if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 5
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 475.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 400.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    call RemoveLocation (udg_VISLocation)
    set forLoopAIndex = 475
    set forLoopAIndexEnd = 600
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
            if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 6
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 600.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 480.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
    call RemoveLocation (udg_VISLocation)
    set forLoopAIndex = 600
    set forLoopAIndexEnd = 850
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
  	 if ( Trig_Vision_pathing () ) then
            set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), I2R(forLoopAIndex), GetUnitFacing(GetEnumUnit()))
        	call RemoveLocation (udg_VISLocation)
            if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
            else
                return
            endif
        else
        endif
        set forLoopAIndex = forLoopAIndex + 2
    endloop
    // 7
    call RemoveLocation (udg_VISLocation)
    set udg_VISLocation = PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 750.00, GetUnitFacing(GetEnumUnit()))
   if ( Trig_Vision_pathing () ) then
        	if ( ( GetTerrainCliffLevelBJ(udg_VISLocation) <= GetTerrainCliffLevelBJ(GetUnitLoc(GetEnumUnit())) ) )then
        else
            return
        endif
    else
        call CreateFogModifierRadiusLocBJ( true, GetOwningPlayer(GetEnumUnit()), FOG_OF_WAR_VISIBLE, udg_VISLocation, 550.00 )
        set udg_VISTest[udg_VISCount] = GetLastCreatedFogModifier()
        set udg_VISCount = ( udg_VISCount + 1 )
    endif
endfunction

function Trig_ConeVision_Actions takes nothing returns nothing
    local integer forLoopAIndex = 0
    local integer forLoopAIndexEnd = 0
    set forLoopAIndex = 1
    set forLoopAIndexEnd = ( CountUnitsInGroup(GetUnitsOfPlayerAll(Player(0))) * 7 )
    loop
        exitwhen forLoopAIndex > forLoopAIndexEnd
        call FogModifierStop( udg_VISTest[forLoopAIndex] )
        call DestroyFogModifier( udg_VISTest[forLoopAIndex] )
        set forLoopAIndex = forLoopAIndex + 1
    endloop
    call RemoveLocation (udg_VISLocation)
    call DestroyGroup (udg_VISGroup)
    set udg_VISGroup = GetUnitsOfPlayerAll(Player(0))
    call ForGroupBJ( udg_VISGroup, function Trig_Vision_main )
    set udg_VISCount = 1
endfunction

//===========================================================================
function InitTrig_ConeVision takes nothing returns nothing
    set gg_trg_ConeVision = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ConeVision, 0.50 )
    call TriggerAddAction( gg_trg_ConeVision, function Trig_ConeVision_Actions )
endfunction
 

tommerbob

Minecraft. :D
Reaction score
110
I recommend reading up on how to use vJass and structs and such. It is a longer fix to your problem than maybe you want, but once you start using vJass, your scripting life will dramatically improve. This is coming from someone who was a staunch GUI user, and now I am a happy vJass user. Just my two cents. :)
 

Dirac

22710180
Reaction score
147
I used to be a very unhappy GUI user who couldn't move up to JASS becuase I had a Mac (newgen only runs on windows), but now i'm god.
 
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