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

View File

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

View File

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

View File

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

View File

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

View File

@ -104,11 +104,9 @@ public class GameRenderer implements GLSurfaceView.Renderer {
GLES20.glClearColor(1, 1, 1, 1.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
scene.lock.lock();
renderEntities(gl, scene);
renderTileList(gl, scene.getTerrain(), scene);
renderTileList(gl, scene.getCeiling(), scene);
scene.lock.unlock();
renderFbo(gl);
}
}
@ -116,10 +114,14 @@ public class GameRenderer implements GLSurfaceView.Renderer {
private void renderEntities(GL10 gl, Scene scene) {
entityShader.start();
entityShader.loadMVPMatrix(matrixCreator, scene.cameraX);
for (Entity backgroundPart : scene.getBackground())
renderEntity(gl, backgroundPart);
for (Entity entity : scene)
renderEntity(gl, entity);
synchronized (scene.getBackground()) {
for (Entity backgroundPart : scene.getBackground())
renderEntity(gl, backgroundPart);
}
synchronized (scene) {
for (Entity entity : scene)
renderEntity(gl, entity);
}
entityShader.stop();
}
@ -135,11 +137,13 @@ public class GameRenderer implements GLSurfaceView.Renderer {
private void renderTileList(GL10 gl, TileList tileList, Scene scene) {
terrainShader.start();
terrainShader.loadMVPMatrix(matrixCreator, scene.cameraX);
for (Tile tile : tileList) {
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId());
terrainShader.loadTransformationMatrix(matrixCreator, tile);
quad.draw();
synchronized (tileList) {
for (Tile tile : tileList) {
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, tile.getTexture().getId());
terrainShader.loadTransformationMatrix(matrixCreator, tile);
quad.draw();
}
}
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/rs" 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/resources" 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/rs" 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/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />