我有一块使用显示列表生成的立方体,随着时间的推移,帧速率显着下降。为什么是这样?这是一些代码:
public class Chunk implements GameObject {
private int sx, sy, sz, lx, ly, lz, vertID;
private Tile[][][] tiles;
public Chunk(int sx, int sy, int sz) {
this.sx = sx;
this.sy = sy;
this.sz = sz;
this.lx = sx + 16;
this.ly = sy + 16;
this.lz = sz + 16;
init();
}
@Override
public void init() {
this.tiles = new Tile[lx][ly][lz];
vertID = glGenLists(1);
glNewList(vertID, GL_COMPILE);
for (int x = sx; x < lx; x++) {
for (int y = sy; y < ly; y++) {
for (int z = sz; z < lz; z++) {
tiles[x][y][z] = new Tile("grass.jpg");
}
}
}
glEndList();
}
public void rebuild() {
glNewList(vertID, GL_COMPILE);
for (int x = sx; x < lx; x++) {
for (int y = sy; y < ly; y++) {
for (int z = sz; z < lz; z++) {
tiles[x][y][z].getVertices(x, y, z, 16);
}
}
}
glEndList();
}
@Override
public void update() {
}
@Override
public void render() {
glCallList(vertID);
}
@Override
public void dispose() {
}
}
答案 0 :(得分:0)
你的问题可能在这里:
glNewList(vertID, GL_COMPILE);
for (int x = sx; x < lx; x++) {
for (int y = sy; y < ly; y++) {
for (int z = sz; z < lz; z++) {
tiles[x][y][z] = new Tile("grass.jpg");
}
}
}
glEndList();
如果我必须做出有根据的猜测,你的Tile
类会生成并初始化纹理。嗯,你看,显示列表不仅仅是几何和绘图调用。它们还封装了纹理数据的创建和设置。在OpenGL-1.1(即OpenGL-1.0)之前,没有纹理对象(glGenTextures
,glBindTexture
),并且您使用显示列表代替它。在所有兼容性的OpenGL配置文件中,今天仍然存在这种小错误。这也是Windows调用该函数来共享OpenGL上下文数据wglShareLists
的原因,尽管它远远超出了列表。
总而言之,您可能正在显示列表中间执行相当昂贵的操作。难怪它很慢。但严重的是,为什么要为每个瓷砖分配一个新的纹理?您应该只将图像加载到纹理中一次,然后仅引用它们。