From 412539b4f0ec24a15f58efda50e62494022a327f Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 3 Nov 2023 13:16:11 -0400 Subject: [PATCH] v2.3.0: changed up game sample loading to occur on main thread --- .../java/com/watabou/noosa/audio/Sample.java | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java b/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java index c7d46698b..d534c2772 100644 --- a/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java +++ b/SPD-classes/src/main/java/com/watabou/noosa/audio/Sample.java @@ -24,10 +24,11 @@ package com.watabou.noosa.audio; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.watabou.noosa.Game; +import com.watabou.utils.Callback; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; public enum Sample { @@ -61,37 +62,44 @@ public enum Sample { } } + private static LinkedList loadingQueue = new LinkedList<>(); + public synchronized void load( final String... assets ) { - final ArrayList toLoad = new ArrayList<>(); - for (String asset : assets){ - if (!ids.containsKey(asset)){ - toLoad.add(asset); + if (!ids.containsKey(asset) && !loadingQueue.contains(asset)){ + loadingQueue.add(asset); } } - //don't make a new thread of all assets are already loaded - if (toLoad.isEmpty()) return; + //cancel if all assets are already loaded + if (loadingQueue.isEmpty()) return; - //load in a separate thread to prevent this blocking the UI - new Thread(){ - @Override - public void run() { - for (String asset : toLoad) { + //load one at a time on the UI thread to prevent this blocking the UI + //yes this may cause hitching, but only in the first couple seconds of game runtime + Game.runOnRenderThread(loadingCallback); + + } + + private Callback loadingCallback = new Callback() { + @Override + public void call() { + synchronized (INSTANCE) { + String asset = loadingQueue.poll(); + if (asset != null) { try { Sound newSound = Gdx.audio.newSound(Gdx.files.internal(asset)); - synchronized (INSTANCE) { - ids.put(asset, newSound); - } + ids.put(asset, newSound); } catch (Exception e){ Game.reportException(e); } } + if (!loadingQueue.isEmpty()){ + Game.runOnRenderThread(this); + } } - }.start(); - - } + } + }; public synchronized void unload( Object src ) { if (ids.containsKey( src )) {