Skip to content

Commit 0eafad5

Browse files
committed
up
1 parent 31fa64e commit 0eafad5

File tree

6 files changed

+54
-141
lines changed

6 files changed

+54
-141
lines changed

src/comcrafthd/ChunkList.java

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
*/
66
package comcrafthd;
77

8+
import comcrafthd.client.ChunkRendererThread;
89
import comcrafthd.client.ComcraftPrefs;
9-
import comcrafthd.client.ComcraftRenderer;
1010
import java.util.Enumeration;
1111
import java.util.Hashtable;
1212

@@ -28,7 +28,7 @@ private int getInitialSize() {
2828
return (int) (ComcraftPrefs.instance.chunkRenderDistance * ComcraftPrefs.instance.chunkRenderDistance * 3.2f) + 1;
2929
}
3030

31-
public void triggerRenderClosestChunk(final ComcraftRenderer renderer, int blockX, int blockZ) {
31+
public Chunk getClosestNotRenderedChunk(int blockX, int blockZ) {
3232
final short originChunkX = (short) (blockX >> Chunk.BLOCK_TO_CHUNK_SHIFT);
3333
final short originChunkZ = (short) (blockZ >> Chunk.BLOCK_TO_CHUNK_SHIFT);
3434

@@ -38,14 +38,12 @@ public void triggerRenderClosestChunk(final ComcraftRenderer renderer, int block
3838
for (final Enumeration e = chunks.elements(); e.hasMoreElements();) {
3939
final Chunk chunk = (Chunk) e.nextElement();
4040

41-
if (!areNeighboursLoaded(chunk.chunkX, chunk.chunkZ)) {
41+
if (chunk.renderCache.done) {
4242
continue;
4343
}
4444

45-
synchronized (chunk.renderCache) {
46-
if (chunk.renderCache.done || chunk.renderCache.isCacheBeingGenerated) {
47-
continue;
48-
}
45+
if (!areNeighboursLoaded(chunk.chunkX, chunk.chunkZ)) {
46+
continue;
4947
}
5048

5149
final int x = chunk.chunkX - originChunkX;
@@ -59,9 +57,7 @@ public void triggerRenderClosestChunk(final ComcraftRenderer renderer, int block
5957
}
6058
}
6159

62-
if (closest != null) {
63-
renderer.renderChunkListCallback(closest);
64-
}
60+
return closest;
6561
}
6662

6763
public void loadAround(int blockX, int blockZ, int chunkRadius) {
@@ -81,7 +77,7 @@ public void loadAround(int blockX, int blockZ, int chunkRadius) {
8177
}
8278
}
8379

84-
public void dropAround(int blockX, int blockZ, int chunkRadius) {
80+
public void dropAround(int blockX, int blockZ, int chunkRadius, final ChunkRendererThread listener) {
8581
final short originChunkX = (short) (blockX >> Chunk.BLOCK_TO_CHUNK_SHIFT);
8682
final short originChunkZ = (short) (blockZ >> Chunk.BLOCK_TO_CHUNK_SHIFT);
8783

@@ -94,21 +90,11 @@ public void dropAround(int blockX, int blockZ, int chunkRadius) {
9490
final int z = chunk.chunkZ - originChunkZ;
9591

9692
if (x * x + z * z > chunkRadiusSqr) {
97-
dropChunk(chunk);
98-
}
99-
}
100-
}
93+
chunks.remove(getChunkKey(chunk.chunkX, chunk.chunkZ));
10194

102-
public void dropChunk(final Chunk chunk) {
103-
synchronized (chunk.renderCache) {
104-
if (chunk.renderCache.isCacheBeingGenerated) {
105-
return;
95+
listener.dropChunkCallback(chunk);
10696
}
10797
}
108-
109-
chunks.remove(getChunkKey(chunk.chunkX, chunk.chunkZ));
110-
111-
ComcraftGame.instance.renderer.dropChunkListCallback(chunk);
11298
}
11399

114100
public void loadChunk(int chunkX, int chunkZ) {
@@ -138,7 +124,7 @@ public Chunk getChunk(int chunkX, int chunkZ) {
138124
private void addChunk(int chunkX, int chunkZ, Chunk chunk) {
139125
chunks.put(getChunkKey(chunkX, chunkZ), chunk);
140126
}
141-
127+
142128
public boolean areNeighboursLoaded(int chunkX, int chunkZ) {
143129
if (!chunkExists(chunkX - 1, chunkZ)) {
144130
return false;

src/comcrafthd/ComcraftGame.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ public void initialize() {
5555
blockList.initialize();
5656
renderer.initialize();
5757

58-
updateVisibleChunks();
59-
6058
System.gc();
6159

6260
Log.info(this, "initialize() finished");
@@ -69,19 +67,9 @@ public void stop() {
6967
public void tick() {
7068
cameraMovement.tick();
7169

72-
updateVisibleChunks();
73-
7470
renderer.render();
7571
}
7672

77-
private void updateVisibleChunks() {
78-
final int centerBlockX = MathHelper.roundToInt(cameraMovement.positionX);
79-
final int centerBlockZ = MathHelper.roundToInt(cameraMovement.positionZ);
80-
81-
chunkList.dropAround(centerBlockX, centerBlockZ, ComcraftPrefs.instance.chunkRenderDistance);
82-
chunkList.loadAround(centerBlockX, centerBlockZ, ComcraftPrefs.instance.chunkRenderDistance);
83-
}
84-
8573
public void clear() {
8674
instance = null;
8775
}

src/comcrafthd/client/CameraMovement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*/
1515
public final class CameraMovement {
1616

17-
public void tick() {
17+
public synchronized void tick() {
1818
final KeyboardMapping mapping = ComcraftGame.instance.keyboardMapping;
1919
final Keyboard keyboard = Keyboard.instance;
2020

src/comcrafthd/client/ChunkRenderCache.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public final class ChunkRenderCache {
1616
public boolean done = false;
1717
public Node node;
1818

19-
public boolean isCacheBeingGenerated = false;
20-
2119
public void clear() {
2220
done = false;
2321
node = null;

src/comcrafthd/client/ChunkRendererThread.java

Lines changed: 38 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,25 @@
66
package comcrafthd.client;
77

88
import comcrafthd.Chunk;
9+
import comcrafthd.ChunkList;
910
import comcrafthd.ComcraftGame;
1011
import comcrafthd.Log;
12+
import comcrafthd.MathHelper;
1113

1214
/**
1315
*
1416
* @author quead
1517
*/
1618
public final class ChunkRendererThread implements Runnable {
1719

20+
private final ComcraftRenderer renderer;
1821
private final ChunkRenderer chunkRenderer;
1922

20-
private Thread thread;
2123
private boolean stopped = false;
24+
private Thread thread;
2225

23-
private Chunk nextChunk;
24-
public boolean hasVaccancy = false;
25-
26-
public ChunkRendererThread(ChunkRenderer chunkRenderer) {
26+
public ChunkRendererThread(final ComcraftRenderer renderer, ChunkRenderer chunkRenderer) {
27+
this.renderer = renderer;
2728
this.chunkRenderer = chunkRenderer;
2829
}
2930

@@ -36,99 +37,65 @@ public void start() {
3637

3738
public synchronized void stop() {
3839
stopped = true;
39-
notify();
40-
}
41-
42-
public synchronized void enqueue(final Chunk chunk) {
43-
if (nextChunk == null) {
44-
45-
synchronized (chunk.renderCache) {
46-
if (chunk.renderCache.isCacheBeingGenerated) {
47-
return;
48-
}
49-
chunk.renderCache.isCacheBeingGenerated = true;
50-
}
5140

52-
nextChunk = chunk;
53-
hasVaccancy = false;
41+
notify();
5442

55-
notify();
43+
try {
44+
thread.join();
45+
} catch (InterruptedException ex) {
46+
ex.printStackTrace();
5647
}
5748
}
5849

59-
private int oomCntr = 0;
60-
61-
private void runImpl() {
62-
Log.info(this, "runImpl() entered");
63-
64-
while (true) {
65-
Chunk chunk;
66-
67-
synchronized (this) {
68-
if (stopped) {
69-
break;
70-
}
71-
72-
hasVaccancy = true;
50+
private void tick() {
51+
final ChunkList chunkList = ComcraftGame.instance.chunkList;
52+
final CameraMovement cameraMovement = ComcraftGame.instance.cameraMovement;
7353

74-
if (nextChunk == null) {
75-
try {
76-
wait();
77-
} catch (InterruptedException ex) {
78-
ex.printStackTrace();
79-
}
80-
}
81-
82-
chunk = nextChunk;
83-
nextChunk = null;
84-
}
54+
final int centerBlockX = MathHelper.roundToInt(cameraMovement.positionX);
55+
final int centerBlockZ = MathHelper.roundToInt(cameraMovement.positionZ);
8556

86-
if (chunk != null) {
87-
if (chunk.renderCache.done) {
88-
throw new IllegalStateException("ChunkRendererThread chunk.renderCache.done == true");
89-
}
57+
chunkList.dropAround(centerBlockX, centerBlockZ, ComcraftPrefs.instance.chunkRenderDistance, this);
58+
chunkList.loadAround(centerBlockX, centerBlockZ, ComcraftPrefs.instance.chunkRenderDistance);
9059

91-
processChunk(chunk);
92-
}
93-
94-
oomCntr = 0;
60+
final Chunk toRender = chunkList.getClosestNotRenderedChunk(centerBlockX, centerBlockZ);
61+
if (toRender != null) {
62+
chunkRenderer.renderChunkCache(toRender);
9563

96-
Thread.yield();
64+
renderer.threadCallbackAddChunk(toRender);
9765
}
98-
99-
Log.info(this, "runImpl() finished");
66+
}
67+
68+
public void dropChunkCallback(final Chunk chunk) {
69+
renderer.threadCallbackRemoveChunk(chunk);
70+
71+
chunk.renderCache.done = false;
72+
chunk.renderCache.node = null;
10073
}
10174

10275
public void run() {
10376
Log.info(this, "run() entered");
10477

78+
int oomCntr = 0;
79+
10580
while (!stopped) {
10681
try {
107-
runImpl();
82+
tick();
83+
84+
oomCntr = 0;
85+
86+
Thread.yield();
10887
} catch (OutOfMemoryError oom) {
10988
if (++oomCntr > 3) {
11089
throw oom;
11190
}
112-
91+
11392
oom.printStackTrace();
114-
93+
11594
ComcraftGame.instance.tidyUpMemory();
11695
}
11796
}
11897

11998
Log.info(this, "run() finished");
12099
}
121100

122-
private void processChunk(final Chunk chunk) {
123-
try {
124-
chunkRenderer.renderChunkCache(chunk);
125-
126-
ComcraftGame.instance.renderer.chunkRendererThreadCallback(chunk);
127-
} finally {
128-
synchronized (chunk.renderCache) {
129-
chunk.renderCache.isCacheBeingGenerated = false;
130-
}
131-
}
132-
}
133-
134101
}

src/comcrafthd/client/ComcraftRenderer.java

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public ComcraftRenderer() {
4747
g3d = Graphics3D.getInstance();
4848

4949
chunkRenderer = new ChunkRenderer();
50-
chunkRendererThread = new ChunkRendererThread(chunkRenderer);
50+
chunkRendererThread = new ChunkRendererThread(this, chunkRenderer);
5151

5252
initializeWorld();
5353
}
@@ -60,9 +60,7 @@ public void stop() {
6060
chunkRendererThread.stop();
6161
}
6262

63-
public void render() {
64-
renderChunksCache();
65-
63+
public synchronized void render() {
6664
int hints = Graphics3D.OVERWRITE;
6765

6866
g3d.bindTarget(graphics, true, hints);
@@ -73,37 +71,13 @@ public void render() {
7371
comcraftCanvas.flushGraphics();
7472
}
7573

76-
private void renderChunksCache() {
77-
if (chunkRendererThread.hasVaccancy) {
78-
final CameraMovement cameraMovement = ComcraftGame.instance.cameraMovement;
79-
80-
final int centerBlockX = MathHelper.roundToInt(cameraMovement.positionX);
81-
final int centerBlockZ = MathHelper.roundToInt(cameraMovement.positionZ);
82-
83-
ComcraftGame.instance.chunkList.triggerRenderClosestChunk(this, centerBlockX, centerBlockZ);
84-
}
85-
}
86-
87-
public synchronized void chunkRendererThreadCallback(final Chunk chunk) {
74+
public synchronized void threadCallbackAddChunk(final Chunk chunk) {
8875
world.addChild(chunk.renderCache.node);
8976
}
90-
91-
public void renderChunkListCallback(final Chunk chunk) {
92-
clearChunkRenderCache(chunk);
93-
94-
if (chunkRendererThread.hasVaccancy) {
95-
chunkRendererThread.enqueue(chunk);
96-
}
97-
}
98-
99-
public void dropChunkListCallback(final Chunk chunk) {
100-
clearChunkRenderCache(chunk);
101-
}
102-
103-
private void clearChunkRenderCache(final Chunk chunk) {
77+
78+
public synchronized void threadCallbackRemoveChunk(final Chunk chunk) {
10479
if (chunk.renderCache.node != null) {
10580
world.removeChild(chunk.renderCache.node);
106-
chunk.renderCache.clear();
10781
}
10882
}
10983

0 commit comments

Comments
 (0)