The code works fine, but the speed stays at a consistent eight frames per second.
Today I fixed some pieces and got four more frames per second.
I figured out that the typecasting (int)
and Math.floor()
consume around 50 fps.
Is there anything I can do to improve the performance of this code?
public void render(){
for(int y = 0; y < height; y++){
for(int x = 0; x < width; x++){
/* 1. game screen
* 2. loading screen
* 3. login screen
*/
screenPix = x + y * width;
if(Core.loadingDone && Core.logedin){
offsetX = Player.playerX;
offsetY = Player.playerY;
chunkX = (int) Math.floor((x + offsetX) / 512);
chunkY = (int) Math.floor((y + offsetY) / 512);
tileX = (int) Math.floor(((x + offsetX) - (chunkX * 512)) / 32);
tileY = (int) Math.floor(((y + offsetY) - (chunkY * 512)) / 32);
pixelX = (int) ((x + offsetX) - Math.floor(chunkX * 512) - Math.floor(tileX * 32));
pixelY = (int) ((y + offsetY) - Math.floor(chunkY * 512) - Math.floor(tileY * 32));
currTile = ChunkManager.chunks.get(chunkX).get(chunkY).tile[tileX][tileY];
tilePix = pixelX + pixelY * 32;
try{
Game.pixels[screenPix] = SpriteManager.groundSpritesGet(currTile.getGroundID()).pixels[tilePix];
if(currTile.moveAbility[pixelX][pixelY] == 1){
//render order: player object event
if(x >= Game.WIDTH / 2 - 16 && x <= Game.WIDTH / 2 + 16 && y >= Game.HEIGHT / 2 - 16 && y <= Game.HEIGHT / 2 + 16){//wrong
//TODO render player
//TODO render equip
}
if(SpriteManager.objectSpritesGet(currTile.getObjectID()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID()).pixels[tilePix];
if(SpriteManager.objectSpritesGet(currTile.getObjectID2()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID2()).pixels[tilePix];
if(SpriteManager.objectSpritesGet(currTile.getObjectID3()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID3()).pixels[tilePix];
if(Core.builderMode){
if(Core.builderModePathMode && SpriteManager.eventSpritesGet(currTile.getEventWalkPath()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventWalkPath()).pixels[tilePix];
if(Core.builderModeEventMode && SpriteManager.eventSpritesGet(currTile.getEventID()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventID()).pixels[tilePix];
}else{
if(SpriteManager.eventSpritesGet(currTile.getEventAlias()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventAlias()).pixels[tilePix];
}
continue;
}else{
//render order: object event player
if(SpriteManager.objectSpritesGet(currTile.getObjectID()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID()).pixels[tilePix];
if(SpriteManager.objectSpritesGet(currTile.getObjectID2()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID2()).pixels[tilePix];
if(SpriteManager.objectSpritesGet(currTile.getObjectID3()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.objectSpritesGet(currTile.getObjectID3()).pixels[tilePix];
if(Core.builderMode){
if(Core.builderModePathMode && SpriteManager.eventSpritesGet(currTile.getEventWalkPath()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventWalkPath()).pixels[tilePix];
if(Core.builderModeEventMode && SpriteManager.eventSpritesGet(currTile.getEventID()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventID()).pixels[tilePix];
}else{
if(SpriteManager.eventSpritesGet(currTile.getEventAlias()).pixels[tilePix] != 0xffff00ff) Game.pixels[screenPix] = SpriteManager.eventSpritesGet(currTile.getEventAlias()).pixels[tilePix];
}
if(x >= Game.WIDTH / 2 - 16 && x <= Game.WIDTH / 2 + 16 && y >= Game.HEIGHT / 2 - 16 && y <= Game.HEIGHT / 2 + 16){//wrong
//TODO render player
//TODO render equip
}
continue;
}
}catch(NullPointerException e){
FileManager.missingChunk = chunkX+"v"+chunkY+"v?";
}
}else if(Core.logedin){
if(Core.loading_screen){
Game.pixels[screenPix] = SpriteManager.guiSprites.get(2).pixels[screenPix];
continue;
}
}else{
if(hover){
Game.pixels[screenPix] = SpriteManager.guiSprites.get(1).pixels[screenPix];
}else{
Game.pixels[screenPix] = SpriteManager.guiSprites.get(0).pixels[screenPix];
}
if(y > 574 && y < 600){
if(x > 290 && x < 450 || x > 540 && x < 700){
Game.pixels[screenPix] = 0xffffffff;
}
}
continue;
}
}
}
}
Some more context
TreeMap<Integer, Sprite> guiSprites = new TreeMap<Integer, Sprite>();
Game
is the Main Class the produce a JFrame
and some other stuff until it starts to call render() that actually calls the above code.
private void render() {
bs = getBufferStrategy();
if(bs == null){
createBufferStrategy(2);
return;
}
screen.render();
g = bs.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
g.dispose();
bs.show();
}
And Core
is a Class that handles information given by the server,
but for this part now it's just a few booleans for later in the game.
Core
? What isGame
? What isSpriteManager.guiSprites.get(1)
? \$\endgroup\$chunkX
andoffsetX
- how, and where are they defined? Are theyint
values? \$\endgroup\$