4-мерная игра Render Optimizazion - PullRequest
       27

4-мерная игра Render Optimizazion

2 голосов
/ 24 августа 2011

Недавно я начал программировать C ++-версию игры Snake 4d ( Объяснение игры , C ++ / openGL-версия игры ).Я действительно начинающий программист ... поэтому каждый комментарий, даже стиль программирования, ценится.

У меня выпадает кадр после того, как "змея" съела (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
  • Удовлет* 2,1% 2,1% GLEngine gleGetVertexSubmitFuncObjectAndKey
  • 2,1% 2,1% GeForceGLDriver gldUpdateDispatch
  • 1,8% 1,8% 4 измерения MyGLBox :: paintGL ()
* * * *

функция 1029 *, возможно, 1029 *: (

функция рисования:

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

1 Ответ

1 голос
/ 25 августа 2011

Если свойства материала не изменяются для каждого элемента в цикле, вы можете сделать это вместо этого:

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 () вне цикла, если цвет был одинаковым для всех четырехугольников.

...