Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Быстродействие программ OpenGL


Автор: dandy77 1.10.2008, 17:57
Кто мне объяснит? Рисую полигоны 6 на 6 в виде пола, домик 2 на 1 полигон. Пытаюсь перемещаться клавишами вперед- назад, влево- вправо- у меня на компьютере 2,2 Гг Пентиум 256 Мб видео- 1000 кадров в секунду (я поставил подсчет кадров), кроме того на клавши вперд- назад у меня есть sin, cos для выяснения позиции, куда перемещаться. На компьютере 2,5 Целерон 64 Мб видео- 100 кадров в секунду и тормозит при этом немного. Пробую вобще на слабеньком 233 Мг Пентиуме 3-10 кадров в секунду- тормозит до невозможности. И казалось бы простая программуля всего- то пару полигонов прорисовываеться в цикле (координаты полигонов взяты из текстового файла, он грузиться перед началом работы программы), а тормозит на других компьютерах. В чем дело? Вот код функции рисования:
Код

int DrawGLScene(GLvoid)                                
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
    glLoadIdentity();                        

    glTranslatef(0.0f,0.0f,-1.0f);                    
//======================================
    CalculateFrameRate();    
    glDisable(GL_TEXTURE_2D);
    glColor3ub(255,255,0);
    glRasterPos2f(-0.51f, 0.36f);
    glPrint("FPS %5.2f",FPS);
    glEnable(GL_TEXTURE_2D);
    //glColor3ub(255,255,255);

//==================================================
//Перемещаем вид
    glTranslatef(0.0f,0.0f,1.0f);                    
    GLfloat x_m, y_m, z_m, u_m, v_m;
    GLfloat xtrans = -xpos;
    GLfloat ztrans = -zpos;
    GLfloat ytrans = -walkbias-0.25f;
    GLfloat sceneroty = 360.0f - yrot;

    int numtriangles;

    glRotatef(lookupdown,1.0f,0,0);
    glRotatef(sceneroty,0,1.0f,0);

        
    glTranslatef(xtrans, -0.5, ztrans);
    //glTranslatef(xtrans, ytrans, ztrans);

//================================================    
//Рисуем пол    

    
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    

    numtriangles = sector1.numtriangles;
    
    // Process Each Triangle
    for (int loop_m = 0; loop_m < numtriangles; loop_m++)
    {
            glBegin(GL_QUADS);
        
            glNormal3f( 0.0f, 0.0f, 1.0f);
        
            //glColor4f(1.0f,0.0f,0.0f,1.0f);
            x_m = sector1.triangle[loop_m].vertex[0].x;
            y_m = sector1.triangle[loop_m].vertex[0].y;
            z_m = sector1.triangle[loop_m].vertex[0].z;
            u_m = sector1.triangle[loop_m].vertex[0].u;
            v_m = sector1.triangle[loop_m].vertex[0].v;
            glTexCoord2f(u_m,v_m); 
            glVertex3f(x_m,y_m,z_m);
            
            //glColor4f(0.0f,1.0f,0.0f,1.0f);
            x_m = sector1.triangle[loop_m].vertex[1].x;
            y_m = sector1.triangle[loop_m].vertex[1].y;
            z_m = sector1.triangle[loop_m].vertex[1].z;
            u_m = sector1.triangle[loop_m].vertex[1].u;
            v_m = sector1.triangle[loop_m].vertex[1].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);
            
            
            //glColor4f(0.0f,0.0f,1.0f,1.0f);
            x_m = sector1.triangle[loop_m].vertex[2].x;
            y_m = sector1.triangle[loop_m].vertex[2].y;
            z_m = sector1.triangle[loop_m].vertex[2].z;
            u_m = sector1.triangle[loop_m].vertex[2].u;
            v_m = sector1.triangle[loop_m].vertex[2].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);

            //glColor4f(1.0f,1.0f,1.0f,1.0f);
            x_m = sector1.triangle[loop_m].vertex[3].x;
            y_m = sector1.triangle[loop_m].vertex[3].y;
            z_m = sector1.triangle[loop_m].vertex[3].z;
            u_m = sector1.triangle[loop_m].vertex[3].u;
            v_m = sector1.triangle[loop_m].vertex[3].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);


        glEnd();

    }
