关于OpenGL速度的问题.

LJN 2000-05-09 08:55:00
为什么在我的OpenGL程序中画一个图形(如茶壶)特别的慢?
然而在通一台机器上,别人的程序却那么快?
...全文
353 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
VRswan 2000-05-10
  • 打赏
  • 举报
回复
是这样的,当时我的程序使用了大约5个512*512*24bit色的贴图,这样我在场景中移动时场景的更新速度非常慢,我的显卡可是TNT2 Ultra的,跑这点东西本不应该这么慢,后来我试了一下显示列表,速度提升很明显,从原来的每秒3~4帧提高到每秒120帧左右。但是对于小的场景,用显示列表可能会降低显示速度,因为使用显示列表本身也有一定的开销的。
我说不要用aux函数,指的是不要使用aux提供的初始化类的函数,比如auxInitDisplayMode(AUX_SINGLE and AUX_INDEX);之类,这些函数自成体系,是一个给初学者的偷懒办法。如果用MFC的话,应该换成MFC提供的支持函数。
还有你的点格式没有问题,我的程序里点格式也是那个,但是你已经把颜色设置成RGBA了
而auxInitDisplayMode(AUX_SINGLE and AUX_INDEX);却又把颜色设置成index模式,这两个明显要冲突的。我把我的设置点格式函数贴在下面,你自己看看如何和mfc融合在一起

BOOL CNetViewView::bSetupPixelFormat()
{
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW and // support window
PFD_SUPPORT_OPENGL and // support OpenGL
PFD_DOUBLEBUFFER, // double buffer
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat;

if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0 )
{
MessageBox("ChoosePixelFormat failed");
return FALSE;
}

if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
{
MessageBox("SetPixelFormat failed");
return FALSE;
}

return TRUE;


}
LJN 2000-05-10
  • 打赏
  • 举报
回复
我急于了解OpenGL,所以没采用太正规的文档-视结构.用glNewList和glCallList真的能
够将30/s提高到120/s? 我试过了没什么变化. 不过我还是解决了速度问题,达到了一般
动画效果.(不过还是没有3DMax快).做法是换了一个像素格式.
那如果像你说的不好采用aux函数,那画个茶壶都太麻烦.那辅助库有什么存在的意义?
我想可能还是要用的吧? 也许有途径协调MFC和AUX吧?
LJN 2000-05-10
  • 打赏
  • 举报
回复
分全给你VRswan,希望以后更不吝赐教.
看你的情形大概也是处在学习阶段,多多联系共同进步如何?
My EMail: LiJieLin@163.net
「已注销」 2000-05-09
  • 打赏
  • 举报
回复
我想大概是DC重复次数太多,你可只用一个DC.
LJN 2000-05-09
  • 打赏
  • 举报
回复
帮我看看:

// View.h
BOOL Change = FALSE;
double size = .5;
CPoint op;

void CMfcOpenGLView::OnDraw(CDC* pDC)
{
CMfcOpenGLDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CString str;
str.Format("%f",size);
::wglMakeCurrent(pDC->m_hDC,hglrc);
display();
::wglMakeCurrent(pDC->m_hDC,NULL);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(10,10,str);
SwapBuffers(pDC->m_hDC);
}

void CMfcOpenGLView::myinit()
{
glClearColor(1.0,1.0,1.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);

}

void CMfcOpenGLView::display()
{
myinit();
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(255,0,0);
glPolygonMode(GL_FRONT,GL_POINT);
glRotatef(45,45,45,1);
auxWireTeapot(size);
glLoadIdentity();
glFlush();
}

int CMfcOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

PIXELFORMATDESCRIPTOR pfd = {
sizeof (PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW and
PFD_SUPPORT_OPENGL and
PFD_DOUBLEBUFFER and
PFD_TYPE_RGBA and
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0};


CClientDC clientdc(this);

int pf = ::ChoosePixelFormat(clientdc.m_hDC,&pfd);
BOOL rt = ::SetPixelFormat(clientdc.m_hDC,pf,&pfd);
hglrc = ::wglCreateContext(clientdc.m_hDC);
glShadeModel(!GL_SMOOTH);
auxInitDisplayMode(AUX_SINGLE and AUX_INDEX);
return 0;
}

void CMfcOpenGLView::OnDestroy()
{
CView::OnDestroy();

::wglDeleteContext(hglrc);

}

void CMfcOpenGLView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

int width = cx;
int height = cy;

CClientDC clientdc(this);
::wglMakeCurrent(clientdc,hglrc);
glViewport(0,0,200,250);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
wglMakeCurrent(NULL,NULL);
}

void CMfcOpenGLView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect rect;
this->GetClientRect(&rect);
CDC *pDC = GetDC();
this->display();
this->ReleaseDC(pDC);
}

laotong 2000-05-09
  • 打赏
  • 举报
回复
Email me your source code please.
tongzx@163.net
VRswan 2000-05-09
  • 打赏
  • 举报
回复
这么用显示列表:
glNewList(1,GL_COMPLINE)
...
...//你的画图语句
glEndList();
然后可以在OnDraw()里面调用:glCallList(1);
你说的别人的程序比你的快,那么别人的程序做什么了?是不是和你的程序功能一样呢?
我觉得你的程序里也不大对劲,现在市面上有好几本书都讲OpenGL,比如电子工业出版社的
OpenGL编程与实例,可以去找来看看,按道理说在VC里用文档-视结构的话,就不应该再用aux函数了.
LJN 2000-05-09
  • 打赏
  • 举报
回复
能否说清楚一些,我是个OpenGL初哥,手头上的书不是很好.
我只想知道我的程序为什么比别人慢这么多,如果是由于
所说的显示列表的问题,那能否告知几个关于列表操作的核心函数.
以便我有个研究的方向. 多谢.
VRswan 2000-05-09
  • 打赏
  • 举报
回复
尽量不要使用辅助库里的东西,另外再试试显示列表,我的程序在使用了显示列表以后速度由原来的3帧每秒提高到120帧每秒。可以的话看看别人程序的源代码,就可以知道为什么你的程序慢了

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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