Я делаю Voxel Engine на Java. У меня работает система чанков, но я обеспокоен тем, что загружаю чанки не самым эффективным способом.
Мои фрагменты хранятся внутри хэш-карты, например:
Map<Vector2f, Chunk> chunkList = new HashMap<Vector2f, Chunk>(); // Create an array for the chunks
Таким образом, у меня есть 2D-массив фрагментов, и я могу получить к ним доступ следующим образом:
chunkList.get(new Vector2f(0, 0));
Вот как я загружаю все куски вокруг игрока:
public void updateChunks( Vector3f cameraPosition ) { // Update all the chunks
Thread chunkThread = new Thread() {
public void run() {
int playerChunkX = (int) Math.floor(cameraPosition.x / ( Chunk.CHUNK_SIZE * BlockVertices.BLOCK_SIZE )); // Get the current chunk that the player is in on the X - Axis
int playerChunkZ = (int) Math.floor(cameraPosition.z / ( Chunk.CHUNK_SIZE * BlockVertices.BLOCK_SIZE )); // Get the current chunk that the player is in on the Z - Axis
System.out.println( playerChunkX + ", " + playerChunkZ );
for (int i = 0; i < Camera.view_distance; i++) { // X - Axis iteration
for (int j = 0; j < Camera.view_distance; j++) { // Z - Axis iteration
if( !(chunkList.containsKey( new Vector2f( playerChunkX + i, playerChunkZ ) ) )) { // If the chunk manager doesn't have a chunk at the specified location
chunkList.put(new Vector2f(playerChunkX + i, playerChunkZ), new Chunk(perlin, playerChunkX + i, playerChunkZ)); // Create a new chunk
chunkList.get(new Vector2f(playerChunkX + i, playerChunkZ)).load(); // Load the new chunk
}
if (!(chunkList.containsKey(new Vector2f(playerChunkX + i, playerChunkZ + j)))) { // If the chunk manager doesn't have a chunk at the specified location
chunkList.put(new Vector2f(playerChunkX + i, playerChunkZ + j), new Chunk(perlin, playerChunkX + i, playerChunkZ + j)); // Create a new chunk
chunkList.get(new Vector2f(playerChunkX + i, playerChunkZ + j)).load(); // Load the new chunk
}
if (!(chunkList.containsKey(new Vector2f(playerChunkX + i, playerChunkZ - j)))) { // If the chunk manager doesn't have a chunk at the specified location
chunkList.put(new Vector2f(playerChunkX + i, playerChunkZ - j), new Chunk(perlin, playerChunkX + i, playerChunkZ - j)); // Create a new chunk
chunkList.get(new Vector2f(playerChunkX + i, playerChunkZ - j)).load(); // Load the new chunk
}
if (!(chunkList.containsKey(new Vector2f(playerChunkX - i, playerChunkZ - j)))) { // If the chunk manager doesn't have a chunk at the specified location
chunkList.put(new Vector2f(playerChunkX - i, playerChunkZ - j), new Chunk(perlin, playerChunkX - i, playerChunkZ - j)); // Create a new chunk
chunkList.get(new Vector2f(playerChunkX - i, playerChunkZ - j)).load(); // Load the new chunk
}
if (!(chunkList.containsKey(new Vector2f(playerChunkX - i, playerChunkZ + j)))) { // If the chunk manager doesn't have a chunk at the specified location
chunkList.put(new Vector2f(playerChunkX - i, playerChunkZ + j), new Chunk(perlin, playerChunkX - i, playerChunkZ + j)); // Create a new chunk
chunkList.get(new Vector2f(playerChunkX - i, playerChunkZ + j)).load(); // Load the new chunk
}
}
}
}
};
chunkThread.run();
}
Как видите, я использую для этого отдельный поток для лучшей производительности. Есть ли лучший способ сделать это? Если да, то как наиболее эффективно загружать фрагменты вокруг проигрывателя?