您的位置:程序门 -> vc/mfc -> 图形处理/算法



请教gdi,opengl,directx画二维图形速度哪个更快?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请教gdi,opengl,directx画二维图形速度哪个更快?[已结贴,结贴人:dy2003]
发表于: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(...)
}
发表于:2007-02-06 15:12:151楼 得分:5
directx   does   directly   operates   the   memory   of   video   card.
it   lets   you   interact   with   video   and   audio   hardware   installed   on   your   system   in   a   device-independent   manner.

opengl   is   optimized   on   3-dimentions   space   that 's   a   framework   as   well   as   crossing   different   plaform   and   system.

gdi   does   not   access   the   graphics   hardware   directly.   instead,   gdi   interacts   with   device   drivers   on   behalf   of   applications.
发表于:2007-02-06 18:12:442楼 得分:5
directx应该是最快的,能直接操作视频缓冲.如果不快那就是你的算法有问题.
发表于:2007-02-06 20:52:453楼 得分:0
因为要处理的数据量太大,可能有几十万个填充,gdi的算法已经优化了,原想opengl应该速度会快些,结果比gdi还慢,directx没用过,想先求证一下,是不是会快很多.
发表于:2007-02-06 21:32:554楼 得分:0
用directx满屏幕1024*768个点的刷也能做到每秒30祯呢
发表于:2007-03-13 13:33:215楼 得分:10
我看还是要改进一下绘制算法,再多的数据,人眼看的只是一部分。
只画要看到的部分,被盖住的部分也可省略,反正都看不到。
至于具体的优化方式,还需要你自己根据数据的特点进行研究
发表于:2007-03-13 18:39:016楼 得分:10
//gdi中画图
for   (int   i=1;i <100000;i++)  
{
rectangle(...)
}

画十万个矩形吗?我用的是direct3d,生成一个600*600点阵组成的地形图,direct3d中没有直接画矩形的函数,都是三角形,我用的基本图元是三角形带。地形中共有(2*600-2)*(600-1)=717602个三角形。画的速度很快,没测过,反正远少于一秒,因为缩放移动时没有明显的停顿。在direct3d中画框和填充只是一个模式选择,速度是一样的。

不过d3d中画三角形的速度也许和基本图元有关系,你是一个一个画的,十万个矩形就画了十万次,我用的三角形带,600*600的点阵共有599个三角形带,所以我只画了599次,区别是我每次画了(2*600-2)个三角形,是不是这里面d3d有优化就不知道了。opengl没有用过,但是它用类似的基本图元来画的话,应该也要比gdi要快得多。在3d游戏中每个场景几十万个三角形的填充都是小case,如果都要好几秒的话,这游戏就没法玩了。
发表于:2007-03-13 18:53:277楼 得分:0
应该是direct吧,反正我觉得opengl没direct快,gdi对于下小程序来说来不错
发表于:2007-03-14 10:18:228楼 得分:5
楼主的比较没有考虑初始化的时间吧。另外,如楼上一头猪所说,用3d画点并没有明显的优势的。
发表于:2007-03-14 10:30:429楼 得分:5
如楼上一头猪所说,用3d画点并没有明显的优势的。
发表于:2007-03-14 11:13:5310楼 得分:0
剽窃是不好的。
发表于:2007-03-15 18:04:2011楼 得分:0
剽窃是不好的。
发表于:2007-03-16 18:45:4612楼 得分:0
gdi+的填充。。。

现在在用agg做一个模拟gdi+接口的库。
发现gdi+在渐变填充方面的速度那是相当的快。。。


快速检索

最新资讯
热门点击