Des. Games: Otimização de camera e FPS

Estou com problema na otimização do meu mapa, quando movimento meu personagem da para perceber o mapa carregando pq aparece umas bordas pretas dele, sei que tem como melhor isso para ser mais rapido e não aparecer mas não estou conseguindo, alem de que o FPS fica abaixo de 40 desde que mudei a camera para movimentar seguindo o personagem sem mostrar a area preta externa, são somente duas imagens contendo o mapa em uma e o personagem com animação, inimigos, tiles e weapons em uma outra, se souberem como posso otimizar isso para melhorar o desempenho de carregar o mapa mais rapido e melhorar o FPS seria de muita ajuda, sou iniciante ainda.
a questão da otimização da camera esta na parte de render, ja vi algumas formas mas não consigo adaptar para o meu codigo, como o de imagem de 16x16px, que a pessoa altera para “>>4” na parte da divisão tirando o “/16” que no meu caso é “/24”, não compreendi como funcionou tal codigo, se precisar de mais informação ou outra parte do codigo é so pedir


package com.TenebrisGames.world;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.TenebrisGames.entities.Enemy;
import com.TenebrisGames.entities.Entity;
import com.TenebrisGames.entities.Lifepack;
import com.TenebrisGames.entities.Weapon;
import com.TenebrisGames.main.Game;

public class World {

private Tile[] tiles;
public static int WIDTH, HEIGHT;


public World(String path) {
	try {
		BufferedImage map = ImageIO.read(getClass().getResource(path));
		int[] pixels = new int[map.getWidth() * map.getHeight()];
		WIDTH = map.getWidth();
		HEIGHT = map.getHeight();
		tiles = new Tile[map.getWidth() * map.getHeight()];
		map.getRGB(0, 0, map.getWidth(), map.getHeight(), pixels, 0, map.getWidth());
		for(int xx = 0; xx < map.getWidth(); xx++) {
			for(int yy = 0; yy < map.getHeight(); yy++) {
				int pixelAtual = pixels[xx + (yy * map.getWidth())];
				tiles[xx + (yy * WIDTH)] = new FloorTile(xx*24, yy*24, Tile.TILE_FLOOR);
				
				if(pixelAtual == 0xFF81BA44) {
					//Floor	
					tiles[xx + (yy * WIDTH)] = new FloorTile(xx*24, yy*24, Tile.TILE_FLOOR);
					
				}else if(pixelAtual == 0xFF7A6358) {
					//Wall
					tiles[xx + (yy * WIDTH)] = new WallTile(xx*24, yy*24, Tile.TILE_WALL);
				
				}else if(pixelAtual == 0xFF000000) {
					//Player
					Game.player.setX(xx*24);
					Game.player.setY(yy*24);
					
				}else if(pixelAtual == 0xFFC09121) {
					//Enemy
					Game.entities.add(new Enemy(xx*24, yy*24, 57, 57, Entity.ENEMY_EN));
					
				}else if(pixelAtual == 0xFF0D27DB) {
					//Weapon
					Game.entities.add(new Weapon(xx*24, yy*24, 57, 57, Entity.WEAPON_EN));
					
				}else if(pixelAtual == 0xFFFA7BFF) {
					//Life Pack
					Game.entities.add(new Lifepack(xx*24, yy*24, 57, 57, Entity.LIFEPACK_EN));
					
				}
			}
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
	
}

public void render(Graphics g) {
	int xstart = Camera.x/24;
	int ystart = Camera.y/24;
	
	int xfinal = xstart + (Game.WIDTH/24);
	int yfinal = ystart + (Game.HEIGHT/24);
	
	for(int xx = xstart; xx <= xfinal; xx++) {
		for(int yy = ystart; yy <= yfinal; yy++) {
			if(xx < 0 || yy < 0 || xx >= WIDTH || yy >= HEIGHT)
				continue;
			Tile tile = tiles[xx + (yy * WIDTH)];
			tile.render(g);
		}
	}
}

}