用OpenGL画三维图,大概几万个数据,重绘的时候很慢很慢

Frog1228 2011-04-06 04:06:31
如题,我用OpenGL画三维图,数组里大概就几万个点数据,但重绘的时候很慢很慢。之前我用同样的程序已经显示过同样大小的数据,速度很快的,后来整个工程经过改动,也加了些其它的功能,再用同样的程序绘制三维图形就很慢很慢。我不知道出现这样问题的原因是什么,以及该如何解决,也没有概念画多大数据算是很大。希望清楚的朋友能够不吝赐教。
...全文
807 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frog1228 2011-05-03
  • 打赏
  • 举报
回复
我查到什么问题了,是显卡驱动的问题。结贴。
Frog1228 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mylanyuer 的回复:]
引用 15 楼 mjjackey 的回复:
引用 14 楼 mylanyuer 的回复:
glFlush()不要调用很多遍,另外,你不是用的双缓冲吗?怎么没看到SwapBuffers()?
我没用过C#,不过在MFC和Win32中都会用这个的

我好像没用到双缓冲,它的作用是什么?那我加上试试看。

简单地讲,OpenGL提供2个颜色缓冲区,一个用于绘制计算,一个用于屏幕显示,绘制完……
[/Quote]
最近忙得先做其它的,还没空来解决这个问题。我后来又重新建立个工程,单纯就显示一个OpenGL窗口,也是同样的问题,我拉动一下窗口,最大化,最小化就很慢。会不会是操作系统的问题,因为我后来重装过一次操作系统。
Frog1228 2011-04-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xianglitian 的回复:]
那就不好说了
[/Quote]
最近忙得先做其它的,还没空来解决这个问题。我后来又重新建立个工程,单纯就显示一个OpenGL窗口,也是同样的问题,我拉动一下窗口,最大化,最小化就很慢。会不会是操作系统的问题,因为我后来重装过一次操作系统。
月中蓝 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mjjackey 的回复:]
引用 14 楼 mylanyuer 的回复:
glFlush()不要调用很多遍,另外,你不是用的双缓冲吗?怎么没看到SwapBuffers()?
我没用过C#,不过在MFC和Win32中都会用这个的

我好像没用到双缓冲,它的作用是什么?那我加上试试看。
[/Quote]
简单地讲,OpenGL提供2个颜色缓冲区,一个用于绘制计算,一个用于屏幕显示,绘制完成后两个缓冲区交换,原来显示的缓冲区现在绘制,绘制的缓冲区现在显示。。。
很显然这种方式比单缓冲的效率更高,适合处理有动画的场景绘制,我看你的程序里有鼠标操作,也就是有动画,所以用双缓冲是有必要的。
在Windows中,开双缓冲Double Buffer一般要设置DC的像素格式,你这个我不是很清楚
----------
仅供参考啊,你自己也再查查
向立天 2011-04-09
  • 打赏
  • 举报
回复
那就不好说了
Frog1228 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xianglitian 的回复:]
引用 13 楼 mjjackey 的回复:

引用 11 楼 xianglitian 的回复:
几万不算大
你也说了原来是好用的
是你添加功能导致的
代码我没看
C#我不是很熟

你再来看一下吧,我把坐标的显示都去掉,窗体构造函数里也不把数组传进去,只让它显示一个最基本的OpenGL窗口,加个坐标轴,重绘也很慢,看来不是数据的问题,是OpenGL基本配置的问题,但是问题到底出在哪……
[/Quote]
之前确实是没问题,我也没用到多线程和时钟消息。
向立天 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mjjackey 的回复:]

引用 11 楼 xianglitian 的回复:
几万不算大
你也说了原来是好用的
是你添加功能导致的
代码我没看
C#我不是很熟

你再来看一下吧,我把坐标的显示都去掉,窗体构造函数里也不把数组传进去,只让它显示一个最基本的OpenGL窗口,加个坐标轴,重绘也很慢,看来不是数据的问题,是OpenGL基本配置的问题,但是问题到底出在哪呢?急啊!!!
[/Quote]
那你之前说OpenGL没问题
到底有没有问题
你有没有用多线程或时钟消息什么的
Frog1228 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mylanyuer 的回复:]
glFlush()不要调用很多遍,另外,你不是用的双缓冲吗?怎么没看到SwapBuffers()?
我没用过C#,不过在MFC和Win32中都会用这个的
[/Quote]
我好像没用到双缓冲,它的作用是什么?那我加上试试看。
月中蓝 2011-04-09
  • 打赏
  • 举报
