【发布时间】:2014-01-17 20:20:09
【问题描述】:
我想使用 OpenGl(lwjgl) 制作 Minecraft 块渲染。
无论如何我都做到了,但我遇到了 FPS 问题。我希望有人能告诉我如何优化它,以便我可以更快地渲染更多块。我将向您展示代码,它显示了到目前为止我是如何基于 0 和 1 值渲染简单地图的。
代码:
块计算:
public void calculate(){
for(int x=0;x<w;x++)
for(int y=0;y<d;y++)
for(int z=0;z<h;z++){
for(int i=0;i<6;i++){
Vector3 d =dir[i];
if(isVisible(x,y,z)==false)continue;
if(!isVisible(-(int)d.x+x,-(int)d.y+y,-(int)d.z+z) ){
pList.add(new Point4B((byte)x,(byte)y,(byte)z,(byte) i));
}
}
}
这就是我基于 3D 位数组进行计算的方式: Point4B 仅具有参数位置 x,y,z 和边 s 这就是我渲染块的方式:
public void draw(){
for(Point4B a : pList){
glPushMatrix();
glTranslatef(a.x,a.y,a.z);
glBegin(GL_QUADS);
DrawSide((int)a.s);
glEnd();
glPopMatrix();
}
pList 是我需要渲染的所有矩形的列表 这是我渲染所有块的代码:
for(float x=0;x<16;x++){
for(float z=0;z<16;z++){
glPushMatrix();
glTranslatef((float)x*16,0f,(float)z*16);
chunks[(int)x][(int)z].draw();
glPopMatrix();
}
我在这里渲染 16x16 块,这非常慢。
我知道我可以对渲染块之间的边进行优化,但我相信即使这样我仍然无法渲染大约 50 个块而不会造成巨大的 FPS 损坏
我在这里画边:
switch(side){
case B_UP:
glColor3f(0.1333f,0.54509f,0.1333f);
glVertex3f(-1,1,-1);
glVertex3f(1,1,-1);
glVertex3f(1,1,1);
glVertex3f(-1,1,1);
break;
6 面的所有情况以此类推
如果我遗漏了要解释的内容,请注意
【问题讨论】:
-
Use modern OpenGL。 OpenGL 调用越少,你的代码就会越快。即,使用 Vertex Buffer Objects 和 Vertex Array Objects 将所有块一次移动到 GPU 内存中,而不是一次将其添加到一个顶点中。
标签: java opengl render lwjgl minecraft