4维游戏渲染优化
问题描述:
最近我开始编写C++版本的游戏Snake 4d(Game explanation,C++/openGL version of the game)。我真的是一个编程初学者...所以每一个评论,甚至对编程风格的赞赏。4维游戏渲染优化
“蛇”吃了(6)立方体后,我有一个框架下降。
游戏逻辑保留了这样一个事实,即蛇被存储在一个名为snake.p_list的向量中,每次蛇与食物碰撞(在程序cibo中调用)时,它都会向p_list中添加一个新对象。 可能是由于游戏引擎?或者也许你有其他想法可以导致帧丢失?你有什么想法如何使这些功能看起来更好?
确定我拼命地跑探查...和: 应用程序配置文件:
- 23.0%,23.0%GeForceGLDriver glrCompExecuteKernel
- 19.3%,19.3%GeForceGLDriver gldCopyTexSubImage
- 5.4%5.4%GeForceGLDriver gldFinish
- 5.3%5.3%GLEngine gleUpdateLightRGBASumsUnconditional
- 3.9%3.9%GLEngine gleUpdateDeferredState
- 2.1%2.1%GLEngine gleGetVertexSubmitFuncObjectAndKey
- 2.1%2.1%GeForceGLDriver gldUpdateDispatch
- 1.8%1.8%4dimensions MyGLBox :: paintGL()
可能是绘图功能:(
绘图功能:
for(p = p_list.begin();p != p_list.end(); p++){
Polygon4 p1 = *p;
if(prj == PRJ_2D){
//parameters to project in 2d
double angle = PI/4;
double Cx = 0.;
double Lx = 50./2;
double p_cam = 10.;
//actually simply fits...
for(int i = 0; i < 32; ++i){
V4 v1_2d = p1.v_list[p1.e_list[i].e[0]];
V4 v2_2d = p1.v_list[p1.e_list[i].e[1]];
double x1 = Cx + (Lx*v1_2d[c_i])/(p_cam*2*tan(angle));
double y1 = Cx + (Lx*v1_2d[c_j])/(p_cam*2*tan(angle));
double x2 = Cx + (Lx*v2_2d[c_i])/(p_cam*2*tan(angle));
double y2 = Cx + (Lx*v2_2d[c_j])/(p_cam*2*tan(angle));
float mat_specular[] ={0.1,0.1,0.1,0.1};
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
GLfloat mat_shininess[] = { 0 };
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat mat_color[] = {p1.color.r,p1.color.g,p1.color.b,0.5};
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
glBegin(GL_LINES);
glVertex3f(x1,y1,0.);
glVertex3f(x2,y2,0.);
glEnd();
}
}
else{
for(vertex = p1.v_list.begin(); vertex != p1.v_list.end(); vertex++){
v3d = cam.prj_p(*vertex);
tesseract_prj.v_list.push_back(v3d);
}
tesseract_prj.e_list = p1.e_list;
tesseract_prj.f_list = p1.f_list;
//edges render
for(int i = 0; i <32; ++i){
V3 v1 = tesseract_prj.v_list[tesseract_prj.e_list[i].e[0]];
V3 v2 = tesseract_prj.v_list[tesseract_prj.e_list[i].e[1]];
float mat_specular[] ={0.1,0.1,0.1,0.1};
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
GLfloat mat_shininess[] = { 0 };
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat mat_color[] = {0.0,0.0,0.0,1.};
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
glBegin(GL_LINES);
glVertex3f(v1[0],v1[1],v1[2]);
glVertex3f(v2[0],v2[1],v2[2]);
glEnd();
}
//faces render
for(int i = 0; i<24; ++i){
V3 v1 = tesseract_prj.v_list[tesseract_prj.f_list[i].f[0]];
V3 v2 = tesseract_prj.v_list[tesseract_prj.f_list[i].f[1]];
V3 v3 = tesseract_prj.v_list[tesseract_prj.f_list[i].f[2]];
V3 v4 = tesseract_prj.v_list[tesseract_prj.f_list[i].f[3]];
GLfloat mat_color[] = {p1.color.r,p1.color.g,p1.color.b,0.5};
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
glBegin(GL_QUADS);
glVertex3f(v1[0],v1[1],v1[2]);
glVertex3f(v2[0],v2[1],v2[2]);
glVertex3f(v3[0],v3[1],v3[2]);
glVertex3f(v4[0],v4[1],v4[2]);
glEnd();
}
tesseract_prj.e_list.clear();
tesseract_prj.v_list.clear();
}
答
如果材质属性不会因循环中的每个元素而改变,您可以改为:
float mat_specular[] ={0.1,0.1,0.1,0.1};
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
GLfloat mat_shininess[] = { 0 };
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat mat_color[] = {0.0,0.0,0.0,1.};
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
glBegin(GL_LINES);
for(int i = 0; i <32; ++i)
{
glVertex3f(v1[0],v1[1],v1[2]); //note: drawing multiple lines with one
glVertex3f(v2[0],v2[1],v2[2]); //glBegin/glEnd pair will be much faster
}
glEnd();
使用glColorMaterial也可能比glMaterialfv快:
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL); //now ambient and diffuse is set by glColor4f()
glBegin(GL_QUADS);
for(int i = 0; i<24; ++i)
{
glColor4f(r,g,b,0.5);
glVertex3f(v1[0],v1[1],v1[2]);
glVertex3f(v2[0],v2[1],v2[2]);
glVertex3f(v3[0],v3[1],v3[2]);
glVertex3f(v4[0],v4[1],v4[2]);
}
glEnd();
glDisable(GL_COLOR_MATERIAL);//now use glMaterialfv() for ambient and diffuse (optional)
而且,这可以让你改变每个四色(或者甚至每一个顶点),但只使用一个在glBegin(GL_QUADS)/ glEnd ()对而不是24(这可能会造成很大的速度差异)。此外,如果所有四边形的颜色相同,则可以将该调用放到循环外的glColor4f()中。
问题可能出现在您的绘图代码中。请记住,如果n是棋盘边缘的大小,那么在2D蛇中有n^2个单元,在3D蛇中有n^3个单元,在4D蛇中有n^4个单元......如果你想要绘制所有的面孔都是天真的,你要处理240000个面,以获得10个单元边缘的棋盘。 – ybungalobill
我不知道...我暂停游戏,看看旋转(由OpenGL函数控制)是否会降低速度,但实际上并没有发生任何重大的...但可能只是一个印象。我也发布了绘图函数......也许200行代码有点太多了...... – Pella86
btw ...有32个边,24个面,这意味着6个超立方体蛇144 GL_QUADS和192 GL_LINES。 ... – Pella86