如何提高重绘速度??

kqlyjht 2009-09-02 09:01:24
我的view类继承了CScrollView类,视图大小比屏幕要大,因此需要滚动条才能看到下面的内容。因为基本上要在整个视图上花不同颜色的点,所以直接画到屏幕上每次重绘都很慢。所以我试着在内存中开辟了一个同视图一样大的位图(比屏幕要大),在位图中画出那些点,然后用BitBlt函数把内存视图拷贝到屏幕上。但是速度还是很慢。我程序中还有滚动条滚动和鼠标按下的消息响应函数,它们在执行过程中要发生窗口重绘,每次重绘时屏幕都会变白,然后再过三四秒甚至四五秒钟才能出来效果,实在是太慢了。我希望的效果是看不出来重绘.请问该如何解决??
...全文
237 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kqlyjht 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lekonpeng 的回复:]
引用 8 楼 kqlyjht 的回复:
谢谢大家!问题解决一些,之前我把绘图的函数写在了OnDraw函数中,所以每次都会在画一遍,现在我把绘图的函数写在了外面,速度快了很多。但是还是有别的问题,就是我绘图的宽度大于屏幕的宽度,因此要有个横向滚动条,每次滚动一下就要重绘一次速度很慢。老板说画好的部分直接粘到滚动后的位置上上,就画新的部分。请问该怎么粘啊?要用到什么函数?


View不用集成继承CScrollView类.
你就使用CView就可以了.每次你在View中需要显示什么就绘什么,双缓存是肯定需要的.
主要是每次滚动的时候先计算屏幕的View占整个View的那个区域.然后根据数据重绘这个区域.
之前试过110000*200000的大图,鼠标Move\滚动都丝毫没有问题.其实再大的图道理也一样,应该不会慢到哪里去.
每次画好的部分作为下次画的背景或者移动位置而只重新画新增的部分确实能省N多的时间.如你老板所说.
[/Quote]

是啊,我就是想问一下移动位置要用到什么函数啊?是要移动到屏幕上还是在内存里移动?
kqlyjht 2009-09-08
  • 打赏
  • 举报
回复
我现在是这样做的:在内存位图中把要画的东西画全,在OnDraw函数中用BitBlt函数把内存视图拷贝到屏幕上,这样CScrollView的滚动条滚动的时候基本不影响。当自己创建的小滚动条滚动的时候,再在OnDraw函数中用BitBlt函数把需要出现的部分拷贝到屏幕上盖住之前的部分,而不是重新画图,这样速度也是很快的,不过有些闪烁。但总感觉盖住之前的部分有点别扭。大家觉得这样可以么?
aigood 2009-09-08
  • 打赏
  • 举报
回复
结贴率貌似不高
我是苦力 2009-09-08
  • 打赏
  • 举报
回复
自己算啊,比如整个图左上角的坐标 0, 0. 图大 10000 * 10000
现在比如要显示区域(5000, 5000),当前屏幕为1000*800,那你需要显示的区域为(5000,5000)的位置,内容为从这个点向下或向右各 1000\800个像素的内容.把这部分的内容获取,然后绘制出来,在显示到屏幕.
lygfqy 2009-09-07
  • 打赏
  • 举报
回复
双缓冲应该用了吧?
你每次滚动之后把需要画的memdc的坐标位置画到屏幕dc就ok了
kqlyjht 2009-09-07
  • 打赏
  • 举报
回复
谢谢大家!问题解决一些,之前我把绘图的函数写在了OnDraw函数中,所以每次都会在画一遍,现在我把绘图的函数写在了外面,速度快了很多。但是还是有别的问题,就是我绘图的宽度大于屏幕的宽度,因此要有个横向滚动条,每次滚动一下就要重绘一次速度很慢。老板说画好的部分直接粘到滚动后的位置上上,就画新的部分。请问该怎么粘啊?要用到什么函数?
我是苦力 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kqlyjht 的回复:]
谢谢大家!问题解决一些,之前我把绘图的函数写在了OnDraw函数中,所以每次都会在画一遍,现在我把绘图的函数写在了外面,速度快了很多。但是还是有别的问题,就是我绘图的宽度大于屏幕的宽度,因此要有个横向滚动条,每次滚动一下就要重绘一次速度很慢。老板说画好的部分直接粘到滚动后的位置上上,就画新的部分。请问该怎么粘啊?要用到什么函数?

[/Quote]
View不用集成继承CScrollView类.
你就使用CView就可以了.每次你在View中需要显示什么就绘什么,双缓存是肯定需要的.
主要是每次滚动的时候先计算屏幕的View占整个View的那个区域.然后根据数据重绘这个区域.
之前试过110000*200000的大图,鼠标Move\滚动都丝毫没有问题.其实再大的图道理也一样,应该不会慢到哪里去.
每次画好的部分作为下次画的背景或者移动位置而只重新画新增的部分确实能省N多的时间.如你老板所说.
jvy 2009-09-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luobonic 的回复:]
提高不了,一是可能你的计算量很大或者很复杂,这里就耗时间,二是如果像素很多,gdi就会很慢。你的情况唯一能改善的就是(当然或者你改变生成图像的计算过程,内嵌汇编速度会快很多)在用户释放鼠标的时候再开始计算重绘,而不是拖一点算一点(就像Windows图片和传真查看器那样,松开手才会变)。最后,如果真的是gdi性能不佳的原因,那可能你要放弃gdi,使用其他绘图方式,比如opgl或d3d,就像3dmax¡­
[/Quote]

个人认为gdi还是可以的,感觉比gdi+强多了(在速度方面),建议楼主还是好好研究下自已的绘制方法及算法
jvy 2009-09-03
  • 打赏
  • 举报
回复
内存中创建一个大位图然后在将它BitBlt到屏幕,中间在有一个不断刷新造成反复绘制。这些哪一点都是耗时的,想法避免不这么做
luobonic 2009-09-03
  • 打赏
  • 举报
回复
提高不了,一是可能你的计算量很大或者很复杂,这里就耗时间,二是如果像素很多,gdi就会很慢。你的情况唯一能改善的就是(当然或者你改变生成图像的计算过程,内嵌汇编速度会快很多)在用户释放鼠标的时候再开始计算重绘,而不是拖一点算一点(就像Windows图片和传真查看器那样,松开手才会变)。最后,如果真的是gdi性能不佳的原因,那可能你要放弃gdi,使用其他绘图方式,比如opgl或d3d,就像3dmax里的视图那样。
jvy 2009-09-03
  • 打赏
  • 举报
回复
估计得手动计算了,只画你视窗大小的区域
先试试设置裁剪有没有效果
newplumage 2009-09-03
  • 打赏
  • 举报
回复
试试这个。

BOOL CXXXX::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
reneeland 2009-09-03
  • 打赏
  • 举报
回复
最好把你代码流程大致贴出来看看,没准的绘制操作有不当得地方~
大熊猫侯佩 2009-09-02
  • 打赏
  • 举报
回复
mark!

15,979

社区成员

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

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