opengl+mfc刷新一会加卡

qq758610209 2015-03-05 06:06:29
我在MFC的CView上用openGL画了一个三维坐标系,想让这个坐标系可以随着鼠标的拖动随时旋转。现在生成项目后,转动一会就卡了。到底是哪部分的问题?我在onPaint事件中绘制,然后在鼠标转动事件中用InvalidateRect或Invalidate来刷新。可是一开始不卡,一会就卡了。问题出在哪?代码太多也不能贴出来....................
...全文
211 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-03-11
  • 打赏
  • 举报
回复
引用 11 楼 qq758610209 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 搜网络教程“学OpenGL编3D游戏”。
没有时间再拿出来专门学opengl。[/quote] 参考人家的例子代码为什么不卡。
qq758610209 2015-03-11
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
搜网络教程“学OpenGL编3D游戏”。
没有时间再拿出来专门学opengl。
sparrow429 2015-03-10
  • 打赏
  • 举报
回复
我也觉得是ONPAINT,里面wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC); 这句话的问题
赵4老师 2015-03-10
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”。
Sandrer 2015-03-07
  • 打赏
  • 举报
回复
其实除了我所说的问题外,你的其它代码我压根看不懂....................... 功力尚浅,等其他人再看看还有没有什么问题吧
Sandrer 2015-03-07
  • 打赏
  • 举报
回复
暂时没发现什么问题,但是在 OnPaint 里面你就搞了三个dc出来了 首先 CPaintDC dc(this) 这就是一个 Init 里面你又来一个 GetDC() 回到 OnPaint 里面 wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC); 这里你又搞了个 CPaintDC 这东西呢,在声明周期结束后会自动释放 但调用 GetDC 就要有相应的 ReleaseDC,看了下代码也没看到你调用 ReleaseDC 这里就已经有两个泄漏的地方了 而且很明显你后面的两次 GetDC 都是多余的,CPaintDC dc(this) 已经帮你弄了一个dc了你还去获取 况且在 OnPaint 里面调用 GetDC 是很不明智的,等于要系统帮你再画一次东西
赵4老师 2015-03-06
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏! 补齐漏掉的 CloseHandle Release DeleteObject ……
lougd 2015-03-06
  • 打赏
  • 举报
回复
OnPaint的这段代码放到OnCreate里试下,另外看下任务管理器是否有内存泄露。
Init();
    CRect rectCtrl;
    GetClientRect(rectCtrl);
    SetSceneSize(rectCtrl.Width(), rectCtrl.Height())
qq758610209 2015-03-06
  • 打赏
  • 举报
回复
引用 1 楼 Sandrer 的回复:
资源没释放好
我上传了代码,您帮忙看看是怎么回事,先谢为敬!
qq758610209 2015-03-06
  • 打赏
  • 举报
回复
上传上代码大神们给看看吧。 先是.cpp文件

