我有一个奇怪的问题:
我必须输出一个 15x15 元素的游戏地板。
到目前为止,我在游戏循环中调用了我的函数“printFloor()”。
此函数遍历所有 225 个元素,并根据它们的值显示纹理文件的不同部分。因此 CPU 必须在每个循环周期中渲染相同的 225 个纹理。游戏循环每个周期需要大约 16-32ms,所以我现在把这个输出放在一个显示列表中:
if(!gamefloorPrepared) //no Display list created -> this is the first time the floor nees to
//be printed
{ gamefloor = glGenLists(1);
glNewList(gamefloor,GL_COMPILE);
for(int y=0;y<size.y;y++)
{ for(int x=0;x<size.x;x++)
{ printFloorElement(spielfeld[y][x],{x,y}); //see below
}
}
glEndList();
gamefloorPrepared=1;
}else
{ glCallList(gamefloor);
}
函数 printFloorElement 计算位置,将图形模式更改为“switchGraphicMode(TEXTURES);”,绑定纹理并绘制纹理:
glBegin(GL_QUADS);
glTexCoord2f(spriteSize.x* spritePos.x +halfTexelSize.x,spriteSize.y*(spritePos.y+1)-halfTexelSize.y); glVertex2f(display.a.x,display.a.y);
glTexCoord2f(spriteSize.x* spritePos.x +halfTexelSize.x,spriteSize.y* spritePos.y +halfTexelSize.y); glVertex2f(display.a.x,display.b.y);
glTexCoord2f(spriteSize.x*(spritePos.x+1)-halfTexelSize.x,spriteSize.y* spritePos.y +halfTexelSize.y); glVertex2f(display.b.x,display.b.y);
glTexCoord2f(spriteSize.x*(spritePos.x+1)-halfTexelSize.x,spriteSize.y*(spritePos.y+1)-halfTexelSize.y); glVertex2f(display.b.x,display.a.y);
glEnd();
问题:一个游戏循环周期现在需要 60-80 毫秒,所以它相当慢。显示列表只生成一次,我已经检查过了。
“switchGraphicMode()”-函数:
void switchGraphicMode(GRAPHICMODES target)//can be "TEXTURES" or "DRAWING"
{ if(target != graphicMode)//"gaphicMode" = global Variable which shows if GL_TEXTURE_2D is currently enabled
{ if(target==DRAWING)
{ glDisable(GL_TEXTURE_2D);
graphicMode=DRAWING;
}else
{ glEnable(GL_TEXTURE_2D);
graphicMode=TEXTURES;
}
}
}
有人知道原因吗?