Synchronized lists that are rendered
Removed lock from Scene
This commit is contained in:
parent
def72f84b2
commit
7cf0868730
Binary file not shown.
@ -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);
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user