| 发表于:2007-02-06 12:00:29 楼主 |
原来是通过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(...) } |
|
|
|
|