mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-11 01:13:18 +00:00
## About The Pull Request We've got a few space related things that are busted, and shuttle movement is slow. I'd like to try to improve these things, if just a bit. Long list of only tenuously related topics. Sorry for the shotgun blast #### [Fixes lazyloaded stuff having bad space](d4de176a63) We need to handle area transferring in maploading code under niche cases, and we also need to actually init reservation spaces we create. It's also redundant and potentially dupe creating to do area lighting handling in changeturf, because it gets touched in turf init anyway. Old me is stupid. #### [Adds some doc comments, yeets ssmappping/transit](269717145d) We had a reserved space for just shuttles to use, except it wasn't for just shuttles. So in theory if the space got clogged with other shit, the shuttles could have nowhere to actually use. It's better to just have the two groups share real estate. More sane ### The "Starlight is Slow" Block #### [Starlight optimization part one (don't check config for each individual turf you check for activity)](7312a314be) #### [Starlight optimization part two (infer context)](be94c422ed) Starlight was causing each space turf to cause itself and its neighbor to constantly recheck if they had starlight off changeturf. The exact same effect can be had by taking advantage of some pre-existing information, namely if the space turf is gaining or losing a source of starlight. Essentially, instead of telling a turf to check all adjacent turfs to see if it's got starlight, we tell the turf if WE are a source of starlight, or if we might be taking something away from it. There's a bit of wasted cpu here but not much, if it's worth doing a register signal pattern for clearing depends on the case we're working with. Being intelligent about this makes things much faster, something in the neighborhood of 4 to 3 fold. I've also made openspace's starlight work better, cause the old pattern was a bit silly. ### Changeturf is Annoying (Microops) #### [Micro ops changeturf and turf deletion a bit](386b3ab7fc) Don't do work if the thing you're working on doesn't exist, don't check every adjacent turf for firelocks on turf change (just have thefirelocks manage that), don't check all atoms on the turf for decals on turf change, similar. Also moves visibility changes from camera code into changeturf, to avoid unneeded work. Needs some extra work to optimize the guts for this path but I can do that! #### [Micros camera vis changes](ebab69e9ea) We should only update vis when our opacity changes. In addition, we don't need all the camera handling fluff if we only want to update our turf's static groups. Also micros a camera net helper to be less crap for non multiz maps #### [Micros some open space atmos cases, alongside avoiding a for(null) in opacity handling](72ae07ba1d) #### [Ensures space_lit tiles never accidentially inherit lighting objects](a99ff2265a) S dumb, and leads to space turfs having two sources of lighting, which looks wrong. This was invisible when their lighting was fullbright, but it sucks now. ### Misc Stuff #### [Cleans up stat tracking a bit to avoid collisions](40fb8f21e2) #### [Cleans up a turf helper to not be stupid](bf4ee67100) WHY ARE YOU USING THE RANGED TURF HELPER IF YOU GO ONE TILE #### [Moves transit turf signal cleanup to destroy, I named this proc wrong](c85c2cfc86) I'm sorry @Time-Green #### [Adds better transit caching to shuttles](35e85334c4) Adds a max reserved transit size to the shuttle subsystem, to keep things in bounds. In addition, adds a soft cap under which existing transit space will get hold onto, to make repeated non escape/arrive shuttle movements faster Hopefully this makes common shuttle moves less bad. ## Why It's Good For The Game Speed
112 lines
4.5 KiB
Plaintext
112 lines
4.5 KiB
Plaintext
/datum/lighting_object
|
|
///the underlay we are currently applying to our turf to apply light
|
|
var/mutable_appearance/current_underlay
|
|
|
|
///whether we are already in the SSlighting.objects_queue list
|
|
var/needs_update = FALSE
|
|
|
|
///the turf that our light is applied to
|
|
var/turf/affected_turf
|
|
|
|
// Global list of lighting underlays, indexed by z level
|
|
GLOBAL_LIST_EMPTY(default_lighting_underlays_by_z)
|
|
|
|
/datum/lighting_object/New(turf/source)
|
|
if(!isturf(source))
|
|
qdel(src, force=TRUE)
|
|
stack_trace("a lighting object was assigned to [source], a non turf! ")
|
|
return
|
|
|
|
. = ..()
|
|
|
|
current_underlay = new(GLOB.default_lighting_underlays_by_z[source.z])
|
|
|
|
affected_turf = source
|
|
if (affected_turf.lighting_object)
|
|
qdel(affected_turf.lighting_object, force = TRUE)
|
|
stack_trace("a lighting object was assigned to a turf that already had a lighting object!")
|
|
|
|
affected_turf.lighting_object = src
|
|
affected_turf.luminosity = 0
|
|
|
|
// This path is really hot. this is faster
|
|
// Really this should be a global var or something, but lets not think about that yes?
|
|
if(CONFIG_GET(flag/starlight))
|
|
for(var/turf/open/space/space_tile in RANGE_TURFS(1, affected_turf))
|
|
space_tile.enable_starlight()
|
|
|
|
needs_update = TRUE
|
|
SSlighting.objects_queue += src
|
|
|
|
/datum/lighting_object/Destroy(force)
|
|
if (!force)
|
|
return QDEL_HINT_LETMELIVE
|
|
SSlighting.objects_queue -= src
|
|
if (isturf(affected_turf))
|
|
affected_turf.lighting_object = null
|
|
affected_turf.luminosity = 1
|
|
affected_turf.underlays -= current_underlay
|
|
affected_turf = null
|
|
return ..()
|
|
|
|
/datum/lighting_object/proc/update()
|
|
// To the future coder who sees this and thinks
|
|
// "Why didn't he just use a loop?"
|
|
// Well my man, it's because the loop performed like shit.
|
|
// And there's no way to improve it because
|
|
// without a loop you can make the list all at once which is the fastest you're gonna get.
|
|
// Oh it's also shorter line wise.
|
|
// Including with these comments.
|
|
|
|
var/static/datum/lighting_corner/dummy/dummy_lighting_corner = new
|
|
|
|
var/turf/affected_turf = src.affected_turf
|
|
|
|
#ifdef VISUALIZE_LIGHT_UPDATES
|
|
affected_turf.add_atom_colour(COLOR_BLUE_LIGHT, ADMIN_COLOUR_PRIORITY)
|
|
animate(affected_turf, 10, color = null)
|
|
addtimer(CALLBACK(affected_turf, TYPE_PROC_REF(/atom, remove_atom_colour), ADMIN_COLOUR_PRIORITY, COLOR_BLUE_LIGHT), 10, TIMER_UNIQUE|TIMER_OVERRIDE)
|
|
#endif
|
|
|
|
var/datum/lighting_corner/red_corner = affected_turf.lighting_corner_SW || dummy_lighting_corner
|
|
var/datum/lighting_corner/green_corner = affected_turf.lighting_corner_SE || dummy_lighting_corner
|
|
var/datum/lighting_corner/blue_corner = affected_turf.lighting_corner_NW || dummy_lighting_corner
|
|
var/datum/lighting_corner/alpha_corner = affected_turf.lighting_corner_NE || dummy_lighting_corner
|
|
|
|
var/max = max(red_corner.largest_color_luminosity, green_corner.largest_color_luminosity, blue_corner.largest_color_luminosity, alpha_corner.largest_color_luminosity)
|
|
|
|
|
|
#if LIGHTING_SOFT_THRESHOLD != 0
|
|
var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD
|
|
#else
|
|
// Because of floating points™?, it won't even be a flat 0.
|
|
// This number is mostly arbitrary.
|
|
var/set_luminosity = max > 1e-6
|
|
#endif
|
|
|
|
var/mutable_appearance/current_underlay = src.current_underlay
|
|
affected_turf.underlays -= current_underlay
|
|
if(red_corner.cache_r & green_corner.cache_r & blue_corner.cache_r & alpha_corner.cache_r && \
|
|
(red_corner.cache_g + green_corner.cache_g + blue_corner.cache_g + alpha_corner.cache_g + \
|
|
red_corner.cache_b + green_corner.cache_b + blue_corner.cache_b + alpha_corner.cache_b == 8))
|
|
//anything that passes the first case is very likely to pass the second, and addition is a little faster in this case
|
|
current_underlay.icon_state = "lighting_transparent"
|
|
current_underlay.color = null
|
|
else if(!set_luminosity)
|
|
current_underlay.icon_state = "lighting_dark"
|
|
current_underlay.color = null
|
|
else
|
|
current_underlay.icon_state = null
|
|
current_underlay.color = list(
|
|
red_corner.cache_r, red_corner.cache_g, red_corner.cache_b, 00,
|
|
green_corner.cache_r, green_corner.cache_g, green_corner.cache_b, 00,
|
|
blue_corner.cache_r, blue_corner.cache_g, blue_corner.cache_b, 00,
|
|
alpha_corner.cache_r, alpha_corner.cache_g, alpha_corner.cache_b, 00,
|
|
00, 00, 00, 01
|
|
)
|
|
|
|
// Of note. Most of the cost in this proc is here, I think because color matrix'd underlays DO NOT cache well, which is what adding to underlays does
|
|
// We use underlays because objects on each tile would fuck with maptick. if that ever changes, use an object for this instead
|
|
affected_turf.underlays += current_underlay
|
|
affected_turf.luminosity = set_luminosity
|