游戏滞后于显示列表数据

时间:2013-10-24 10:33:18

标签: java opengl

我有一块使用显示列表生成的立方体,随着时间的推移,帧速率显着下降。为什么是这样?这是一些代码:

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() {
}

}

1 个答案:

答案 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)之前,没有纹理对象(glGenTexturesglBindTexture),并且您使用显示列表代替它。在所有兼容性的OpenGL配置文件中,今天仍然存在这种小错误。这也是Windows调用该函数来共享OpenGL上下文数据wglShareLists的原因,尽管它远远超出了列表。

总而言之,您可能正在显示列表中间执行相当昂贵的操作。难怪它很慢。但严重的是,为什么要为每个瓷砖分配一个新的纹理?您应该只将图像加载到纹理中一次,然后仅引用它们。