请教GDI,OPENGL,DIRECTX画二维图形速度哪个更快?

DY2003 2007-02-06 12:01:44
原来是通过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(...)
}
...全文
1653 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lightnut 2007-03-27
  • 打赏
  • 举报
回复
你用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);
//==============================================
lserlohn 2007-03-07
  • 打赏
  • 举报
回复
本来就是,OpenGL是走渲染流水线的,你就画一个矩形当然还是GDI快了,因为直接就画出来了。就画矩形而言,估计还是GDI快,D3D跟OpenGL差不多
zzwu 2007-03-06
  • 打赏
  • 举报
回复
程序也编写好了,编译和运行一下就知道谁最快.
天堂里的死神 2007-03-06
  • 打赏
  • 举报
回复
如果写的好的话,DX应该最快,但比OPenGL高不到那里去,GDI肯定是最慢的。
youwill 2007-03-06
  • 打赏
  • 举报
回复
应该是DirectX快,不过没测试过。
jackiesun 2007-03-05
  • 打赏
  • 举报
回复
画10W个图,当然快不了。
GDI是最快的,要想提高速度,只能在显示方法想办法了。比如局部刷新
请下载完四个包后解压即可,其中只包含源代码,而没有电子书;我相信大家需要的应该就是源代码了,呵呵,电子书么随便网上搜索就会找到咯。 包含图书中的每个案例的源代码、可执行文件和所有资源文件,具体组织结构如下: 第一章 VC++.NET 编程基础 案例1 第一个Windows程序 案例2 基数转换计数器 案例3 打印杨晖三角形 案例4 确定一个月的天数 案例5 石头、剪子、布猜拳游戏 案例6 创建动态菜单 案例7 创建工具栏 案例8 递归与全局变量的案例1-打靶程序 案例9 调用VC++.NET中数学函数 案例10 在列表框中加入图片 第二章 图形图像处理—GDI+编程 案例1 绘制风格迥异的直线 案例2 绘制贝济埃曲线 案例3 不规则窗体的实现 案例4 如何在上传的图片上加上版权文字 案例5 在图片中绘制水印效果图 案例6 动态多边形 案例7 绘制一个电子时钟 案例8 图片的淡如淡出效果 案例9 放大镜游戏 案例10 生成缩略图 案例11 透明的窗体 案例12 修改图像的分辨率 案例13 Windows涂鸦程序 案例14 抓取指定区域的图像 案例15 动范例——飞碟绑架地球人 第三章 多媒体应用 案例1 flash 动播放器 案例2 OpenGL屏幕保护程序 案例3 显示器的分辨率调整 案例4 五子棋程序 案例5 制作Windows媒体播放器 案例6 会跑的按钮 案例7 CD唱机 第四章 系统文件处理 案例1 建立一个具有查找功能的文本编译器 案例2 建立文件浏览器 案例3 显示驱动器中所有目录 案例4 实现目录遍历 案例5 读写文本文件和二进制文件 案例6 访问注册表中的硬件信息 案例7 显示系统的时间与日期 案例8 模拟Windows XP关闭系统 案例9 MDI窗体菜单设计 案例10 登录对话框的实现 案例11 拖放操作的实现 案例12 创建自定义文件类型 案例13 监视系统文件的状态 第五章 硬件的控制 案例1 限制鼠标的活动区域 案例2 处理鼠标和键盘事件 案例3 打印及打印预览的实现 案例4 内存占用显示 案例5 显示系统设备 案例6 通过驱动程序控制系统外设 案例7 自动发送和接收传真 第六章 数据库应用 案例1 利用ADO.NET连接到数据源以及关闭数据库 案例2 参数化查询数据表 案例3 数据库的窗体向导和关联查询 案例4 编程实现记录编辑 案例5 单记录更新数据源 案例6 动态创建数据库和数据表 案例7 大数据量的分页显示 案例8 图像在数据库中的存储 案例9 创建动态水晶数据报表 案例10 动态创建MSChart统计图表 第七章 网络应用 案例1 获取DNS 案例2 获取自己的IP地址 案例3 在窗口中PING一个IP地址 案例4 显示指定工作组内的所有计算机 案例5 电子邮件的发送与接收 案例6 简易WEB浏览器 案例7 FTP浏览器的制作 案例8 TCP点对点联机程序 案例9 UDP联机程序 案例10 C/S分布式QQ模型聊天室 第八章 控件操作 案例1 设置控件字体 案例2 动态填充组合框 案例3 列表控件的实现 案例4 动态添加控件 案例5 动窗体的实现 第九章 综合实例 综合实例1 OpenGL视图中绘制三维物体 综合实例2 使用DirectX制作粒子系统 综合实例3 中国象棋游戏 综合实例4 电子商务系统实现(C/S)

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