3
0

ChunkManager implementation

ChunkManager optimize chunks handling in small and big worlds

Small worlds gets benefits with using int-object map instead long-object (in area -32768...32767 by x and z)

Large worlds gets benefits by using efficient map by Colt project, which a little (3-6%) slower in writing, but greatly faster
(400-500% from Java's HashMap and 150-180% from Trove's maps) on reading.
This commit is contained in:
Sergey Shatunov
2016-02-10 19:17:47 +07:00
parent 6f447f2804
commit 5aaf6c5cbf
12 changed files with 202 additions and 111 deletions

View File

@ -1,36 +1,37 @@
package kcauldron.wrapper;
import gnu.trove.map.TLongObjectMap;
import kcauldron.ChunkManager;
import net.minecraft.util.LongHashMap;
import net.minecraft.world.chunk.Chunk;
import org.bukkit.craftbukkit.util.LongHash;
public class VanillaChunkHashMap extends LongHashMap {
private ChunkManager manager;
public class VanillaChunkHashMap extends LongHashMapTrove<Chunk> {
public VanillaChunkHashMap(TLongObjectMap<Chunk> map) {
super(map);
public VanillaChunkHashMap(ChunkManager manager) {
this.manager = manager;
}
private static long V2B(long key) {
return LongHash.toLong((int) (key & 0xFFFFFFFFL), (int) (key >>> 32));
}
@Override
public void add(long key, Object value) {
super.add(V2B(key), value);
manager.putChunk((Chunk) value);
}
@Override
public boolean containsItem(long key) {
return super.containsItem(V2B(key));
return getValueByKey(key) != null;
}
@Override
public Object getValueByKey(long key) {
return super.getValueByKey(V2B(key));
final int x = (int) (key >>> 32);
final int z = (int) (key);
return manager.getChunk(x, z);
}
@Override
public Object remove(long key) {
return super.remove(V2B(key));
final int x = (int) (key >>> 32);
final int z = (int) (key);
return manager.remove(x, z);
}
}