Synchronized lists that are rendered

Removed lock from Scene
This commit is contained in:
= 2016-11-16 10:15:25 +01:00
parent def72f84b2
commit 7cf0868730
9 changed files with 204 additions and 67 deletions

View File

@ -0,0 +1,147 @@
package com.example.julian.endlessroll.data;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Created by Julian on 16.11.2016.
*/
public class SynchronizedArrayList<E> extends ArrayList<E> {
@Override
public synchronized String toString() {
return super.toString();
}
@Override
public synchronized boolean add(E object) {
return super.add(object);
}
@Override
public synchronized void add(int index, E object) {
super.add(index, object);
}
@Override
public synchronized boolean addAll(Collection<? extends E> collection) {
return super.addAll(collection);
}
@Override
public synchronized boolean addAll(int index, Collection<? extends E> collection) {
return super.addAll(index, collection);
}
@Override
public synchronized void clear() {
super.clear();
}
@Override
public synchronized Object clone() {
return super.clone();
}
@Override
public synchronized void ensureCapacity(int minimumCapacity) {
super.ensureCapacity(minimumCapacity);
}
@Override
public synchronized E get(int index) {
return super.get(index);
}
@Override
public synchronized int size() {
return super.size();
}
@Override
public synchronized boolean isEmpty() {
return super.isEmpty();
}
@Override
public synchronized boolean contains(Object object) {
return super.contains(object);
}
@Override
public synchronized int indexOf(Object object) {
return super.indexOf(object);
}
@Override
public synchronized int lastIndexOf(Object object) {
return super.lastIndexOf(object);
}
@Override
public synchronized E remove(int index) {
return super.remove(index);
}
@Override
public synchronized boolean remove(Object object) {
return super.remove(object);
}
@Override
protected synchronized void removeRange(int fromIndex, int toIndex) {
super.removeRange(fromIndex, toIndex);
}
@Override
public synchronized E set(int index, E object) {
return super.set(index, object);
}
@Override
public synchronized Object[] toArray() {
return super.toArray();
}
@Override
public synchronized <T> T[] toArray(T[] contents) {
return super.toArray(contents);
}
@Override
public synchronized void trimToSize() {
super.trimToSize();
}
@Override
public synchronized int hashCode() {
return super.hashCode();
}
@Override
public synchronized boolean equals(Object o) {
return super.equals(o);
}
@Override
public synchronized List<E> subList(int start, int end) {
return super.subList(start, end);
}
@Override
public synchronized boolean containsAll(Collection<?> collection) {
return super.containsAll(collection);
}
@Override
public synchronized boolean removeAll(Collection<?> collection) {
return super.removeAll(collection);
}
@Override
public synchronized boolean retainAll(Collection<?> collection) {
return super.retainAll(collection);
}
}

View File

