mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Merge pull request #7917 from VOREStation/Arokha/squeez
Attempt some performance improvements
This commit is contained in:
@@ -1303,6 +1303,11 @@ var/mob/dview/dview_mob = new
|
|||||||
else
|
else
|
||||||
living_mob_list -= src
|
living_mob_list -= src
|
||||||
|
|
||||||
|
/mob/dview/Life()
|
||||||
|
mob_list -= src
|
||||||
|
dead_mob_list -= src
|
||||||
|
living_mob_list -= src
|
||||||
|
|
||||||
/mob/dview/Destroy(var/force)
|
/mob/dview/Destroy(var/force)
|
||||||
crash_with("Attempt to delete the dview_mob: [log_info_line(src)]")
|
crash_with("Attempt to delete the dview_mob: [log_info_line(src)]")
|
||||||
if (!force)
|
if (!force)
|
||||||
|
|||||||
@@ -9,14 +9,22 @@ SUBSYSTEM_DEF(ai)
|
|||||||
var/list/processing = list()
|
var/list/processing = list()
|
||||||
var/list/currentrun = list()
|
var/list/currentrun = list()
|
||||||
|
|
||||||
|
var/slept_mobs = 0
|
||||||
|
var/list/process_z = list()
|
||||||
|
|
||||||
/datum/controller/subsystem/ai/stat_entry(msg_prefix)
|
/datum/controller/subsystem/ai/stat_entry(msg_prefix)
|
||||||
var/list/msg = list(msg_prefix)
|
..("P: [processing.len] | S: [slept_mobs]")
|
||||||
msg += "P:[processing.len]"
|
|
||||||
..(msg.Join())
|
|
||||||
|
|
||||||
/datum/controller/subsystem/ai/fire(resumed = 0)
|
/datum/controller/subsystem/ai/fire(resumed = 0)
|
||||||
if (!resumed)
|
if (!resumed)
|
||||||
src.currentrun = processing.Copy()
|
src.currentrun = processing.Copy()
|
||||||
|
process_z.Cut()
|
||||||
|
slept_mobs = 0
|
||||||
|
var/level = 1
|
||||||
|
while(process_z.len < GLOB.living_players_by_zlevel.len)
|
||||||
|
process_z.len++
|
||||||
|
process_z[level] = GLOB.living_players_by_zlevel[level].len
|
||||||
|
level++
|
||||||
|
|
||||||
//cache for sanic speed (lists are references anyways)
|
//cache for sanic speed (lists are references anyways)
|
||||||
var/list/currentrun = src.currentrun
|
var/list/currentrun = src.currentrun
|
||||||
@@ -26,7 +34,12 @@ SUBSYSTEM_DEF(ai)
|
|||||||
--currentrun.len
|
--currentrun.len
|
||||||
if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick
|
if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick
|
||||||
continue
|
continue
|
||||||
A.handle_strategicals()
|
|
||||||
|
if(process_z[get_z(A.holder)])
|
||||||
|
A.handle_strategicals()
|
||||||
|
else
|
||||||
|
slept_mobs++
|
||||||
|
A.set_stance(STANCE_IDLE)
|
||||||
|
|
||||||
if(MC_TICK_CHECK)
|
if(MC_TICK_CHECK)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -15,24 +15,23 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
var/list/currentrun = list()
|
var/list/currentrun = list()
|
||||||
var/log_extensively = FALSE
|
var/log_extensively = FALSE
|
||||||
var/list/timelog = list()
|
var/list/timelog = list()
|
||||||
var/list/busy_z_levels = list()
|
|
||||||
var/slept_mobs = 0
|
var/slept_mobs = 0
|
||||||
|
var/list/process_z = list()
|
||||||
|
|
||||||
/datum/controller/subsystem/mobs/stat_entry()
|
/datum/controller/subsystem/mobs/stat_entry()
|
||||||
..("P: [global.mob_list.len] | S: [slept_mobs]")
|
..("P: [global.mob_list.len] | S: [slept_mobs]")
|
||||||
|
|
||||||
/datum/controller/subsystem/mobs/fire(resumed = 0)
|
/datum/controller/subsystem/mobs/fire(resumed = 0)
|
||||||
var/list/busy_z_levels = src.busy_z_levels
|
|
||||||
|
|
||||||
if (!resumed)
|
if (!resumed)
|
||||||
slept_mobs = 0
|
|
||||||
src.currentrun = mob_list.Copy()
|
src.currentrun = mob_list.Copy()
|
||||||
busy_z_levels.Cut()
|
process_z.Cut()
|
||||||
for(var/played_mob in player_list)
|
slept_mobs = 0
|
||||||
if(!played_mob || isobserver(played_mob))
|
var/level = 1
|
||||||
continue
|
while(process_z.len < GLOB.living_players_by_zlevel.len)
|
||||||
var/mob/pm = played_mob
|
process_z.len++
|
||||||
busy_z_levels |= pm.z
|
process_z[level] = GLOB.living_players_by_zlevel[level].len
|
||||||
|
level++
|
||||||
|
|
||||||
//cache for sanic speed (lists are references anyways)
|
//cache for sanic speed (lists are references anyways)
|
||||||
var/list/currentrun = src.currentrun
|
var/list/currentrun = src.currentrun
|
||||||
@@ -41,18 +40,13 @@ SUBSYSTEM_DEF(mobs)
|
|||||||
var/mob/M = currentrun[currentrun.len]
|
var/mob/M = currentrun[currentrun.len]
|
||||||
currentrun.len--
|
currentrun.len--
|
||||||
|
|
||||||
if(QDELETED(M))
|
if(!M || QDELETED(M))
|
||||||
mob_list -= M
|
mob_list -= M
|
||||||
else
|
else if(M.low_priority && !(process_z[get_z(M)]))
|
||||||
// Right now mob.Life() is unstable enough I think we need to use a try catch.
|
slept_mobs++
|
||||||
// Obviously we should try and get rid of this for performance reasons when we can.
|
continue
|
||||||
try
|
|
||||||
if(M.low_priority && !(M.z in busy_z_levels))
|
M.Life(times_fired)
|
||||||
slept_mobs++
|
|
||||||
continue
|
|
||||||
M.Life(times_fired)
|
|
||||||
catch(var/exception/e)
|
|
||||||
log_runtime(e, M, "Caught by [name] subsystem")
|
|
||||||
|
|
||||||
if (MC_TICK_CHECK)
|
if (MC_TICK_CHECK)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ var/global/datum/controller/subsystem/ticker/ticker
|
|||||||
/datum/controller/subsystem/ticker/Initialize()
|
/datum/controller/subsystem/ticker/Initialize()
|
||||||
pregame_timeleft = config.pregame_time
|
pregame_timeleft = config.pregame_time
|
||||||
send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]")
|
send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]")
|
||||||
|
|
||||||
|
// Set up the global announcer
|
||||||
|
GLOB.autospeaker = new (null, null, null, 1)
|
||||||
|
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/datum/controller/subsystem/ticker/fire(resumed = FALSE)
|
/datum/controller/subsystem/ticker/fire(resumed = FALSE)
|
||||||
|
|||||||
@@ -284,7 +284,10 @@ var/global/list/default_medbay_channels = list(
|
|||||||
if(.)
|
if(.)
|
||||||
SSnanoui.update_uis(src)
|
SSnanoui.update_uis(src)
|
||||||
|
|
||||||
|
GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
|
||||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT
|
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels) //BS12 EDIT
|
||||||
|
if(!GLOB.autospeaker)
|
||||||
|
return
|
||||||
var/datum/radio_frequency/connection = null
|
var/datum/radio_frequency/connection = null
|
||||||
if(channel && channels && channels.len > 0)
|
if(channel && channels && channels.len > 0)
|
||||||
if(channel == "department")
|
if(channel == "department")
|
||||||
@@ -299,9 +302,8 @@ var/global/list/default_medbay_channels = list(
|
|||||||
if(!LAZYLEN(zlevels))
|
if(!LAZYLEN(zlevels))
|
||||||
zlevels = list(0)
|
zlevels = list(0)
|
||||||
|
|
||||||
var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1)
|
GLOB.autospeaker.SetName(from)
|
||||||
A.SetName(from)
|
Broadcast_Message(connection, GLOB.autospeaker,
|
||||||
Broadcast_Message(connection, A,
|
|
||||||
0, "*garbled automated announcement*", src,
|
0, "*garbled automated announcement*", src,
|
||||||
message_to_multilingual(message), from, "Automated Announcement", from, "synthesized voice",
|
message_to_multilingual(message), from, "Automated Announcement", from, "synthesized voice",
|
||||||
DATA_FAKE, 0, zlevels, connection.frequency, "states")
|
DATA_FAKE, 0, zlevels, connection.frequency, "states")
|
||||||
|
|||||||
@@ -648,9 +648,14 @@ proc/establish_old_db_connection()
|
|||||||
/world/proc/max_z_changed()
|
/world/proc/max_z_changed()
|
||||||
if(!istype(GLOB.players_by_zlevel, /list))
|
if(!istype(GLOB.players_by_zlevel, /list))
|
||||||
GLOB.players_by_zlevel = new /list(world.maxz, 0)
|
GLOB.players_by_zlevel = new /list(world.maxz, 0)
|
||||||
|
GLOB.living_players_by_zlevel = new /list(world.maxz, 0)
|
||||||
|
|
||||||
while(GLOB.players_by_zlevel.len < world.maxz)
|
while(GLOB.players_by_zlevel.len < world.maxz)
|
||||||
GLOB.players_by_zlevel.len++
|
GLOB.players_by_zlevel.len++
|
||||||
GLOB.players_by_zlevel[GLOB.players_by_zlevel.len] = list()
|
GLOB.players_by_zlevel[GLOB.players_by_zlevel.len] = list()
|
||||||
|
|
||||||
|
GLOB.living_players_by_zlevel.len++
|
||||||
|
GLOB.living_players_by_zlevel[GLOB.living_players_by_zlevel.len] = list()
|
||||||
|
|
||||||
// Call this to make a new blank z-level, don't modify maxz directly.
|
// Call this to make a new blank z-level, don't modify maxz directly.
|
||||||
/world/proc/increment_max_z()
|
/world/proc/increment_max_z()
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
#define AI_NORMAL 2 // Default level.
|
#define AI_NORMAL 2 // Default level.
|
||||||
#define AI_SMART 3 // Will do more processing to be a little smarter, like not walking while confused if it could risk stepping randomly onto a bad tile.
|
#define AI_SMART 3 // Will do more processing to be a little smarter, like not walking while confused if it could risk stepping randomly onto a bad tile.
|
||||||
|
|
||||||
#define ai_log(M,V) if(debug_ai) ai_log_output(M,V)
|
//#define ai_log(M,V) if(debug_ai) ai_log_output(M,V)
|
||||||
|
#define ai_log(M,V)
|
||||||
|
|
||||||
// Logging level defines.
|
// Logging level defines.
|
||||||
#define AI_LOG_OFF 0 // Don't show anything.
|
#define AI_LOG_OFF 0 // Don't show anything.
|
||||||
|
|||||||
@@ -318,9 +318,11 @@
|
|||||||
if(STANCE_MOVE)
|
if(STANCE_MOVE)
|
||||||
if(hostile && find_target()) // This will switch its stance.
|
if(hostile && find_target()) // This will switch its stance.
|
||||||
ai_log("handle_stance_strategical() : STANCE_MOVE, found target and was inturrupted.", AI_LOG_TRACE)
|
ai_log("handle_stance_strategical() : STANCE_MOVE, found target and was inturrupted.", AI_LOG_TRACE)
|
||||||
|
return
|
||||||
if(STANCE_FOLLOW)
|
if(STANCE_FOLLOW)
|
||||||
if(hostile && find_target()) // This will switch its stance.
|
if(hostile && find_target()) // This will switch its stance.
|
||||||
ai_log("handle_stance_strategical() : STANCE_FOLLOW, found target and was inturrupted.", AI_LOG_TRACE)
|
ai_log("handle_stance_strategical() : STANCE_FOLLOW, found target and was inturrupted.", AI_LOG_TRACE)
|
||||||
|
return
|
||||||
else if(leader)
|
else if(leader)
|
||||||
ai_log("handle_stance_strategical() : STANCE_FOLLOW, going to calculate_path([leader]).", AI_LOG_TRACE)
|
ai_log("handle_stance_strategical() : STANCE_FOLLOW, going to calculate_path([leader]).", AI_LOG_TRACE)
|
||||||
calculate_path(leader)
|
calculate_path(leader)
|
||||||
@@ -359,5 +361,6 @@
|
|||||||
if(ai_holder)
|
if(ai_holder)
|
||||||
ai_holder.receive_taunt(taunter, force_target_switch)
|
ai_holder.receive_taunt(taunter, force_target_switch)
|
||||||
|
|
||||||
|
#undef AI_NO_PROCESS
|
||||||
#undef AI_PROCESSING
|
#undef AI_PROCESSING
|
||||||
#undef AI_FASTPROCESSING
|
#undef AI_FASTPROCESSING
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
// If our holder is able to do anything.
|
// If our holder is able to do anything.
|
||||||
/datum/ai_holder/proc/can_act()
|
/datum/ai_holder/proc/can_act()
|
||||||
if(!holder) // Holder missing.
|
if(!holder) // Holder missing.
|
||||||
manage_processing(AI_NO_PROCESS)
|
manage_processing(0)
|
||||||
return FALSE
|
return FALSE
|
||||||
if(holder.stat) // Dead or unconscious.
|
if(holder.stat) // Dead or unconscious.
|
||||||
ai_log("can_act() : Stat was non-zero ([holder.stat]).", AI_LOG_TRACE)
|
ai_log("can_act() : Stat was non-zero ([holder.stat]).", AI_LOG_TRACE)
|
||||||
|
|||||||
@@ -152,6 +152,7 @@
|
|||||||
/obj/item/integrated_circuit/output/text_to_speech/advanced/Initialize()
|
/obj/item/integrated_circuit/output/text_to_speech/advanced/Initialize()
|
||||||
..()
|
..()
|
||||||
my_voice = new (src)
|
my_voice = new (src)
|
||||||
|
mob_list -= my_voice // no life() ticks
|
||||||
my_voice.name = "TTS Circuit"
|
my_voice.name = "TTS Circuit"
|
||||||
|
|
||||||
/obj/item/integrated_circuit/output/text_to_speech/advanced/do_work()
|
/obj/item/integrated_circuit/output/text_to_speech/advanced/do_work()
|
||||||
|
|||||||
@@ -3,11 +3,22 @@
|
|||||||
status_flags = GODMODE|CANPUSH
|
status_flags = GODMODE|CANPUSH
|
||||||
has_huds = FALSE
|
has_huds = FALSE
|
||||||
|
|
||||||
/mob/living/carbon/human/dummy/mannequin/Initialize()
|
/mob/living/carbon/human/dummy/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
mob_list -= src
|
mob_list -= src
|
||||||
living_mob_list -= src
|
living_mob_list -= src
|
||||||
dead_mob_list -= src
|
dead_mob_list -= src
|
||||||
|
human_mob_list -= src
|
||||||
|
|
||||||
|
/mob/living/carbon/human/dummy/Life()
|
||||||
|
mob_list -= src
|
||||||
|
living_mob_list -= src
|
||||||
|
dead_mob_list -= src
|
||||||
|
human_mob_list -= src
|
||||||
|
return
|
||||||
|
|
||||||
|
/mob/living/carbon/human/dummy/mannequin/Initialize()
|
||||||
|
. = ..()
|
||||||
delete_inventory()
|
delete_inventory()
|
||||||
|
|
||||||
/mob/living/carbon/human/skrell/Initialize(var/new_loc)
|
/mob/living/carbon/human/skrell/Initialize(var/new_loc)
|
||||||
|
|||||||
@@ -985,9 +985,15 @@ var/list/ai_verbs_default = list(
|
|||||||
dead_mob_list -= src
|
dead_mob_list -= src
|
||||||
ai_list -= src
|
ai_list -= src
|
||||||
silicon_mob_list -= src
|
silicon_mob_list -= src
|
||||||
|
QDEL_NULL(eyeobj)
|
||||||
|
|
||||||
/mob/living/silicon/ai/announcer/Life()
|
/mob/living/silicon/ai/announcer/Life()
|
||||||
return
|
mob_list -= src
|
||||||
|
living_mob_list -= src
|
||||||
|
dead_mob_list -= src
|
||||||
|
ai_list -= src
|
||||||
|
silicon_mob_list -= src
|
||||||
|
QDEL_NULL(eyeobj)
|
||||||
|
|
||||||
#undef AI_CHECK_WIRELESS
|
#undef AI_CHECK_WIRELESS
|
||||||
#undef AI_CHECK_RADIO
|
#undef AI_CHECK_RADIO
|
||||||
|
|||||||
@@ -156,6 +156,9 @@
|
|||||||
// contained in a cage
|
// contained in a cage
|
||||||
var/in_stasis = 0
|
var/in_stasis = 0
|
||||||
|
|
||||||
|
// don't process me if there's nobody around to see it
|
||||||
|
low_priority = TRUE
|
||||||
|
|
||||||
/mob/living/simple_mob/Initialize()
|
/mob/living/simple_mob/Initialize()
|
||||||
verbs -= /mob/verb/observe
|
verbs -= /mob/verb/observe
|
||||||
health = maxHealth
|
health = maxHealth
|
||||||
|
|||||||
@@ -1200,6 +1200,16 @@ mob/proc/yank_out_object()
|
|||||||
else
|
else
|
||||||
registered_z = null
|
registered_z = null
|
||||||
|
|
||||||
|
GLOBAL_LIST_EMPTY(living_players_by_zlevel)
|
||||||
|
/mob/living/update_client_z(new_z)
|
||||||
|
var/precall_reg_z = registered_z
|
||||||
|
. = ..() // will update registered_z if necessary
|
||||||
|
if(precall_reg_z != registered_z) // parent did work, let's do work too
|
||||||
|
if(precall_reg_z)
|
||||||
|
GLOB.living_players_by_zlevel[precall_reg_z] -= src
|
||||||
|
if(registered_z)
|
||||||
|
GLOB.living_players_by_zlevel[registered_z] += src
|
||||||
|
|
||||||
/mob/onTransitZ(old_z, new_z)
|
/mob/onTransitZ(old_z, new_z)
|
||||||
..()
|
..()
|
||||||
update_client_z(new_z)
|
update_client_z(new_z)
|
||||||
|
|||||||
Reference in New Issue
Block a user