From 9d8f34dd8d870f403e9c62c23f6500befc3b4c89 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 20 Aug 2021 16:55:47 -0500 Subject: [PATCH 1/3] Attempts an optimisation for power_change - Adds an alternate, hopefully faster list iteration method for machines in power_change - Removes uses of INVOKE_ASYNC for power_change, since it's slower than normal proc calls and does nothing since it doesn't sleep TODO: Diagnose what the fuck is making power_change so slow anyway. --- code/game/area/areas.dm | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index a28d558454..1d0069a7cd 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -310,7 +310,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) A.power_light = FALSE A.power_equip = FALSE A.power_environ = FALSE - INVOKE_ASYNC(A, .proc/power_change) + A.power_change() STOP_PROCESSING(SSobj, src) return ..() @@ -544,15 +544,19 @@ GLOBAL_LIST_EMPTY(teleportlocs) // called when power status changes /area/proc/power_change() - for(var/obj/machinery/M in src) // for each machine in the area - M.power_change() // reverify power status (to update icons etc.) - if(sub_areas) - for(var/i in sub_areas) - var/area/A = i - A.power_light = power_light - A.power_equip = power_equip - A.power_environ = power_environ - INVOKE_ASYNC(A, .proc/power_change) + if(contents.len < GLOB.machines.len) // it would be faster to loop over contents + for(var/obj/machinery/M in src) // for each machine in the area + M.power_change() // reverify power status (to update icons etc.) + else // it would be faster to loop over the machines list + for(var/obj/machinery/M as anything in GLOB.machines) // for each machine + if(get_area(M) != src) // in the area + continue + M.power_change() // reverify power status (to update icons etc.) + for(var/area/A as anything in sub_areas) + A.power_light = power_light + A.power_equip = power_equip + A.power_environ = power_environ + A.power_change() update_appearance() /area/proc/usage(chan) From 6da377655854a93cfccdf93aa86c1ed0f1f09128 Mon Sep 17 00:00:00 2001 From: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:40:42 +0100 Subject: [PATCH 2/3] no sleep no sleeping if not using INVOKE_ASYNC --- code/game/machinery/doors/firedoor.dm | 2 +- code/modules/power/power.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 7b0ff1d319..d040b98a38 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -128,7 +128,7 @@ /obj/machinery/door/firedoor/power_change() if(powered(power_channel)) stat &= ~NOPOWER - latetoggle() + INVOKE_ASYNC(src, .proc/latetoggle) else stat |= NOPOWER diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c2dd77290a..a44a0faa06 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -105,7 +105,7 @@ addStaticPower(-value, powerchannel) /obj/machinery/proc/power_change() - //SIGNAL_HANDLER + SHOULD_NOT_SLEEP(TRUE) //SHOULD_CALL_PARENT(TRUE) if(stat & BROKEN) From 7bb6d4ca0850597e705e95d3a7e96c60295f512e Mon Sep 17 00:00:00 2001 From: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:46:21 +0100 Subject: [PATCH 3/3] another layer --- code/game/area/areas.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index ce4f4f7e92..54f1db323a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -579,6 +579,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) // called when power status changes /area/proc/power_change() + SHOULD_NOT_SLEEP(TRUE) if(contents.len < GLOB.machines.len) // it would be faster to loop over contents for(var/obj/machinery/M in src) // for each machine in the area M.power_change() // reverify power status (to update icons etc.)