2011-08-24 165 views
2

最近我開始編寫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(); 
    } 
+0

問題可能出現在您的繪圖代碼中。請記住,如果n是棋盤邊緣的大小,那麼在2D蛇中有n^2個單元,在3D蛇中有n^3個單元,在4D蛇中有n^4個單元......如果你想要繪製所有的面孔都是天真的,你要處理240000個面,以獲得10個單元邊緣的棋盤。 – ybungalobill

+0

我不知道...我暫停遊戲,看看旋轉(由OpenGL函數控制)是否會降低速度,但實際上並沒有發生任何重大的...但可能只是一個印象。我也發佈了繪圖函數......也許200行代碼有點太多了...... – Pella86

+0

btw ...有32個邊,24個面,這意味着6個超立方體蛇144 GL_QUADS和192 GL_LINES。 ... – Pella86

回答

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); 
    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()中。

+0

這太棒了!+點,當我得到一些聲譽:D – Pella86

+0

thx你它的工作! – Pella86