fps multiplier and better gameobject lifecycle

pull/1/head
Bronwen 2023-01-02 14:48:20 -05:00
parent 51eb964d49
commit 8d3535da55
5 changed files with 35 additions and 13 deletions

View File

@ -29,14 +29,19 @@ public abstract class Game {
scene.render(); scene.render();
} }
public void update() { private static final float ns240 = 1_000_000_000f / 240f;
scene.update(0); protected float dTime = 0;
public void update() {
long nanoTime = System.nanoTime(); long nanoTime = System.nanoTime();
float elapsed = nanoTime - lastFrame;
dTime = elapsed / ns240;
lastFrame = nanoTime;
scene.update(dTime);
// average framerate // average framerate
averageFPS = lerp(averageFPS, 1_000_000_000f / (nanoTime - lastFrame), (nanoTime - lastFrame) / 1_000_000_000f); averageFPS = lerp(averageFPS, 1_000_000_000f / (elapsed), (elapsed) / 1_000_000_000f);
lastFrame = nanoTime;
framesSinceKeyframe ++; framesSinceKeyframe ++;
if(nanoTime > lastKeyframe + 1_000_000_000) { if(nanoTime > lastKeyframe + 1_000_000_000) {

View File

@ -6,6 +6,8 @@ import java.util.List;
public class GameObject implements IRenderable, ITickable, Serializable { public class GameObject implements IRenderable, ITickable, Serializable {
private transient SceneGraph scene; private transient SceneGraph scene;
private boolean created = false;
public void link(SceneGraph scene) { public void link(SceneGraph scene) {
this.scene = scene; this.scene = scene;
} }
@ -43,7 +45,21 @@ public class GameObject implements IRenderable, ITickable, Serializable {
@Override @Override
public void update(float dTime) {} public void update(float dTime) {}
public void start() {} // connect is solely for ensuring links to other objects. get() and getAll()
protected void connect() {}
// create is guaranteed to only run once for an object, even after save/load
protected void create() {}
// start is called any time the object is added to a scene
protected void start() {}
public final void addedToScene() {
connect();
if(!created) {
create();
created = true;
}
start();
}
protected void remove(GameObject obj) { protected void remove(GameObject obj) {
scene.remove(obj); scene.remove(obj);

View File

@ -112,7 +112,7 @@ public abstract class SceneGraph implements IScene {
} }
for(GameObject obj : objects) { for(GameObject obj : objects) {
obj.start(); obj.addedToScene();
} }
} }
@ -136,7 +136,7 @@ public abstract class SceneGraph implements IScene {
public void add(GameObject obj) { public void add(GameObject obj) {
newObjects.add(obj); newObjects.add(obj);
obj.link(this); obj.link(this);
obj.start(); obj.addedToScene();
} }
public void remove(GameObject obj) { public void remove(GameObject obj) {
@ -207,7 +207,7 @@ public abstract class SceneGraph implements IScene {
objects.addAll(newObjects); objects.addAll(newObjects);
for(GameObject obj : objects) obj.link(this); for(GameObject obj : objects) obj.link(this);
for(GameObject obj : objects) obj.start(); for(GameObject obj : objects) obj.addedToScene();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -44,14 +44,15 @@ public class HadeanGame extends Game {
long allocated = runtime.totalMemory(); long allocated = runtime.totalMemory();
long max = runtime.maxMemory(); long max = runtime.maxMemory();
int left = 800; int left = 780;
int top = 10; int top = 10;
List<String> strings = new ArrayList<String>(); List<String> strings = new ArrayList<String>();
strings.add("DEBUG"); strings.add("=== [ DEBUG ] ===");
strings.add("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED"); strings.add("FPS: " + Math.round(averageFPS) + "/" + measuredFPS + " | AVG/MEASURED");
strings.add("Mouse: <" + App.mouseX + ", " + App.mouseY + ">"); strings.add("Mouse: <" + App.mouseX + ", " + App.mouseY + ">");
strings.add("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)"); strings.add("MEMORY: " + (int)((allocated / (double)max) * 100) + "% (" + (allocated / (1024 * 1024)) + "/" + (max / (1024 * 1024)) + "MB)");
strings.add("dTime: " + dTime);
for(String str : strings) { for(String str : strings) {
Assets.flat.pushColor(Vector4f.black); Assets.flat.pushColor(Vector4f.black);

View File

@ -51,7 +51,7 @@ public abstract class Agent extends WorldObject implements ISelectable {
@Override @Override
public void start() { public void start() {
super.start(); super.start();
frameCounter = speed; frameCounter = 0;
pathfinder = new AStarPathfinder(terrain); pathfinder = new AStarPathfinder(terrain);
} }