@ -1,14 +1,13 @@
package com.example.julian.endlessroll.entities; package com.example.julian.endlessroll.entities;
import com.example.julian.endlessroll.data.SynchronizedArrayList;
import com.example.julian.endlessroll.data.Vector; import com.example.julian.endlessroll.data.Vector;
import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.entities.textures.Texture;
import java.util.ArrayList;
/** /**
* Created by Julian on 20.07.2016. * Created by Julian on 20.07.2016.
*/ */
public class Background extends ArrayList<Entity> { public class Background extends SynchronizedArrayList<Entity> {
private final float PART_WIDTH = 5; private final float PART_WIDTH = 5;
private final float HALF_PART_WIDTH = PART_WIDTH / 2; private final float HALF_PART_WIDTH = PART_WIDTH / 2;
@ -21,8 +20,10 @@ public class Background extends ArrayList<Entity> {
public void changeTexture(Texture texture) { public void changeTexture(Texture texture) {
this.texture = texture; this.texture = texture;
for (Entity entity : this) synchronized (this) {
entity.setTexture(texture); for (Entity entity : this)
entity.setTexture(texture);
}
} }
private Entity createPart(float xLeftEdge) { private Entity createPart(float xLeftEdge) {
@ -31,8 +32,10 @@ public class Background extends ArrayList<Entity> {
public void move(float x, float cameraX) { public void move(float x, float cameraX) {
Vector movement = new Vector(x, 0); Vector movement = new Vector(x, 0);
for (Entity part : this) synchronized (this) {
part.move(movement); for (Entity part : this)
part.move(movement);
}
if (!super.isEmpty()) { if (!super.isEmpty()) {
Entity last = super.get(super.size() - 1); Entity last = super.get(super.size() - 1);
if (last.getRightEdge() - cameraX < 3) { if (last.getRightEdge() - cameraX < 3) {

View File

@ -1,5 +1,6 @@
package com.example.julian.endlessroll.entities.tileLists; package com.example.julian.endlessroll.entities.tileLists;
import com.example.julian.endlessroll.data.SynchronizedArrayList;
import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.Entity;
import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.entities.textures.Texture;
import com.example.julian.endlessroll.levels.TileData; import com.example.julian.endlessroll.levels.TileData;
@ -9,7 +10,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class TileList extends ArrayList<Tile> { public class TileList extends SynchronizedArrayList<Tile> {
public enum Type { public enum Type {
TERRAIN, CEILING; TERRAIN, CEILING;

View File

@ -19,6 +19,7 @@ import com.example.julian.endlessroll.levels.worlds.World;
import com.example.julian.endlessroll.main.GameLog; import com.example.julian.endlessroll.main.GameLog;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -46,14 +47,12 @@ public class GameScene extends Scene {
public void loadLevel(Level level, World world) throws Exception { public void loadLevel(Level level, World world) throws Exception {
this.currentWorld = world; this.currentWorld = world;
reset(); reset();
lock.lock();
background.changeTexture(world.getBackground()); background.changeTexture(world.getBackground());
terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles()); terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles());
ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles()); ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles());
super.add(goal); super.add(goal);
player.init(terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed()); player.init(terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed());
super.add(player); super.add(player);
lock.unlock();
for (ObstacleData data : level.getObstacles()) for (ObstacleData data : level.getObstacles())
addObstacle(data); addObstacle(data);
for (StarData data : level.getStars()) { for (StarData data : level.getStars()) {
@ -71,9 +70,7 @@ public class GameScene extends Scene {
} }
private void reset() { private void reset() {
lock.lock();
super.clear(); super.clear();
lock.unlock();
obstacles.clear(); obstacles.clear();
tools.clear(); tools.clear();
cameraX = 0; cameraX = 0;
@ -81,7 +78,6 @@ public class GameScene extends Scene {
} }
public void onStarCollision(Star collisionStar) { public void onStarCollision(Star collisionStar) {
lock.lock();
Iterator<Star> iter = stars.iterator(); Iterator<Star> iter = stars.iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
Star star = iter.next(); Star star = iter.next();
@ -90,24 +86,18 @@ public class GameScene extends Scene {
iter.remove(); iter.remove();
} }
} }
lock.unlock();
//TODO: change lock with atomic lists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
} }
public void addObstacle(ObstacleData data) { public void addObstacle(ObstacleData data) {
Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge()); Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge());
lock.lock();
super.add(obstacle); super.add(obstacle);
obstacles.add(obstacle); obstacles.add(obstacle);
lock.unlock();
} }
public void addStar(StarData data) { public void addStar(StarData data) {
Star star = new Star(textures.star, data); Star star = new Star(textures.star, data);
lock.lock();
super.add(star); super.add(star);
stars.add(star); stars.add(star);
lock.unlock();
} }
public void addTool(ToolType type, float screenX, float screenY) throws Exception { public void addTool(ToolType type, float screenX, float screenY) throws Exception {
@ -115,10 +105,8 @@ public class GameScene extends Scene {
Tool tool = type.newInstance(position, particleSystem); Tool tool = type.newInstance(position, particleSystem);
if (tool == null) if (tool == null)
throw new Exception("Current ToolType(" + type + ") returns null at method newInstance()"); throw new Exception("Current ToolType(" + type + ") returns null at method newInstance()");
lock.lock();
super.add(tool); super.add(tool);
tools.add(tool); tools.add(tool);
lock.unlock();
} }
@ -126,7 +114,6 @@ public class GameScene extends Scene {
public void update(Timer timer) { public void update(Timer timer) {
super.update(timer); super.update(timer);
player.setSpeedByProgress(player.getProgress() / goalX); player.setSpeedByProgress(player.getProgress() / goalX);
lock.lock();
for (Tool tool : tools) { for (Tool tool : tools) {
tool.update(timer); tool.update(timer);
if (tool instanceof Bomb) { if (tool instanceof Bomb) {
@ -135,7 +122,6 @@ public class GameScene extends Scene {
bomb.explode(obstacles, collisionDetector); bomb.explode(obstacles, collisionDetector);
} }
} }
lock.unlock();
} }
@Override @Override

View File

@ -35,7 +35,6 @@ public class Physics {
} }
public void applyGravity(GameScene scene) { public void applyGravity(GameScene scene) {
scene.lock.lock();
scene.getPlayer().getMovement().y -= GRAVITY_FORCE; scene.getPlayer().getMovement().y -= GRAVITY_FORCE;
for (Tool tool : scene.getTools()) { for (Tool tool : scene.getTools()) {
if (tool.isFloating()) if (tool.isFloating())
@ -71,7 +70,6 @@ public class Physics {
tool.setToTerrain(orientingHeight); tool.setToTerrain(orientingHeight);
} }
} }
scene.lock.unlock();
} }
@Nullable @Nullable

View File

@ -1,5 +1,6 @@
package com.example.julian.endlessroll.main.game; package com.example.julian.endlessroll.main.game;
import com.example.julian.endlessroll.data.SynchronizedArrayList;
import com.example.julian.endlessroll.data.Vector; import com.example.julian.endlessroll.data.Vector;
import com.example.julian.endlessroll.entities.Background; import com.example.julian.endlessroll.entities.Background;
import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.Entity;
@ -11,16 +12,14 @@ import com.example.julian.endlessroll.entities.tileLists.Terrain;
import com.example.julian.endlessroll.levels.worlds.World; import com.example.julian.endlessroll.levels.worlds.World;
import com.example.julian.endlessroll.rendering.Lock; import com.example.julian.endlessroll.rendering.Lock;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
/** /**
* Created by Julian on 20.07.2016. * Created by Julian on 20.07.2016.
*/ */
public abstract class Scene extends ArrayList<Entity> { public abstract class Scene extends SynchronizedArrayList<Entity> {
public float cameraX; public float cameraX;
public final Lock lock;
private Vector screenSize; private Vector screenSize;
private Entity playerArrow; private Entity playerArrow;
@ -40,7 +39,6 @@ public abstract class Scene extends ArrayList<Entity> {
terrain = new Terrain(World.GRASSLANDS.getTerrain()); terrain = new Terrain(World.GRASSLANDS.getTerrain());
ceiling = new Ceiling(World.GRASSLANDS.getTerrain()); ceiling = new Ceiling(World.GRASSLANDS.getTerrain());
player = new Player(textures.player); player = new Player(textures.player);
lock = new Lock();
} }
public void setTexturePack(TexturePack texturePack) { public void setTexturePack(TexturePack texturePack) {
@ -48,20 +46,21 @@ public abstract class Scene extends ArrayList<Entity> {
} }
public void update(Timer timer) { public void update(Timer timer) {
lock.lock(); synchronized (this) {
Iterator<Entity> iterator = super.iterator(); Iterator<Entity> iterator = super.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Entity entity = iterator.next(); Entity entity = iterator.next();
Vector movement = entity.getMovement(); Vector movement = entity.getMovement();
Vector finalMovement = new Vector(movement).mul(timer.getFrameTime()); Vector finalMovement = new Vector(movement).mul(timer.getFrameTime());
entity.move(finalMovement); entity.move(finalMovement);
if (entity.isDestroyed() && entity.getDestroyEffect() != null) if (entity.isDestroyed() && entity.getDestroyEffect() != null)
entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()), new Vector(entity.getWidth(), entity.getHeight())).start(); entity.getDestroyEffect().createEffect(particleSystem, new Vector(entity.getPosition()), new Vector(entity.getWidth(), entity.getHeight())).start();
if (entity.equals(player)) if (entity.equals(player))
moveEnviroment(finalMovement.x); moveEnviroment(finalMovement.x);
else if (entity.getRightEdge() - cameraX < -3f || entity.isDestroyed()) { else if (entity.getRightEdge() - cameraX < -3f || entity.isDestroyed()) {
iterator.remove(); iterator.remove();
removeEntityFromAllLists(entity); removeEntityFromAllLists(entity);
}
} }
} }
@ -71,11 +70,10 @@ public abstract class Scene extends ArrayList<Entity> {
super.add(playerArrow); super.add(playerArrow);
} }
} else super.remove(playerArrow); } else super.remove(playerArrow);
lock.unlock();
} }
@Override @Override
public boolean remove(Object object) { public synchronized boolean remove(Object object) {
removeEntityFromAllLists((Entity) object); removeEntityFromAllLists((Entity) object);
return super.remove(object); return super.remove(object);
} }
@ -103,15 +101,15 @@ public abstract class Scene extends ArrayList<Entity> {
this.screenSize = screenSize; this.screenSize = screenSize;
} }
public Background getBackground() { public synchronized Background getBackground() {
return background; return background;
} }
public Terrain getTerrain() { public synchronized Terrain getTerrain() {
return terrain; return terrain;
} }
public Ceiling getCeiling() { public synchronized Ceiling getCeiling() {
return ceiling; return ceiling;
} }

View File

@ -104,11 +104,9 @@ public class GameRenderer implements GLSurfaceView.Renderer {
GLES20.glClearColor(1, 1, 1, 1.0f); GLES20.glClearColor(1, 1, 1, 1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
scene.lock.lock();
renderEntities(gl, scene); renderEntities(gl, scene);
renderTileList(gl, scene.getTerrain(), scene); renderTileList(gl, scene.getTerrain(), scene);
renderTileList(gl, scene.getCeiling(), scene); renderTileList(gl, scene.getCeiling(), scene);
scene.lock.unlock();
renderFbo(gl); renderFbo(gl);
} }
} }
@ -116,10 +114,14 @@ public class GameRenderer implements GLSurfaceView.Renderer {
private void renderEntities(GL10 gl, Scene scene) { private void renderEntities(GL10 gl, Scene scene) {
entityShader.start(); entityShader.start();
entityShader.loadMVPMatrix(matrixCreator, scene.cameraX); entityShader.loadMVPMatrix(matrixCreator, scene.cameraX);
for (Entity backgroundPart : scene.getBackground()) synchronized (scene.getBackground()) {
renderEntity(gl, backgroundPart); for (Entity backgroundPart : scene.getBackground())
for (Entity entity : scene) renderEntity(gl, backgroundPart);
renderEntity(gl, entity); }
synchronized (scene) {
for (Entity entity : scene)
renderEntity(gl, entity);
}
entityShader.stop(); entityShader.stop();
} }
@ -135,11 +137,13 @@ public class GameRenderer implements GLSurfaceView.Renderer {
private void renderTileList(GL10 gl, TileList tileList, Scene scene) { private void renderTileList(GL10 gl, TileList tileList, Scene scene) {
terrainShader.start(); terrainShader.start();
terrainShader.loadMVPMatrix(matrixCreator, scene.cameraX); terrainShader.loadMVPMatrix(matrixCreator, scene.cameraX);
for (Tile tile : tileList) { synchronized (tileList) {
gl.glActiveTexture(GL10.GL_TEXTURE0); for (Tile tile : tileList) {
gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId()); gl.glActiveTexture(GL10.GL_TEXTURE0);
terrainShader.loadTransformationMatrix(matrixCreator, tile); gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId());
quad.draw(); terrainShader.loadTransformationMatrix(matrixCreator, tile);
quad.draw();
}
} }
terrainShader.stop(); terrainShader.stop();
} }

View File

@ -66,14 +66,6 @@
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
@ -82,6 +74,14 @@
<sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />