From bc8ff11f3fd196a0da3985eb229ba31c2b07c5b0 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Mon, 14 Mar 2016 21:35:11 -0700 Subject: [PATCH] Lag check on initialization (and on a missed del-all proc) --- code/controllers/master.dm | 16 ++-- code/controllers/subsystem/air.dm | 5 ++ code/controllers/subsystem/lighting.dm | 4 + code/controllers/subsystem/minimap.dm | 102 +++++++++++++------------ code/controllers/subsystem/objects.dm | 1 + code/controllers/subsystem/shuttles.dm | 1 + code/datums/datumvars.dm | 2 + 7 files changed, 76 insertions(+), 55 deletions(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 1a4d6551667..ae9b0a8e8e0 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -70,7 +70,7 @@ var/global/datum/controller/master/Master = new() if(zlevel && zlevel > 0 && zlevel <= world.maxz) for(var/datum/subsystem/SS in subsystems) SS.Initialize(world.timeofday, zlevel) - sleep(-1) + CHECK_TICK return world << "Initializing subsystems..." @@ -95,7 +95,7 @@ var/global/datum/controller/master/Master = new() // Initialize subsystems. for(var/datum/subsystem/SS in subsystems) SS.Initialize(world.timeofday, zlevel) - sleep(-1) + CHECK_TICK world << "Initializations complete!" @@ -106,16 +106,18 @@ var/global/datum/controller/master/Master = new() world.sleep_offline = 1 world.fps = config.fps - sleep(-1) + sleep(1) // Loop. Master.process() // Notify the MC that the round has started. /datum/controller/master/proc/RoundStart() + var/timer = world.time for(var/datum/subsystem/SS in subsystems) + timer += world.tick_lag SS.can_fire = 1 - SS.next_fire = world.time + rand(0, SS.wait) // Stagger subsystems. + SS.next_fire = timer + rand(0, SS.wait) // Stagger subsystems. // Used to smooth out costs to try and avoid oscillation. #define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) @@ -129,8 +131,10 @@ var/global/datum/controller/master/Master = new() // Schedule the first run of the Subsystems. var/timer = world.time for(var/datum/subsystem/SS in subsystems) - timer += world.tick_lag - SS.next_fire = timer + if (SS.can_fire) + timer += world.tick_lag + SS.next_fire = timer + var/list/subsystemstorun = subsystems.Copy() var/start_time while(1) // More efficient than recursion. diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 21639ce6bc1..c1fea7ee944 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -203,6 +203,7 @@ var/datum/subsystem/air/SSair T.excited = 1 active_turfs |= T break + CHECK_TICK if(active_turfs.len) warning("There are [active_turfs.len] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required)") @@ -214,6 +215,7 @@ var/datum/subsystem/air/SSair if (z_level && AM.z != z_level) continue AM.atmosinit() + CHECK_TICK //this can't be done with setup_atmos_machinery() because // all atmos machinery has to initalize before the first @@ -223,12 +225,15 @@ var/datum/subsystem/air/SSair if (z_level && AM.z != z_level) continue AM.build_network() + CHECK_TICK /datum/subsystem/air/proc/setup_template_machinery(list/atmos_machines) for(var/A in atmos_machines) var/obj/machinery/atmospherics/AM = A AM.atmosinit() + CHECK_TICK for(var/A in atmos_machines) var/obj/machinery/atmospherics/AM = A AM.build_network() + CHECK_TICK diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index a293bc3c954..a71e3330cb8 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -61,11 +61,13 @@ var/datum/subsystem/lighting/SSlighting if (A.lighting_use_dynamic == DYNAMIC_LIGHTING_IFSTARLIGHT) if (config.starlight) A.SetDynamicLighting() + CHECK_TICK for(var/thing in changed_lights) var/datum/light_source/LS = thing LS.check() + CHECK_TICK changed_lights.Cut() var/z_start = 1 @@ -80,6 +82,7 @@ var/datum/subsystem/lighting/SSlighting for(var/thing in turfs_to_init) var/turf/T = thing T.init_lighting() + CHECK_TICK if(z_level) //we need to loop through to clear only shifted turfs from the list. or we will cause errors @@ -88,6 +91,7 @@ var/datum/subsystem/lighting/SSlighting if(T.z in z_start to z_finish) continue changed_turfs.Remove(thing) + CHECK_TICK else changed_turfs.Cut() diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 5e5b0133739..3ad75437a76 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -42,65 +42,69 @@ var/datum/subsystem/minimap/SSminimap var/icon/minimap = new /icon('icons/minimap.dmi') // Scale it up to our target size. minimap.Scale(MINIMAP_SIZE, MINIMAP_SIZE) - var/list/obj_icons = list() - var/counter = 128 + + var/counter = 64 // Loop over turfs and generate icons. for(var/T in block(locate(x1, y1, z), locate(x2, y2, z))) - - var/turf/tile = T - var/icon/tile_icon - var/obj/obj + generate_tile(T, minimap) - // Don't use icons for space, just add objects in space if they exist. - if(istype(tile, /turf/space)) - obj = locate(/obj/structure/lattice/catwalk) in tile - if(obj) - tile_icon = new /icon('icons/obj/smooth_structures/catwalk.dmi', "catwalk", SOUTH) - obj = locate(/obj/structure/lattice) in tile - if(obj) - tile_icon = new /icon('icons/obj/smooth_structures/lattice.dmi', "lattice", SOUTH) - obj = locate(/obj/structure/grille) in tile - if(obj) - tile_icon = new /icon('icons/obj/structures.dmi', "grille", SOUTH) - obj = locate(/obj/structure/transit_tube) in tile - if(obj) - tile_icon = new /icon('icons/obj/atmospherics/pipes/transit_tube.dmi', obj.icon_state, obj.dir) - else - tile_icon = new /icon(tile.icon, tile.icon_state, tile.dir) - obj_icons.Cut() - - obj = locate(/obj/structure) in tile - if(obj) - obj_icons += getFlatIcon(obj) - obj = locate(/obj/machinery) in tile - if(obj) - obj_icons += new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0) - obj = locate(/obj/structure/window) in tile - if(obj) - obj_icons += new /icon('icons/obj/smooth_structures/window.dmi', "window", SOUTH) - - for(var/I in obj_icons) - var/icon/obj_icon = I - tile_icon.Blend(obj_icon, ICON_OVERLAY) - - if(tile_icon) - // Scale the icon. - tile_icon.Scale(TILE_SIZE, TILE_SIZE) - // Add the tile to the minimap. - minimap.Blend(tile_icon, ICON_OVERLAY, ((tile.x - 1) * TILE_SIZE), ((tile.y - 1) * TILE_SIZE)) - del(tile_icon) - - //byond bug, this fixes OOM crashes by flattening and reseting the minimap icon holder every 255 tiles + //byond bug, this fixes OOM crashes by flattening and reseting the minimap icon holder every 64 tiles counter-- - if (counter <= 0) - counter = 128 + if(counter <= 0) + counter = 64 var/icon/flatten = new /icon() flatten.Insert(minimap, "", SOUTH, 1, 0) del(minimap) minimap = flatten - sleep(-1) + sleep(world.tick_lag) //we have to sleep in order to get byond to clear out the proc's garbage bin + + CHECK_TICK + // Create a new icon and insert the generated minimap, so that BYOND doesn't generate different directions. var/icon/final = new /icon() final.Insert(minimap, "", SOUTH, 1, 0) fcopy(final, map_path(z)) + +/datum/subsystem/minimap/proc/generate_tile(turf/tile, icon/minimap) + var/icon/tile_icon + var/obj/obj + var/list/obj_icons = list() + // Don't use icons for space, just add objects in space if they exist. + if(istype(tile, /turf/space)) + obj = locate(/obj/structure/lattice/catwalk) in tile + if(obj) + tile_icon = new /icon('icons/obj/smooth_structures/catwalk.dmi', "catwalk", SOUTH) + obj = locate(/obj/structure/lattice) in tile + if(obj) + tile_icon = new /icon('icons/obj/smooth_structures/lattice.dmi', "lattice", SOUTH) + obj = locate(/obj/structure/grille) in tile + if(obj) + tile_icon = new /icon('icons/obj/structures.dmi', "grille", SOUTH) + obj = locate(/obj/structure/transit_tube) in tile + if(obj) + tile_icon = new /icon('icons/obj/atmospherics/pipes/transit_tube.dmi', obj.icon_state, obj.dir) + else + tile_icon = new /icon(tile.icon, tile.icon_state, tile.dir) + obj_icons.Cut() + + obj = locate(/obj/structure) in tile + if(obj) + obj_icons += getFlatIcon(obj) + obj = locate(/obj/machinery) in tile + if(obj) + obj_icons += new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0) + obj = locate(/obj/structure/window) in tile + if(obj) + obj_icons += new /icon('icons/obj/smooth_structures/window.dmi', "window", SOUTH) + + for(var/I in obj_icons) + var/icon/obj_icon = I + tile_icon.Blend(obj_icon, ICON_OVERLAY) + + if(tile_icon) + // Scale the icon. + tile_icon.Scale(TILE_SIZE, TILE_SIZE) + // Add the tile to the minimap. + minimap.Blend(tile_icon, ICON_OVERLAY, ((tile.x - 1) * TILE_SIZE), ((tile.y - 1) * TILE_SIZE)) + del(tile_icon) \ No newline at end of file diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm index cb50e86e8a0..c902e69aa6f 100644 --- a/code/controllers/subsystem/objects.dm +++ b/code/controllers/subsystem/objects.dm @@ -23,6 +23,7 @@ var/datum/subsystem/objects/SSobj if (zlevel && A.z != zlevel) continue A.initialize() + CHECK_TICK . = ..() diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 57e603487fb..1a1d5a2f0bd 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -212,3 +212,4 @@ var/datum/subsystem/shuttle/SSshuttle S.dwidth = M.dwidth S.dheight = M.dheight moveShuttle(M.id, "[M.roundstart_move]", 0) + CHECK_TICK diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 418b16174b9..a436272faae 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -676,6 +676,7 @@ body if(Obj.type == O_type) i++ qdel(Obj) + CHECK_TICK if(!i) usr << "No objects of this type exist" return @@ -687,6 +688,7 @@ body if(istype(Obj,O_type)) i++ qdel(Obj) + CHECK_TICK if(!i) usr << "No objects of this type exist" return