请教gdi,opengl,directx画二维图形速度哪个更快?
原来是通过VC+GDI画图的,图中有大量填充,GDI画图时间太长,想用OPENGL,做了如下测试:
填充大小相同的矩形,GDI所花时间为4秒,OPENGL所长时间为6秒, 只画矩形不填充,GDI所花时间为0.6秒,OPENGL所长时间为1.2秒 为什么OPENGL画二维图形比GDI还慢,还是我程序有问题?DIRECT没用过,不知速度是否会快点? OPENGL代码: BOOL CGlTestDlg::GL_Init() { static PIXELFORMATDESCRIPTOR pfd = //定义一个PIXELFORMATDESCRIPTOR结构变量 pdf,并初始化 { sizeof(PIXELFORMATDESCRIPTOR),//该结构大小 1,//版本号 PFD_DRAW_TO_WINDOW |//格式必须支持窗口 PFD_SUPPORT_OPENGL |//格式必须支持OPENGL PFD_DOUBLEBUFFER,//必须支持双缓冲 24,//颜色深度 0,0,0,0,0,0,//忽略的色彩位 0,//无Alpah缓存 0,//忽略Shift Bit 0,//无聚集缓存 0,0,0,0,//忽略聚集位 32,//16位 Z-缓存(深度缓存) 0,//无模板缓存 0,//无辅助缓存 PFD_MAIN_PLANE,//主绘图层 0,//保留 0,0,0//忽略层遮罩 }; HWND TmpWnd = m_DrawingWindow.m_hWnd; g_hdc = ::GetDC(TmpWnd);//取得设备描述表 GLuint iPixelFormat; if( !(iPixelFormat = ChoosePixelFormat(g_hdc,&pfd))) { GL_UnInit(); AfxMessageBox("不能找到相应像素格式!"); return FALSE; } if(!SetPixelFormat(g_hdc,iPixelFormat,&pfd)) { GL_UnInit(); AfxMessageBox("不能设置像素格式!"); return FALSE; } if(!(g_hRC = wglCreateContext(g_hdc))) { GL_UnInit(); AfxMessageBox("不能创建设备描述表!"); return FALSE; } if( !wglMakeCurrent(g_hdc,g_hRC)) { GL_UnInit(); AfxMessageBox("不能激活设备描述表!"); return FALSE; } m_DrawingWindow.GetWindowRect(&gl_Rc); GL_ResizeScene(gl_Rc.Width(),gl_Rc.Height()); if(!GL_InitCfg()) return FALSE; return TRUE; } void CGlTestDlg::GL_ResizeScene(int iWidth, int iHeight) { if(iHeight == 0) iHeight = 1; glViewport(0,0,iWidth,iHeight);//设置视口 glMatrixMode(GL_PROJECTION);// 选择投影矩阵 glLoadIdentity();// 重置投影矩阵 gluPerspective(45,(GLfloat)iWidth/(GLfloat)iHeight,0.1f,100.0f);// 计算窗口的外观比例 //glOrtho(-65,65,55,-55,0.1f,100.0f); glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵 glLoadIdentity();//重置模型观察矩阵 } BOOL CGlTestDlg::GL_InitCfg() { glShadeModel(GL_SMOOTH);//启用阴影平滑 glClearColor(0.0f,0.0f,0.0f,0.0f);//黑色背景 glClearDepth(1.0f);//设置深度缓存 glEnable(GL_DEPTH_TEST);//启用深度测试 glDepthFunc(GL_LEQUAL);//所作深度测试的类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正 glEnable(GL_POINT_SMOOTH); return TRUE; } //画图 glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存 glLoadIdentity();//重置当前的模型观察矩阵 GL_DrawScene(); ::glFinish(); SwapBuffers(g_hdc);//交换缓存(双缓存) //画矩形 glBegin(GL_QUADS); for (int i=1;i<100000;i++) { glVertex2f(-50.0f,5.0f); glVertex2f(-10.0f,5.0f); glVertex2f(-10.0f,25.0f); glVertex2f(-50.0f,25.0f); } glEnd(); //GDI中画图 for (int i=1;i<100000;i++) { Rectangle(...) } |
回复: 请教gdi,opengl,directx画二维图形速度哪个更快?
你用GDI只画Rectangle, 而OpenGL却设置了许多高级特性(如你的
GL_InitCfg()中所设), 比较完全不对称! 以下的设置都会对速度带来影响, 若只是比较画Rect的速度, 应该完全 关闭这些特性: //============================================== glShadeModel(GL_SMOOTH);//启用阴影平滑 glClearDepth(1.0f);//设置深度缓存 glEnable(GL_DEPTH_TEST);//启用深度测试 glDepthFunc(GL_LEQUAL);//所作深度测试的类型 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//真正精细的透视修正 glEnable(GL_POINT_SMOOTH); //============================================== |
所有的时间均为北京时间。 现在的时间是 12:01 PM. |