0

我有一大块使用显示列表生成的立方体,每当我靠近它时,帧速率就会显着下降。为什么是这样?这是一些代码:

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

}

4

1 回答 1

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,尽管它远远超出了列表。

长话短说,您可能在显示列表的中间执行了一项非常昂贵的操作。难怪它很慢。但说真的,为什么要为每个图块分配一个新纹理?您应该只将图像加载到纹理中一次,然后只引用它们。

于 2013-10-24T10:56:33.470 回答