回复
glFlush()不要调用很多遍,另外,你不是用的双缓冲吗?怎么没看到SwapBuffers()?
我没用过C#,不过在MFC和Win32中都会用这个的
Frog1228 2011-04-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
几万不算大
你也说了原来是好用的
是你添加功能导致的
代码我没看
C#我不是很熟
[/Quote]
你再来看一下吧,我把坐标的显示都去掉,窗体构造函数里也不把数组传进去,只让它显示一个最基本的OpenGL窗口,加个坐标轴,重绘也很慢,看来不是数据的问题,是OpenGL基本配置的问题,但是问题到底出在哪呢?急啊!!!
Frog1228 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
几万不算大
你也说了原来是好用的
是你添加功能导致的
代码我没看
C#我不是很熟
[/Quote]
哦,其实OpenGL那些函数和VC里都是一样的。
向立天 2011-04-08
  • 打赏
  • 举报
回复
几万不算大
你也说了原来是好用的
是你添加功能导致的
代码我没看
C#我不是很熟
Frog1228 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]
那也不应该啊
[/Quote]
那几万个数据量大吗?我没有这个概念,你帮着看看上面的代码呢,看看有什么问题。
Frog1228 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xianglitian 的回复:]
那也不应该啊
[/Quote]
所以我就不知道为什么会这样,该怎么解决。
向立天 2011-04-07
  • 打赏
  • 举报
回复
那也不应该啊
Frog1228 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xianglitian 的回复:]
引用 5 楼 mjjackey 的回复:

引用 4 楼 xianglitian 的回复:
你加了什么功能导致变慢了

不是在OpenGL显示中加功能,是整个软件的其它功能,显示部分一点都没改。
那就怪了
怎么会影响到这边
[/Quote]
是的,估计和内存分配有点关系,因为调用了一些VC写的DLL,涉及到指针和内存的分配,调试的时候在指针,参数匹配,内存分配上出现了些很难解决的问题。
向立天 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mjjackey 的回复:]

引用 4 楼 xianglitian 的回复:
你加了什么功能导致变慢了

不是在OpenGL显示中加功能,是整个软件的其它功能,显示部分一点都没改。
[/Quote]那就怪了
怎么会影响到这边
Frog1228 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xianglitian 的回复:]
你加了什么功能导致变慢了
[/Quote]
不是在OpenGL显示中加功能,是整个软件的其它功能,显示部分一点都没改。
向立天 2011-04-07
  • 打赏
  • 举报
回复
你加了什么功能导致变慢了
Frog1228 2011-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bhybhybhy2 的回复:]
你把你软件的代码给我,我看看
[/Quote]
接着上楼

private void InitializeComponent()
{
this.SuspendLayout();
//
// DIC_3DShow
//
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DIC_3DShow_MouseMove);
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.DIC_3DShow_MouseClick);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DIC_3DShow_MouseDown);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DIC_3DShow_MouseUp);
this.ResumeLayout(false);
}

private void DIC_3DShow_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//bRender = !bRender;
HEIGHT_RATIO += 2;
Refresh();
}
}

private void DIC_3DShow_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Middle)
{
lastX = e.X;
lastY = e.Y;
isMouseDown = true;
}
}

private void DIC_3DShow_MouseMove(object sender, MouseEventArgs e)
{
int x, y;
if (e.Button == MouseButtons.Middle && isMouseDown == true)
{
x = e.X;
y = e.Y;
rotationY += (x - lastX)/10; //鼠标在X方向上移动,相当于绕Y轴旋转
rotationX += (y - lastY)/10; //鼠标在Y方向上移动,相当于绕X轴旋转
Refresh();
}
}

private void DIC_3DShow_MouseUp(object sender, MouseEventArgs e)
{
isMouseDown = false;
}
}
加载更多回复(2)

19,472

社区成员

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

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