|  | 
 
| 原来是通过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(...)
 }
 | 
 |