From ee8df80c808abe16593e9618a2de6cb77e030ba2 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Tue, 2 Apr 2019 03:07:13 -0400 Subject: [PATCH] Ports tgstation/tgstation#40577 - Makes /datum/gas_mixture/share() roughly 5% faster by removing fairly useless abstraction, also contains a small boost to pipelines --- .../atmospherics/gasmixtures/gas_mixture.dm | 10 +- .../gasmixtures/immutable_mixtures.dm | 144 +++++++++--------- .../atmospherics/machinery/datum_pipeline.dm | 17 ++- 3 files changed, 84 insertions(+), 87 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index d07164ccd6..0304946111 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -29,6 +29,7 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) var/last_share = 0 var/list/reaction_results var/list/analyzer_results //used for analyzer feedback - not initialized until its used + var/gc_share = FALSE // Whether to call garbage_collect() on the sharer during shares, used for immutable mixtures /datum/gas_mixture/New(volume) gases = new @@ -143,9 +144,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length //Returns: amount of gas exchanged (+ if sharer received) -/datum/gas_mixture/proc/after_share(datum/gas_mixture/sharer) - //called on share's sharer to let it know it just got some gases - /datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length //Returns: new temperature of the sharer @@ -343,7 +341,8 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) if(length(cached_gases ^ sharer_gases)) //if all gases were present in both mixtures, we know that no gases are 0 garbage_collect(cached_gases - sharer_gases) //any gases the sharer had, we are guaranteed to have. gases that it didn't have we are not. sharer.garbage_collect(sharer_gases - cached_gases) //the reverse is equally true - sharer.after_share(src, atmos_adjacent_turfs) + if (initial(sharer.gc_share)) + sharer.garbage_collect() if(temperature_delta > MINIMUM_TEMPERATURE_TO_MOVE || abs(moved_moles) > MINIMUM_MOLES_DELTA_TO_MOVE) var/our_moles TOTAL_MOLES(cached_gases,our_moles) @@ -351,9 +350,6 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) TOTAL_MOLES(sharer_gases,their_moles) return (temperature_archived*(our_moles + moved_moles) - sharer.temperature_archived*(their_moles - moved_moles)) * R_IDEAL_GAS_EQUATION / volume -/datum/gas_mixture/after_share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - return - /datum/gas_mixture/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) //transfer of thermal energy (via conduction) between self and sharer if(sharer) diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index 90b9550028..08f64b5f4a 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -1,73 +1,71 @@ -//"immutable" gas mixture used for immutable calculations -//it can be changed, but any changes will ultimately be undone before they can have any effect - -/datum/gas_mixture/immutable - var/initial_temperature - -/datum/gas_mixture/immutable/New() - ..() - garbage_collect() - -/datum/gas_mixture/immutable/garbage_collect() - temperature = initial_temperature - temperature_archived = initial_temperature - gases.Cut() - -/datum/gas_mixture/immutable/archive() - return 1 //nothing changes, so we do nothing and the archive is successful - -/datum/gas_mixture/immutable/merge() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) - . = ..(sharer, 0) - garbage_collect() - -/datum/gas_mixture/immutable/after_share() - garbage_collect() - -/datum/gas_mixture/immutable/react() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/copy() - return new type //we're immutable, so we can just return a new instance. - -/datum/gas_mixture/immutable/copy_from() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/copy_from_turf() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/parse_gas_string() - return 0 //we're immutable. - -/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) - . = ..() - temperature = initial_temperature - - -//used by space tiles -/datum/gas_mixture/immutable/space - initial_temperature = TCMB - -/datum/gas_mixture/immutable/space/heat_capacity() - return HEAT_CAPACITY_VACUUM - -/datum/gas_mixture/immutable/space/remove() - return copy() //we're always empty, so we can just return a copy. - -/datum/gas_mixture/immutable/space/remove_ratio() - return copy() //we're always empty, so we can just return a copy. - - -//used by cloners -/datum/gas_mixture/immutable/cloner - initial_temperature = T20C - -/datum/gas_mixture/immutable/cloner/garbage_collect() - ..() - ADD_GAS(/datum/gas/nitrogen, gases) - gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD - -/datum/gas_mixture/immutable/cloner/heat_capacity() - return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 +//"immutable" gas mixture used for immutable calculations +//it can be changed, but any changes will ultimately be undone before they can have any effect + +/datum/gas_mixture/immutable + var/initial_temperature + gc_share = TRUE + +/datum/gas_mixture/immutable/New() + ..() + garbage_collect() + +/datum/gas_mixture/immutable/garbage_collect() + temperature = initial_temperature + temperature_archived = initial_temperature + gases.Cut() + +/datum/gas_mixture/immutable/archive() + return 1 //nothing changes, so we do nothing and the archive is successful + +/datum/gas_mixture/immutable/merge() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4) + . = ..(sharer, 0) + garbage_collect() + +/datum/gas_mixture/immutable/react() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy() + return new type //we're immutable, so we can just return a new instance. + +/datum/gas_mixture/immutable/copy_from() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/copy_from_turf() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/parse_gas_string() + return 0 //we're immutable. + +/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity) + . = ..() + temperature = initial_temperature + + +//used by space tiles +/datum/gas_mixture/immutable/space + initial_temperature = TCMB + +/datum/gas_mixture/immutable/space/heat_capacity() + return HEAT_CAPACITY_VACUUM + +/datum/gas_mixture/immutable/space/remove() + return copy() //we're always empty, so we can just return a copy. + +/datum/gas_mixture/immutable/space/remove_ratio() + return copy() //we're always empty, so we can just return a copy. + + +//used by cloners +/datum/gas_mixture/immutable/cloner + initial_temperature = T20C + +/datum/gas_mixture/immutable/cloner/garbage_collect() + ..() + ADD_GAS(/datum/gas/nitrogen, gases) + gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD + +/datum/gas_mixture/immutable/cloner/heat_capacity() + return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index cfaef38f6c..c4fa387ab0 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -221,13 +221,16 @@ if(!P) continue GL += P.return_air() - for(var/obj/machinery/atmospherics/components/binary/valve/V in P.other_atmosmch) - if(V.on) - PL |= V.parents[1] - PL |= V.parents[2] - for(var/obj/machinery/atmospherics/components/unary/portables_connector/C in P.other_atmosmch) - if(C.connected_device) - GL += C.portableConnectorReturnAir() + for(var/atmosmch in P.other_atmosmch) + if (istype(atmosmch, /obj/machinery/atmospherics/components/binary/valve)) + var/obj/machinery/atmospherics/components/binary/valve/V = atmosmch + if(V.on) + PL |= V.parents[1] + PL |= V.parents[2] + else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector)) + var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch + if(C.connected_device) + GL += C.portableConnectorReturnAir() var/total_thermal_energy = 0 var/total_heat_capacity = 0