Memory footprint: Claims Lookup

Eliminated unwanted chunk loads from claim lookups and boot process.
Also a slight perf improvement for claim lookup.
This commit is contained in:
ryanhamshire 2014-10-09 15:07:11 -07:00
parent 549ae3441f
commit 3ffb02e51e
2 changed files with 35 additions and 12 deletions

View File

@ -841,4 +841,25 @@ public class Claim
return chunks;
}
public ArrayList<String> getChunkStrings()
{
ArrayList<String> chunkStrings = new ArrayList<String>();
World world = this.getLesserBoundaryCorner().getWorld();
int smallX = this.getLesserBoundaryCorner().getBlockX() >> 4;
int smallZ = this.getLesserBoundaryCorner().getBlockZ() >> 4;
int largeX = this.getGreaterBoundaryCorner().getBlockX() >> 4;
int largeZ = this.getGreaterBoundaryCorner().getBlockZ() >> 4;
for(int x = smallX; x <= largeX; x++)
{
for(int z = smallZ; z <= largeZ; z++)
{
StringBuilder builder = new StringBuilder(String.valueOf(x)).append(world.getName()).append(z);
chunkStrings.add(builder.toString());
}
}
return chunkStrings;
}
}

View File

@ -214,15 +214,14 @@ public abstract class DataStore
//add it and mark it as added
this.claims.add(newClaim);
ArrayList<Chunk> chunks = newClaim.getChunks();
for(Chunk chunk : chunks)
ArrayList<String> chunkStrings = newClaim.getChunkStrings();
for(String chunkString : chunkStrings)
{
String chunkID = this.getChunkString(chunk);
ArrayList<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkID);
ArrayList<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkString);
if(claimsInChunk == null)
{
claimsInChunk = new ArrayList<Claim>();
this.chunksToClaimsMap.put(chunkID, claimsInChunk);
this.chunksToClaimsMap.put(chunkString, claimsInChunk);
}
claimsInChunk.add(newClaim);
@ -377,11 +376,10 @@ public abstract class DataStore
break;
}
ArrayList<Chunk> chunks = claim.getChunks();
for(Chunk chunk : chunks)
ArrayList<String> chunkStrings = claim.getChunkStrings();
for(String chunkString : chunkStrings)
{
String chunkID = this.getChunkString(chunk);
ArrayList<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkID);
ArrayList<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkString);
for(int j = 0; j < claimsInChunk.size(); j++)
{
if(claimsInChunk.get(j).id.equals(claim.id))
@ -423,7 +421,7 @@ public abstract class DataStore
if(cachedClaim != null && cachedClaim.inDataStore && cachedClaim.contains(location, ignoreHeight, true)) return cachedClaim;
//find a top level claim
String chunkID = this.getChunkString(location.getChunk());
String chunkID = this.getChunkString(location);
ArrayList<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkID);
if(claimsInChunk == null) return null;
@ -448,9 +446,13 @@ public abstract class DataStore
}
//gets a unique, persistent identifier string for a chunk
private String getChunkString(Chunk chunk)
private String getChunkString(Location location)
{
StringBuilder builder = new StringBuilder(chunk.getWorld().getName()).append(chunk.getX()).append(chunk.getZ());
StringBuilder builder = new StringBuilder(
String.valueOf(location.getBlockX() >> 4))
.append(location.getWorld().getName())
.append(location.getBlockZ() >> 4);
return builder.toString();
}