View1::View1()
{	
	m_pDC			= NULL;
	m_hRC			= NULL;
	m_nLines		= 50;   //背景网格线数
	m_glfGridUnit	= 10;   //网格尺寸
	m_distance		= 500.0;  //距离
       m_rotateX		= PI * 0.5; //航向角,pi*0.5
	m_rotateY		= PI * 0.4; //俯仰角,pi*0.4
	//设置视点
	m_glfViewPosX = m_distance * sin(m_rotateY) * cos(m_rotateX);  
	m_glfViewPosZ = m_distance * sin(m_rotateY) * sin(m_rotateX);
	m_glfViewPosY = m_distance * cos(m_rotateY);
}
void View1::OnPaint()
{
	CPaintDC dc(this); 
	Init();
	CRect rectCtrl;
	GetClientRect(rectCtrl);
	SetSceneSize(rectCtrl.Width(), rectCtrl.Height());
	wglMakeCurrent(this->GetDC()->GetSafeHdc(), m_hRC);
	RenderScene();
	SwapBuffers(m_pDC->m_hDC);
	wglMakeCurrent(m_pDC->m_hDC, NULL);
}
void View1::Init()
{
	GLuint	glnPixelFormat;
	static PIXELFORMATDESCRIPTOR	pfd	 = {
		sizeof(PIXELFORMATDESCRIPTOR),	//size of this pfd
		1,								//version number
		PFD_DRAW_TO_WINDOW |			//support window
		PFD_SUPPORT_OPENGL |			//support OpenGL
		PFD_DOUBLEBUFFER,				//double buffered
		PFD_TYPE_RGBA,					//RGBA type
		16,								//16-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
		16,								//16-bits buffer
		0,								//no stencil buffer
		0,								//no auxiliary buffer
		PFD_MAIN_PLANE,					//main layer
		0,								//reserved
		0, 0, 0							//layer masks ignored
	};
         m_pDC=GetDC();
	glnPixelFormat	= ChoosePixelFormat(m_pDC->m_hDC, &pfd);
	SetPixelFormat(m_pDC->m_hDC, glnPixelFormat, &pfd);
	m_hRC			= wglCreateContext(m_pDC->m_hDC);
	wglMakeCurrent(m_pDC->m_hDC, m_hRC);
	glShadeModel(GL_SMOOTH);
	glClearColor(255,255,255,0.5f);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void View1::SetSceneSize(GLsizei glsWidth, GLsizei glsHeight)
{
	float	fRatioWH;
	fRatioWH	= float(glsWidth)/glsHeight;
	glViewport(0, 0, glsWidth, glsHeight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(35.0f, fRatioWH, 0.01f, 1000.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void View1::RenderScene()
{
	glClearColor(250,250,250);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	gluLookAt(m_glfViewPosX, m_glfViewPosY, m_glfViewPosZ, 0, 50, 0, m_0, 1, 0);
         DrawGrid();
}
void View1::DrawGrid()
{
	glLineWidth(2.0f);
	glBegin(GL_LINES);
		glColor3f(0,0,0);
		//横线
		glVertex3f(-m_glfGridUnit*m_nLines, 0, 0);
		glVertex3f( m_glfGridUnit*m_nLines, 0, 0);
		//纵线
		glVertex3f( 0, 0, -m_glfGridUnit*m_nLines);
		glVertex3f( 0, 0,  m_glfGridUnit*m_nLines);
		//垂线
		glVertex3f( 0, 0, 0);
		glVertex3f( 0, m_glfGridUnit*m_nLines, 0);
	glEnd();

	glLineWidth(0.1f);
	glBegin(GL_LINES);
	glColor3f(120,120,120);
		for(int i=1; i<=m_nLines; i++)
		{
			//横线
			glVertex3f(-m_glfGridUnit*m_nLines, 0, m_glfGridUnit*i);
			glVertex3f( m_glfGridUnit*m_nLines, 0, m_glfGridUnit*i);
			glVertex3f(-m_glfGridUnit*m_nLines, 0, -m_glfGridUnit*i);
			glVertex3f( m_glfGridUnit*m_nLines, 0, -m_glfGridUnit*i);
			//纵线
			glVertex3f( m_glfGridUnit*i, 0, -m_glfGridUnit*m_nLines);
			glVertex3f( m_glfGridUnit*i, 0,  m_glfGridUnit*m_nLines);
			glVertex3f(-m_glfGridUnit*i, 0, -m_glfGridUnit*m_nLines);
			glVertex3f(-m_glfGridUnit*i, 0,  m_glfGridUnit*m_nLines);
		}
	glEnd();	
}
void View1::OnLButtonUp(UINT nFlags, CPoint point)
{
	m_MouseDownPoint=CPoint(0,0);
	ReleaseCapture();
	SetFocus();
	CView::OnLButtonUp(nFlags, point);
}
void View1::OnMouseMove(UINT nFlags, CPoint point)
{
	if (GetCapture()==this)
	{
		m_rotateX += (point.x-m_MouseDownPoint.x)/100.0f;
		m_rotateY += (point.y-m_MouseDownPoint.y)/100.0f;

		// 限制方向
		if(m_rotateY > PI/2.2)	m_rotateY = PI/2.2;   
		if(m_rotateY < 0.01)	m_rotateY = 0.01;
		if(m_rotateX > 2*PI)	m_rotateX = 0.01;
		if(m_rotateX < 0)		m_rotateX = 2 * PI;
		m_glfViewPosX = m_distance * sin(m_rotateY) * cos(m_rotateX);  
		m_glfViewPosZ = m_distance * sin(m_rotateY) * sin(m_rotateX);
		m_glfViewPosY = m_distance * cos(m_rotateY);
		InvalidateRect(this->GetSafeHwnd(),,FALSE);
		m_MouseDownPoint=point;
	};
	CView::OnMouseMove(nFlags, point);
}


void View1::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_MouseDownPoint=point;
	SetCapture();
	SetFocus();
	CView::OnLButtonDown(nFlags, point);
}
void View1::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);
	wglMakeCurrent(m_pDC->m_hDC, m_hRC);
	SetSceneSize(cx, cy);
	wglMakeCurrent(m_pDC->m_hDC, NULL);
}
void View1::OnDestroy()
{
	wglMakeCurrent(m_pDC->m_hDC, NULL);
	wglDeleteContext(m_hRC);
	CView::OnDestroy();
}
下面是头文件中的变量

CPoint		m_MouseDownPoint;	//鼠标点击位置
	CDC*		m_pDC;
	HGLRC		m_hRC;
	GLfloat		m_distance;			//距离
	GLfloat		m_rotateX;		//航向角
	GLfloat		m_rotateY;	    //俯仰角	int			m_nLines;	//背景网格线数
	GLfloat		m_glfGridUnit;	//网格尺寸
	COLORREF	m_clrBackgroud, m_clrGridAxse, m_clrGridLine;			//背景网格的颜色
	GLfloat		m_glfViewPosX,		m_glfViewPosY,		m_glfViewPosZ,		//视点坐标
qq758610209 2015-03-06
  • 打赏
  • 举报
回复
引用 4 楼 u011391040 的回复:
OnPaint的这段代码放到OnCreate里试下,另外看下任务管理器是否有内存泄露。
Init();
    CRect rectCtrl;
    GetClientRect(rectCtrl);
    SetSceneSize(rectCtrl.Width(), rectCtrl.Height())
还是跑一会就卡
Sandrer 2015-03-05
  • 打赏
  • 举报
回复
资源没释放好

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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