mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-09 16:05:07 +00:00
* Properly accounts for byond tick fuckery in runechat code (#74388) ## About The Pull Request Ok so like, the agreed upon assumption for "verb like code" (stuff that triggers when a client sents a network packet to the server), is it runs in verb time, that sliver of time between maptick and the start of the next tick. We thought MeasureText worked like this. It doesn't. It will, occasionally, resume not during verb time but as a sleeping proc, at the start of the next tick. Before the MC has started working. This appears to only happen when the tick is already overloaded. Unfortunately, it doesn't invoke after all sleeping procs as we were lead to believe, but just like, like any sleeping proc. This means it fights with the mc for cpu time, and doesn't respect the TICK_CHECK macro we use to ensure this situation doesn't happen. SOOO lets use a var off the MC instead, tracking when it last fired. We can use this in companion with TICK_CHECK to ensure verbs schedule properly if they invoke before the MC runs. Hopefully this should fix 0 cpu when running at highpop Thanks to Kylerace and MrStonedOne for suffering together with me on this, I hate this engine. * Properly accounts for byond tick fuckery in runechat code --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
32 lines
1.4 KiB
Plaintext
32 lines
1.4 KiB
Plaintext
/// Percentage of tick to leave for master controller to run
|
|
#define MAPTICK_MC_MIN_RESERVE 70
|
|
#define MAPTICK_LAST_INTERNAL_TICK_USAGE (world.map_cpu)
|
|
|
|
/// Tick limit while running normally
|
|
#define TICK_BYOND_RESERVE 2
|
|
#define TICK_LIMIT_RUNNING (max(100 - TICK_BYOND_RESERVE - MAPTICK_LAST_INTERNAL_TICK_USAGE, MAPTICK_MC_MIN_RESERVE))
|
|
/// Tick limit used to resume things in stoplag
|
|
#define TICK_LIMIT_TO_RUN 70
|
|
/// Tick limit for MC while running
|
|
#define TICK_LIMIT_MC 70
|
|
|
|
/// for general usage of tick_usage
|
|
#define TICK_USAGE world.tick_usage
|
|
/// to be used where the result isn't checked
|
|
#define TICK_USAGE_REAL world.tick_usage
|
|
|
|
/// Returns true if tick_usage is above the limit
|
|
#define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit )
|
|
/// runs stoplag if tick_usage is above the limit
|
|
#define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 )
|
|
|
|
/// Checks if a sleeping proc is running before or after the master controller
|
|
#define RUNNING_BEFORE_MASTER ( Master.last_run != null && Master.last_run != world.time )
|
|
/// Returns true if a verb ought to yield to the MC (IE: queue up to be processed by a subsystem)
|
|
#define VERB_SHOULD_YIELD ( TICK_CHECK || RUNNING_BEFORE_MASTER )
|
|
|
|
/// Returns true if tick usage is above 95, for high priority usage
|
|
#define TICK_CHECK_HIGH_PRIORITY ( TICK_USAGE > 95 )
|
|
/// runs stoplag if tick_usage is above 95, for high priority usage
|
|
#define CHECK_TICK_HIGH_PRIORITY ( TICK_CHECK_HIGH_PRIORITY? stoplag() : 0 )
|