From 8f4cc088098620bf146ed4aa6c768dc9178303c8 Mon Sep 17 00:00:00 2001 From: Purpose Date: Sat, 6 Oct 2018 20:40:21 +0100 Subject: [PATCH] more optimisation! --- code/__HELPERS/icon_smoothing.dm | 79 ++++++++++++----------- code/controllers/subsystem/icon_smooth.dm | 25 ++++--- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 1bb7fe939c1..2db8621195d 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -108,18 +108,23 @@ return adjacencies +//do not use, use queue_smooth(atom) /proc/smooth_icon(atom/A) + if(!A || !A.smooth || !A.z) + return if(QDELETED(A)) return - if(!A || !A.smooth) - return - spawn(0) - if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) - var/adjacencies = calculate_adjacencies(A) - if(A.smooth & SMOOTH_DIAGONAL) - A.diagonal_smooth(adjacencies) - else - cardinal_smooth(A, adjacencies) + if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) + var/adjacencies = calculate_adjacencies(A) + + if(A.smooth & SMOOTH_DIAGONAL) + A.diagonal_smooth(adjacencies) + else + cardinal_smooth(A, adjacencies) + if(A.smooth & SMOOTH_DIAGONAL) + A.diagonal_smooth(adjacencies) + else + cardinal_smooth(A, adjacencies) /atom/proc/diagonal_smooth(adjacencies) switch(adjacencies) @@ -152,12 +157,12 @@ /turf/simulated/wall/diagonal_smooth(adjacencies) adjacencies = reverse_ndir(..()) if(adjacencies) - underlays.Cut() + var/list/U = list() if(fixed_underlay) if(fixed_underlay["space"]) - underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) + U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) else - underlays += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) + U += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) else var/turf/T = get_step(src, turn(adjacencies, 180)) if(T && (T.density || T.smooth)) @@ -166,13 +171,14 @@ T = get_step(src, turn(adjacencies, 225)) if(istype(T, /turf/space) && !istype(T, /turf/space/transit)) - underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) + U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) else if(T && !T.density && !T.smooth) - underlays += T + U += T else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) - underlays += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) + U += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) else - underlays += DEFAULT_UNDERLAY_IMAGE + U += DEFAULT_UNDERLAY_IMAGE + underlays = U /proc/cardinal_smooth(atom/A, adjacencies) //NW CORNER @@ -227,25 +233,30 @@ else if(adjacencies & N_EAST) se = "4-e" + var/list/New = list() + if(A.top_left_corner != nw) A.overlays -= A.top_left_corner A.top_left_corner = nw - A.overlays += nw + New += nw if(A.top_right_corner != ne) A.overlays -= A.top_right_corner A.top_right_corner = ne - A.overlays += ne + New += ne if(A.bottom_right_corner != sw) A.overlays -= A.bottom_right_corner A.bottom_right_corner = sw - A.overlays += sw + New += sw if(A.bottom_left_corner != se) A.overlays -= A.bottom_left_corner A.bottom_left_corner = se - A.overlays += se + New += se + + if(New.len) + A.overlays.Add(New) /proc/find_type_in_direction(atom/source, direction) var/turf/target_turf = get_step(source, direction) @@ -307,14 +318,16 @@ /atom/proc/replace_smooth_overlays(nw, ne, sw, se) clear_smooth_overlays() + var/list/O = list() top_left_corner = nw - overlays += nw + O += nw top_right_corner = ne - overlays += ne + O += ne bottom_left_corner = sw - overlays += sw + O += sw bottom_right_corner = se - overlays += se + O += se + overlays.Add(O) /proc/reverse_ndir(ndir) switch(ndir) @@ -354,27 +367,17 @@ return 0 //SSicon_smooth -/proc/ss_smooth_icon(atom/A) - if(QDELETED(A)) - return - if(!istype(A) || (A && !A.smooth)) - return - if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) - var/adjacencies = calculate_adjacencies(A) - if(A.smooth & SMOOTH_DIAGONAL) - A.diagonal_smooth(adjacencies) - else - cardinal_smooth(A, adjacencies) - //SSicon_smooth /proc/queue_smooth_neighbors(atom/A) for(var/V in orange(1,A)) var/atom/T = V if(T.smooth) queue_smooth(T) - //SSicon_smooth + +//SSicon_smooth /proc/queue_smooth(atom/A) if(SSicon_smooth) - SSicon_smooth.smooth_queue |= A + SSicon_smooth.smooth_queue[A] = A + SSicon_smooth.can_fire = 1 else smooth_icon(A) diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 46981d94914..8688ff0bb22 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -2,25 +2,34 @@ var/datum/controller/subsystem/icon_smooth/SSicon_smooth /datum/controller/subsystem/icon_smooth name = "Icon Smoothing" - priority = -5 - wait = 5 + init_order = -5 + wait = 1 + priority = 35 + flags = SS_TICKER + var/list/smooth_queue = list() /datum/controller/subsystem/icon_smooth/New() NEW_SS_GLOBAL(SSicon_smooth) /datum/controller/subsystem/icon_smooth/fire() - for(var/atom in smooth_queue) - ss_smooth_icon(atom) - smooth_queue -= atom + while(smooth_queue.len) + var/atom/A = smooth_queue[smooth_queue.len] + smooth_queue.len-- + smooth_icon(A) if (MC_TICK_CHECK) return + if (!smooth_queue.len) + can_fire = 0 /datum/controller/subsystem/icon_smooth/Initialize() smooth_zlevel(1,TRUE) smooth_zlevel(2,TRUE) - for(var/V in smooth_queue) + var/queue = smooth_queue + smooth_queue = list() + for(var/V in queue) var/atom/A = V - if(A.z == 1 || A.z == 2) - smooth_queue -= A + if(!A || A.z <= 2) + continue + smooth_icon(A) ..()