diff --git a/code/controllers/subsystem/asset_loading.dm b/code/controllers/subsystem/asset_loading.dm index 30c3078a0d9..d8139caf148 100644 --- a/code/controllers/subsystem/asset_loading.dm +++ b/code/controllers/subsystem/asset_loading.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(asset_loading) flags = SS_NO_INIT | SS_HIBERNATE runlevels = RUNLEVEL_LOBBY|RUNLEVELS_DEFAULT var/list/datum/asset/generate_queue = list() + var/assets_generating = 0 var/last_queue_len = 0 /datum/controller/subsystem/asset_loading/PreInit() @@ -19,14 +20,17 @@ SUBSYSTEM_DEF(asset_loading) while(length(generate_queue)) var/datum/asset/to_load = generate_queue[generate_queue.len] + + last_queue_len = length(generate_queue) + generate_queue.len-- + to_load.queued_generation() if(MC_TICK_CHECK) return - last_queue_len = length(generate_queue) - generate_queue.len-- + // We just emptied the queue - if(last_queue_len && !length(generate_queue)) + if(last_queue_len && !length(generate_queue) && !assets_generating) // Clean up cached icons, freeing memory. rustg_iconforge_cleanup() diff --git a/code/modules/asset_cache/spritesheet/batched/batched_spritesheet.dm b/code/modules/asset_cache/spritesheet/batched/batched_spritesheet.dm index a5a636327f5..23c116536af 100644 --- a/code/modules/asset_cache/spritesheet/batched/batched_spritesheet.dm +++ b/code/modules/asset_cache/spritesheet/batched/batched_spritesheet.dm @@ -46,6 +46,7 @@ var/cache_dmi_hashes_json = null /// Used to prevent async cache refresh jobs from looping on failure. var/cache_result = null + var/getting_genned = FALSE /datum/asset/spritesheet_batched/proc/should_load_immediately() #ifdef DO_NOT_DEFER_ASSETS @@ -168,6 +169,9 @@ if(!length(entries)) CRASH("Spritesheet [name] ([type]) is empty! What are you doing?") + if(getting_genned) + stack_trace("Spritesheet batching has been called twice. This is illegal!") + if(isnull(entries_json)) entries_json = json_encode(entries) @@ -189,8 +193,12 @@ var/data_out if(yield || !isnull(job_id)) if(isnull(job_id)) + getting_genned = TRUE + SSasset_loading.assets_generating++ job_id = rustg_iconforge_generate_async("data/spritesheets/", name, entries_json, do_cache, FALSE, TRUE) UNTIL((data_out = rustg_iconforge_check(job_id)) != RUSTG_JOB_NO_RESULTS_YET) + getting_genned = FALSE + SSasset_loading.assets_generating-- else data_out = rustg_iconforge_generate("data/spritesheets/", name, entries_json, do_cache, FALSE, TRUE) if (data_out == RUSTG_JOB_ERROR) @@ -232,7 +240,7 @@ CRASH("Error during spritesheet generation for [name]: [data["error"]]") /datum/asset/spritesheet_batched/queued_generation() - realize_spritesheets(yield = TRUE) + INVOKE_ASYNC(src, PROC_REF(realize_spritesheets), TRUE) // The proc is called inside a subsystem and waits with an UNTIL /datum/asset/spritesheet_batched/ensure_ready() if(!fully_generated)