I have a 256x256x128 world divided on chunks(16x16 blocks) each.When the chunk changed or rendered first time, i create a display list and render the chunk.Then if it's not changed i just call the display list.Code looks like that:
(in world class)
public void render() {
for(int x=0; x<16; x++)
for(int z=0; z<16; z++) {
GL11.glPushMatrix();
GL11.glTranslatef(16*x, 0, 16*z);
chunks[x][z].render();
GL11.glPopMatrix();
}
}
(in chunk class)
public void render() {
if(changed){
GL11.glDeleteLists(DList, 1);
GL11.glNewList(DList, GL11.GL_COMPILE_AND_EXECUTE);
for(int cx=0; cx<sizeX; cx++)
for(int cy=0;cy<sizeY; cy++)
for(int cz=0;cz<sizeZ;cz++){
if(blocks[cx][cy][cz].getBlock().getId() != 0) {
BlockData data = blocks[cx][cy][cz];
data.getBlock().getModel().render(data, cx, cy, cz, World.cur.getSurroundingBlocks(cx+x*16, cy, cz+z*16));
}
}
GL11.glEndList();
Info.info("chunk was changed");
} else {
GL11.glCallList(DList);
}
changed = false;
}
(in ModelCube class(standard model))
public void render(BlockData block, int x, int y, int z, Block[] sur) {
if(sur[0].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(0));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+0, y+0, z+1);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+1, y+0, z+1);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+1, y+1, z+1);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+0, y+1, z+1);
GL11.glEnd();
}
if(sur[1].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(1));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+0, y+0, z+0);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+0, y+1, z+0);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+1, y+1, z+0);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+1, y+0, z+0);
GL11.glEnd();
}
if(sur[2].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(2));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+0, y+1, z+0);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+0, y+1, z+1);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+1, y+1, z+1);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+1, y+1, z+0);
GL11.glEnd();
}
if(sur[3].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(3));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+0, y+0, z+0);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+1, y+0, z+0);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+1, y+0, z+1);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+0, y+0, z+1);
GL11.glEnd();
}
if(sur[4].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(4));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+1, y+0, z+0);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+1, y+1, z+0);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+1, y+1, z+1);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+1, y+0, z+1);
GL11.glEnd();
}
if(sur[5].getRenderID() != block.getBlock().getRenderID()) {
GL11.glBindTexture(GL11.GL_TEXTURE_2D, block.getBlock().getTextureFromSide(5));
GL11.glBegin(GL11.GL_TRIANGLE_FAN);
GL11.glTexCoord2f(0.0F, 1.0F); GL11.glVertex3f(x+0, y+0, z+0);
GL11.glTexCoord2f(1.0F, 1.0F); GL11.glVertex3f(x+0, y+0, z+1);
GL11.glTexCoord2f(1.0F, 0.0F); GL11.glVertex3f(x+0, y+1, z+1);
GL11.glTexCoord2f(0.0F, 0.0F); GL11.glVertex3f(x+0, y+1, z+0);
GL11.glEnd();
}
}
This gives me only 14 fps.What should i do?