Make some ZAS lists lazy (#2339)

This PR converts some lists in ZAS to be only created when needed instead of always existing and pointlessly using memory. Might lead to reduced server memory usage.
This commit is contained in:
Lohikar
2017-05-24 02:51:49 +03:00
committed by skull132
parent 98eb6f95c5
commit ba59ef32b9
4 changed files with 58 additions and 38 deletions
+8 -8
View File
@@ -127,26 +127,26 @@ Class Procs:
src.A = A
src.B = B
A.edges.Add(src)
B.edges.Add(src)
LAZYADD(A.edges, src)
LAZYADD(B.edges, src)
//id = edge_id(A,B)
// log_debug("New edge between [A] and [B]")
/connection_edge/zone/add_connection(connection/c)
. = ..()
connecting_turfs.Add(c.A)
connecting_turfs += c.A
/connection_edge/zone/remove_connection(connection/c)
connecting_turfs.Remove(c.A)
connecting_turfs -= c.A
. = ..()
/connection_edge/zone/contains_zone(zone/Z)
return A == Z || B == Z
/connection_edge/zone/erase()
A.edges.Remove(src)
B.edges.Remove(src)
LAZYREMOVE(A.edges, src)
LAZYREMOVE(B.edges, src)
. = ..()
/connection_edge/zone/tick()
@@ -198,7 +198,7 @@ Class Procs:
/connection_edge/unsimulated/New(zone/A, turf/B)
src.A = A
src.B = B
A.edges.Add(src)
LAZYADD(A.edges, src)
air = B.return_air()
//id = 52*A.id
// log_debug("New edge from [A] to [B].")
@@ -215,7 +215,7 @@ Class Procs:
. = ..()
/connection_edge/unsimulated/erase()
A.edges.Remove(src)
LAZYREMOVE(A.edges, src)
. = ..()
/connection_edge/unsimulated/contains_zone(zone/Z)
+27 -16
View File
@@ -11,7 +11,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
#define FIRE_LIGHT_2 3
#define FIRE_LIGHT_3 4
/turf/var/obj/fire/fire = null
/turf
var/tmp/obj/fire/fire = null
//Some legacy definitions so fires can be started.
atom/proc/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
@@ -40,7 +41,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
return igniting
/zone/proc/process_fire()
var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len)
var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, LAZYLEN(fire_tiles))
var/firelevel = burn_gas.zburn(src, fire_tiles, force_burn = 1, no_check = 1)
@@ -52,21 +53,23 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
T.fire.firelevel = firelevel
else
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fire_tiles -= T
fuel_objs -= fuel
LAZYREMOVE(fire_tiles, T)
LAZYREMOVE(fuel_objs, fuel)
else
for(var/turf/simulated/T in fire_tiles)
if(istype(T.fire))
T.fire.RemoveFire()
T.fire = null
fire_tiles.Cut()
fuel_objs.Cut()
LAZYCLEARLIST(fire_tiles)
LAZYCLEARLIST(fuel_objs)
UNSETEMPTY(fire_tiles)
UNSETEMPTY(fuel_objs)
if(!fire_tiles.len)
SSair.active_fire_zones.Remove(src)
if(!LAZYLEN(fire_tiles))
SSair.active_fire_zones -= src
/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0)
if(!fuel_objs.len)
if(!LAZYLEN(fuel_objs))
return
//As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel,
@@ -77,12 +80,12 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
for(var/O in fuel_objs)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = O
if(!istype(fuel))
fuel_objs -= fuel
LAZYREMOVE(fuel_objs, fuel)
continue
fuel.amount -= fuel_to_remove
if(fuel.amount <= 0)
fuel_objs -= fuel
LAZYREMOVE(fuel_objs, fuel)
if(remove_fire)
var/turf/T = fuel.loc
if(istype(T) && T.fire) qdel(T.fire)
@@ -103,8 +106,10 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
SSair.active_fire_zones |= zone
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in src
LAZYINITLIST(zone.fire_tiles)
zone.fire_tiles |= src
if(fuel) zone.fuel_objs += fuel
if(fuel)
LAZYADD(zone.fuel_objs, fuel)
return 0
@@ -180,8 +185,11 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
else
enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume)
animate(src, color = fire_color(air_contents.temperature), 5)
set_light(l_color = color)
var/list/animate_targets = get_above_oo() + src
for (var/thing in animate_targets)
var/atom/movable/AM = thing
animate(AM, color = fire_color(air_contents.temperature), 5)
/obj/fire/New(newLoc,fl)
..()
@@ -197,7 +205,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
set_light(3, 1, color)
firelevel = fl
SSair.active_hotspots.Add(src)
SSair.active_hotspots += src
/obj/fire/proc/fire_color(var/env_temperature)
var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature)
@@ -215,11 +223,14 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
T.fire = null
loc = null
SSair.active_hotspots.Remove(src)
SSair.active_hotspots -= src
/turf/simulated
var/tmp/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
/turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again.
/turf/proc/apply_fire_protection()
return
/turf/simulated/apply_fire_protection()
fire_protection = world.time
+18 -12
View File
@@ -44,17 +44,17 @@ Class Procs:
var/name
var/invalid = 0
var/list/contents = list()
var/list/fire_tiles = list()
var/list/fuel_objs = list()
var/list/fire_tiles
var/list/fuel_objs
var/needs_update = 0
var/list/edges = list()
var/list/edges
var/datum/gas_mixture/air = new
var/list/graphic_add = list()
var/list/graphic_remove = list()
var/list/graphic_add
var/list/graphic_remove
/zone/New()
SSair.add_zone(src)
@@ -74,9 +74,10 @@ Class Procs:
contents += T
if(T.fire)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fire_tiles.Add(T)
LAZYADD(fire_tiles, T)
SSair.active_fire_zones |= src
if(fuel) fuel_objs += fuel
if (fuel)
LAZYADD(fuel_objs, fuel)
T.update_graphic(air.graphic)
/zone/proc/remove(turf/simulated/T)
@@ -87,10 +88,10 @@ Class Procs:
soft_assert(T in contents, "Lists are weird broseph")
#endif
contents -= T
fire_tiles -= T
LAZYREMOVE(fire_tiles, T)
if(T.fire)
var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T
fuel_objs -= fuel
LAZYREMOVE(fuel_objs, fuel)
T.zone = null
T.update_graphic(graphic_remove = air.graphic)
if(contents.len)
@@ -154,11 +155,16 @@ Class Procs:
if(istype(T))
T.create_fire(vsc.fire_firelevel_multiplier)
LAZYINITLIST(graphic_add)
LAZYINITLIST(graphic_remove)
if(air.check_tile_graphic(graphic_add, graphic_remove))
for(var/turf/simulated/T in contents)
T.update_graphic(graphic_add, graphic_remove)
graphic_add.len = 0
graphic_remove.len = 0
LAZYCLEARLIST(graphic_add)
LAZYCLEARLIST(graphic_remove)
UNSETEMPTY(graphic_add)
UNSETEMPTY(graphic_remove)
for(var/connection_edge/E in edges)
if(E.sleeping)
@@ -172,7 +178,7 @@ Class Procs:
M << "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]"
M << "Simulated: [contents.len] ([air.group_multiplier])"
//M << "Unsimulated: [unsimulated_contents.len]"
//M << "Edges: [edges.len]"
//M << "Edges: [LAZYLEN(edges)]"
if(invalid) M << "Invalid!"
var/zone_edges = 0
var/space_edges = 0