CPU 密集型 OpenGL 函数

Posted

技术标签:

【中文标题】CPU 密集型 OpenGL 函数【英文标题】:CPU intesive OpenGL functions 【发布时间】:2016-07-11 06:56:22 【问题描述】:

我正在使用 Visual Studio 2013 和 OpenGL 创建模拟。 我使用 keboard 输入对变量进行某些更改,并在创建的窗口上看到更新。

但是,在我按下键和窗口上更改的输出之间有一个小的延迟。

我尝试使用 Visual Studio 诊断工具,发现有 2 个关键功能是 CPU 密集型的。

一个是我创建的用户函数,另一个是 'display/main/__tmainCRTStartup/mainCRTStartup

我假设这是一个 GLUT 函数。这是正常的还是我做错了什么?

任何帮助将不胜感激。

void keyboard (unsigned char key, int x, int y)

 switch (key)
 
    case 'r': case 'R':
    if (filling==0)
    
        glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); 
        filling=1;
    
    else
    
        glPolygonMode (GL_FRONT_AND_BACK, GL_POINT); 
        filling=0;
    
    break;
    case 27:
    exit(0);
    break;
 

.

void display(void)

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(-90,0.0,1.0,0.0); 
glRotatef(-90,1.0,0.0,0.0); 

rotation_x = rotation_x + (rotation_x_increment - rotation_x)/50;
rotation_y = rotation_y + (rotation_y_increment - rotation_y)/50;
rotation_z = rotation_z + rotation_z_increment;

if (rotation_x > 359) rotation_x = 0;
if (rotation_y > 359) rotation_y = 0;
if (rotation_z > 359) rotation_z = 0;

if(rotation_x_increment > 359) rotation_x_increment = 0;
if(rotation_y_increment > 359) rotation_y_increment = 0;
if(rotation_z_increment > 359) rotation_z_increment = 0;

glRotatef(rotation_x,1.0,0.0,0.0); 
glRotatef(rotation_y,0.0,1.0,0.0);
glRotatef(rotation_z,0.0,0.0,1.0);

glTranslatef(x_translate,0.0,0.0);
glTranslatef(0.0,y_translate,0.0);
glTranslatef(0,0,z_translate); 


glEnd();
glutSwapBuffers(); 
glFlush(); // This force the execution of OpenGL commands

.

int main(int argc, char **argv)

IntroDisplay();
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(screen_width,screen_height);
glutInitWindowPosition(0,0);
glutCreateWindow("Ultrasonic Testing");
glutDisplayFunc(display);
glutIdleFunc(display);
glutReshapeFunc (resize);
glutKeyboardFunc (keyboard);
glutSpecialFunc (keyboard_s);
glutMouseFunc(mouse);
glutMotionFunc(mouseMove);
init();
glutMainLoop();
return 0;

【问题讨论】:

mainCRTStartup 是调用您的main 的运行时库父函数。所以它告诉你的只是main 花费了很多时间,这是合理的。 我会尝试在该循环中添加 Sleep(0) 或 Sleep(10) 以查看它是否有任何区别,并删除 glFlush(); 停止使用固定管道,也许它会运行得更快;) 【参考方案1】:

我已将代码复制到一个新项目中,我已将显示功能更改为绘制三角形,它的工作速度非常快。

(我知道这应该是评论,而不是答案,但我没有足够的声誉来添加 cmets)。

PD:你可以改变

glTranslatef(x_translate,0.0,0.0);
glTranslatef(0.0,y_translate,0.0);
glTranslatef(0,0,z_translate); 

glTranslatef(x_translate,y_translate,z_translate);

【讨论】:

以上是关于CPU 密集型 OpenGL 函数的主要内容,如果未能解决你的问题,请参考以下文章

高 CPU 使用率 OpenGL Ver 3.1 + SDL2

OpenGL ES之实例化渲染(Instancing)

如何在OpenGL ES着色器中实现Catmull Clark细分算法

在 openGL 中,模型坐标应该在我的 CPU 上还是通过 OpenGL 调用在 GPU 上计算?

为啥这个微不足道的 opengl 程序使用 100% cpu?

无法从 GPU 复制到 CPU (OpenGL)