From 29f42778dda50d3391deeb4687cfb429fe4b3252 Mon Sep 17 00:00:00 2001 From: Tkdrg Date: Sat, 24 Oct 2015 13:55:58 -0300 Subject: [PATCH] Improves performance of set_airlock_overlays They will now only update when they actually change. On my testing, this made performance improve about 3-15 times, depending on the use case. I could have made this a loop if I turned the overlays into a list with defines but I was lazy and this copy-paste is probably slightly faster than a list as well (despite being harder to read and to maintain). --- code/game/machinery/doors/airlock.dm | 39 +++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c3d7449b657..47859e4bb5a 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -58,6 +58,13 @@ var/list/airlock_overlays = list() var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' + var/image/old_frame_overlay //keep those in order to prevent unnecessary updating + var/image/old_filling_overlay + var/image/old_lights_overlay + var/image/old_panel_overlay + var/image/old_weld_overlay + var/image/old_sparks_overlay + explosion_block = 1 /obj/machinery/door/airlock/New() @@ -312,13 +319,31 @@ About the new airlock wires panel: if(p_open) panel_overlay = get_airlock_overlay("panel_opening", overlays_file) - overlays.Cut() - overlays += frame_overlay - overlays += filling_overlay - overlays += lights_overlay - overlays += panel_overlay - overlays += weld_overlay - overlays += sparks_overlay + //doesn't use overlays.Cut() for performance reasons + if(frame_overlay != old_frame_overlay) + overlays -= old_frame_overlay + overlays += frame_overlay + old_frame_overlay = frame_overlay + if(filling_overlay != old_filling_overlay) + overlays -= old_filling_overlay + overlays += filling_overlay + old_filling_overlay = filling_overlay + if(lights_overlay != old_lights_overlay) + overlays -= old_lights_overlay + overlays += lights_overlay + old_lights_overlay = lights_overlay + if(panel_overlay != old_panel_overlay) + overlays -= old_panel_overlay + overlays += panel_overlay + old_panel_overlay = panel_overlay + if(weld_overlay != old_weld_overlay) + overlays -= old_weld_overlay + overlays += weld_overlay + old_weld_overlay = weld_overlay + if(sparks_overlay != old_sparks_overlay) + overlays -= old_sparks_overlay + overlays += sparks_overlay + old_sparks_overlay = sparks_overlay /proc/get_airlock_overlay(icon_state, icon_file) var/iconkey = "[icon_state][icon_file]"