//================================================
//Рисуем домик

    int numtexthouse;


    glBindTexture(GL_TEXTURE_2D, texture[1]);

    numtexthouse = sector2.numtriangles;
    
    // Process Each Triangle
    for (loop_m = 0; loop_m < numtexthouse; loop_m++)
    {
            glBegin(GL_QUADS);
        
            x_m = sector2.triangle[loop_m].vertex[0].x;
            y_m = sector2.triangle[loop_m].vertex[0].y;
            z_m = sector2.triangle[loop_m].vertex[0].z;
            u_m = sector2.triangle[loop_m].vertex[0].u;
            v_m = sector2.triangle[loop_m].vertex[0].v;
            glTexCoord2f(u_m,v_m); 
            glVertex3f(x_m,y_m,z_m);
            
            x_m = sector2.triangle[loop_m].vertex[1].x;
            y_m = sector2.triangle[loop_m].vertex[1].y;
            z_m = sector2.triangle[loop_m].vertex[1].z;
            u_m = sector2.triangle[loop_m].vertex[1].u;
            v_m = sector2.triangle[loop_m].vertex[1].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);
            
            
            x_m = sector2.triangle[loop_m].vertex[2].x;
            y_m = sector2.triangle[loop_m].vertex[2].y;
            z_m = sector2.triangle[loop_m].vertex[2].z;
            u_m = sector2.triangle[loop_m].vertex[2].u;
            v_m = sector2.triangle[loop_m].vertex[2].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);


            x_m = sector2.triangle[loop_m].vertex[3].x;
            y_m = sector2.triangle[loop_m].vertex[3].y;
            z_m = sector2.triangle[loop_m].vertex[3].z;
            u_m = sector2.triangle[loop_m].vertex[3].u;
            v_m = sector2.triangle[loop_m].vertex[3].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);


        glEnd();

    }
//===============================================
    //Рисуем дерево из двух одинаковых текстур перехрещеных под 90 градусов

    glBindTexture(GL_TEXTURE_2D,texName);
    
    glPushMatrix();
    
    glTranslatef(5.5, 0, 0.5);

    glRotatef(45,0.0,1.0,0.0);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    
    glCallList(listNum);

    
    //Позиционируем вторую половину дерева и рисуем ее
    glRotatef(-90,0.0,1.0,0.0);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    
    glCallList(listNum);

    
    glPopMatrix();

    return TRUE;                                        // Everything Went OK
}

Автор: Rickert 2.10.2008, 05:41
Во-первых вы выводите информацию через glBegin/glEnd - это самый затратный способ. Смотри описание glDrawArray.
Во-вторых: зачем вы перед каждым вызовом присваиваете переменным значения из класса? Разве нельзя просто их подставить? Это я про эти строки:
Код
            x_m = sector2.triangle[loop_m].vertex[2].x;
            y_m = sector2.triangle[loop_m].vertex[2].y;
            z_m = sector2.triangle[loop_m].vertex[2].z;
            u_m = sector2.triangle[loop_m].vertex[2].u;
            v_m = sector2.triangle[loop_m].vertex[2].v;
            glTexCoord2f(u_m,v_m);
            glVertex3f(x_m,y_m,z_m);

Не мудренно что тормозит.

Автор: dandy77 8.10.2008, 19:05
Спасибо за совет, обязательно попробую.


Автор: Buter-Brod 24.10.2008, 23:02
Помогло? Интересуюсь, потому что сам inline-функций наделал и define-ов, только чтобы вывод "облегчить", избавив от вызовов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)