Async logic framework, box2D dependencies

This commit is contained in:
Anuken
2020-04-30 20:03:11 -04:00
parent 626a06ca00
commit 8de0ca7d6e
8 changed files with 101 additions and 1 deletions

View File

@ -167,6 +167,7 @@ project(":desktop"){
dependencies{ dependencies{
compile project(":core") compile project(":core")
compile arcModule("natives:natives-box2d-desktop")
compile arcModule("natives:natives-desktop") compile arcModule("natives:natives-desktop")
compile arcModule("natives:natives-freetype-desktop") compile arcModule("natives:natives-freetype-desktop")
@ -248,6 +249,7 @@ project(":core"){
compile "org.lz4:lz4-java:1.4.1" compile "org.lz4:lz4-java:1.4.1"
compile arcModule("arc-core") compile arcModule("arc-core")
compile arcModule("extensions:freetype") compile arcModule("extensions:freetype")
compile arcModule("extensions:box2d")
compile arcModule("extensions:g3d") compile arcModule("extensions:g3d")
compile arcModule("extensions:fx") compile arcModule("extensions:fx")
compile arcModule("extensions:arcnet") compile arcModule("extensions:arcnet")

View File

@ -132,7 +132,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight()))))); app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight())))));
} }
}else{ }else{
asyncLogic.begin();
super.update(); super.update();
asyncLogic.end();
} }
int targetfps = Core.settings.getInt("fpscap", 120); int targetfps = Core.settings.getInt("fpscap", 120);

View File

@ -11,6 +11,7 @@ import arc.util.*;
import arc.util.Log.*; import arc.util.Log.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.async.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.game.*; import mindustry.game.*;
@ -167,6 +168,7 @@ public class Vars implements Loadable{
public static Mods mods; public static Mods mods;
public static Schematics schematics = new Schematics(); public static Schematics schematics = new Schematics();
public static BeControl becontrol; public static BeControl becontrol;
public static AsyncLogic asyncLogic;
public static Universe universe; public static Universe universe;
public static World world; public static World world;
@ -234,6 +236,7 @@ public class Vars implements Loadable{
world = new World(); world = new World();
universe = new Universe(); universe = new Universe();
becontrol = new BeControl(); becontrol = new BeControl();
asyncLogic = new AsyncLogic();
maps = new Maps(); maps = new Maps();
spawner = new WaveSpawner(); spawner = new WaveSpawner();

View File

@ -0,0 +1,55 @@
package mindustry.async;
import arc.struct.*;
import java.util.concurrent.*;
public class AsyncLogic{
//all processes to be executed each frame
private Array<AsyncProcess> processes = Array.with(new PhysicsProcess());
//futures to be awaited
private Array<Future<?>> futures = new Array<>();
private ExecutorService executor = Executors.newFixedThreadPool(processes.size, r -> {
Thread thread = new Thread(r, "AsyncExecutor-Thread");
thread.setDaemon(true);
thread.setUncaughtExceptionHandler((t, e) -> {
e.printStackTrace();
//TODO crash!
});
return thread;
});
public void begin(){
//sync begin
for(AsyncProcess p : processes){
p.begin();
}
futures.clear();
//submit all tasks
for(AsyncProcess p : processes){
futures.add(executor.submit(p::process));
}
}
public void end(){
//wait for all threads to stop processing
for(Future future : futures){
try{
future.get();
}catch(Throwable t){
throw new RuntimeException(t);
}
}
futures.clear();
//sync end (flush data)
for(AsyncProcess p : processes){
p.end();
}
}
}

View File

@ -0,0 +1,13 @@
package mindustry.async;
public interface AsyncProcess{
/** Synchronous. Called at the beginning of the main loop. */
void begin();
/** Async. Called in a separate thread. */
void process();
/** Sync. Called in the end of the main loop. */
void end();
}

View File

@ -0,0 +1,19 @@
package mindustry.async;
public class PhysicsProcess implements AsyncProcess{
@Override
public void begin(){
}
@Override
public void process(){
}
@Override
public void end(){
}
}

View File

@ -1,3 +1,3 @@
org.gradle.daemon=true org.gradle.daemon=true
org.gradle.jvmargs=-Xms256m -Xmx1024m org.gradle.jvmargs=-Xms256m -Xmx1024m
archash=2d1ea50ebc73ce8d87b275727efb785fd3e95b84 archash=7ef1821dfd7725c97d0dbcc6a6da5c96b1fbb4b2

View File

@ -37,6 +37,7 @@ if(!hasProperty("release")){
':Arc:extensions:recorder', ':Arc:extensions:recorder',
':Arc:extensions:arcnet', ':Arc:extensions:arcnet',
':Arc:extensions:packer', ':Arc:extensions:packer',
':Arc:extensions:box2d',
':Arc:extensions:g3d', ':Arc:extensions:g3d',
':Arc:extensions:fx', ':Arc:extensions:fx',
':Arc:natives', ':Arc:natives',
@ -46,6 +47,9 @@ if(!hasProperty("release")){
':Arc:natives:natives-freetype-desktop', ':Arc:natives:natives-freetype-desktop',
':Arc:natives:natives-freetype-android', ':Arc:natives:natives-freetype-android',
':Arc:natives:natives-freetype-ios', ':Arc:natives:natives-freetype-ios',
':Arc:natives:natives-box2d-desktop',
':Arc:natives:natives-box2d-android',
//':Arc:natives:natives-box2d-ios', TODO
':Arc:backends', ':Arc:backends',
':Arc:backends:backend-sdl', ':Arc:backends:backend-sdl',
':Arc:backends:backend-android', ':Arc:backends:backend-android',