- Made the desktop port and the mobile port of the game use different threads when processing multiple achievements (otherwise the game tends to freeze).

This commit is contained in:
Agetian
2016-12-23 07:13:07 +00:00
parent 8049783598
commit 9d0e8b8096
4 changed files with 31 additions and 10 deletions

View File

@@ -58,6 +58,11 @@ public class GuiDesktop implements IGuiBase {
return true;
}
@Override
public boolean isLibgdxPort() {
return false;
}
@Override
public String getCurrentVersion() {
return BuildInfo.getVersionString();

View File

@@ -55,6 +55,11 @@ public class GuiMobile implements IGuiBase {
return Gdx.app.getType() == ApplicationType.Desktop;
}
@Override
public boolean isLibgdxPort() {
return true;
}
@Override
public String getCurrentVersion() {
return Forge.CURRENT_VERSION;

View File

@@ -1,5 +1,6 @@
package forge.achievement;
import forge.GuiBase;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Iterator;
@@ -38,23 +39,32 @@ public abstract class AchievementCollection implements Iterable<Achievement> {
//don't update achievements if player cheated during game
if (controller.hasCheated()) {
return;
}
}
final Game game = controller.getGame();
final Player player = controller.getPlayer();
//update all achievements for GUI player after game finished
ThreadUtil.invokeInGameThread(new Runnable() {
@Override
public void run() {
FModel.getAchievements(game.getRules().getGameType()).updateAll(player);
AltWinAchievements.instance.updateAll(player);
PlaneswalkerAchievements.instance.updateAll(player);
ChallengeAchievements.instance.updateAll(player);
}
});
//(we are doing it in different threads in different game ports to prevent freezing when processing multiple achievements)
if (GuiBase.getInterface().isLibgdxPort()) {
ThreadUtil.invokeInGameThread(new Runnable() {
@Override
public void run() {
doUpdateAllAchievements(game, player);
}
});
} else {
doUpdateAllAchievements(game, player);
}
}
private static void doUpdateAllAchievements(final Game game, final Player player) {
FModel.getAchievements(game.getRules().getGameType()).updateAll(player);
AltWinAchievements.instance.updateAll(player);
PlaneswalkerAchievements.instance.updateAll(player);
ChallengeAchievements.instance.updateAll(player);
}
public static void buildComboBox(IComboBox<AchievementCollection> cb) {
cb.addItem(FModel.getAchievements(GameType.Constructed));
cb.addItem(FModel.getAchievements(GameType.Draft));

View File

@@ -19,6 +19,7 @@ import forge.util.Callback;
public interface IGuiBase {
boolean isRunningOnDesktop();
boolean isLibgdxPort();
String getCurrentVersion();
String getAssetsDir();
void invokeInEdtNow(Runnable runnable);