急!如何利用GDI进行高速绘图,请各位星星角角畅所欲言!

zswzwy 2005-05-19 12:14:05
目的:上百个复杂图行,用CDC进行绘制,输出在屏幕上。
目标:现在时间5秒,期望时间1~2秒。
实现:一切办法均可,只要满足时间要求,请各位出招!
...全文
695 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahzhuo 2005-05-30
  • 打赏
  • 举报
回复
个人认为上面的绝大部分讨论都不得要领。

如果是“绘制”图形的话,DirectDraw 没有任何优势——它并没有提供任何几何图形绘制函数,它只是能提供直接现存操作而已,绘制的快慢还是受制于绘图算法的优劣和 CPU 的速度。使用 DirectDraw 的优势是在于可以大大提高 2D 位图传送(blit)而已,因为它可以利用硬件来实现该功能。

既然楼主说:“算法已无法再优化”了,那么只能从提升一些绘图元操作的性能入手了。可以想办法提高点、线、曲线、填充以及贴图等等的速度。毋庸置疑,充分利用硬件是最为有效的办法。但是 GDI 对于硬件的支持和优化是有限的(并不是没有),这方面 Direct3D 和 OpenGL 做得要好得多,建议楼主将绘图的元操作都移植到 Direct3D 或者 OpenGL 上(OpenGL 据说是工业标准),这样就可以充分发挥显卡的性能,并且可以根据需要加大对硬件的投资从而获得速度的提升,并且可以与显卡技术的进步而轻易获得性能的再次提升。
xlzxlich 2005-05-30
  • 打赏
  • 举报
回复
楼主 不会那么慢吧!
我采用双缓存绘制全国地图,全屏显示都行的。
加个判断 图形在不在视图内
donggua123 2005-05-25
  • 打赏
  • 举报
回复
请讲重点
zswzwy 2005-05-25
  • 打赏
  • 举报
回复
如果图形很复杂,生成很慢,但不怎么变化,那么考虑使用内存缓冲画好的图片. 更新窗口时从内存直接拷贝过来. 只有图形变化的时候才更新内存.


我觉得这个方法不错。

请大家继续!
chen18s 2005-05-25
  • 打赏
  • 举报
回复
我只知道,一般以全屏幕方式进行绘图,速度会提升一些
目前,请叫我角角角角
MikeChen2003 2005-05-25
  • 打赏
  • 举报
回复
慢在那个鸟地方?
是载入慢,还是从内存到屏幕的显示慢?
如果载入慢就欺骗软件使用者,在程序启动时一次把图片全载入进来。
AntonlioX 2005-05-22
  • 打赏
  • 举报
回复
up
newcore 2005-05-22
  • 打赏
  • 举报
回复
这个帖子要mark
fireseed 2005-05-22
  • 打赏
  • 举报
回复
嫌GDI慢就表用GDI了,自己用算法生成一张位图,再画到屏幕上,就看你的算法快不快。

你用算法来实现在位图上画一条线,看看能比GDI快多少

dawndu 2005-05-21
  • 打赏
  • 举报
回复
实践证明. 即使是绘制一条简单的中等长度的直线,也比检测100次矩形相交来得慢许多.
我刚刚测试了一下,在windows下画一个有10个点的折线,比矩形相交检测慢不只100倍,而是上千到万的区别,画图的开销怎么这么大啊,矩形检测就是个判断语句,速度很快的
dawndu 2005-05-21
  • 打赏
  • 举报
回复
我建议此贴置顶吧
dawndu 2005-05-21
  • 打赏
  • 举报
回复
实践证明. 即使是绘制一条简单的中等长度的直线,也比检测100次矩形相交来得慢许多.
_____________________________________________________________________________
这个怎么测的,那对于这个方法提高效率的速度真是很可观了
jerry 2005-05-21
  • 打赏
  • 举报
回复
如果图形很复杂,生成很慢,但不怎么变化,那么考虑使用内存缓冲画好的图片. 更新窗口时从内存直接拷贝过来. 只有图形变化的时候才更新内存.

如果图形更新快的话,要优化绘图算法, 更新窗口的时候尽量减少更新区域. 绘图的时候对绘图区域进行检测, 只有位于区域内的部分才绘制,而其它部分都可以省略. 这对于经常有局部小部分变化的图形来说,效率比较高的. 实践证明. 即使是绘制一条简单的中等长度的直线,也比检测100次矩形相交来得慢许多. 所以绘图的时候尽量多检测.排除那么不需要重绘的单元
xqk 2005-05-21
  • 打赏
  • 举报
回复
mark
fireseed 2005-05-21
  • 打赏
  • 举报
回复
用rational purify测一下,看哪些代码是瓶颈
赖勇浩 2005-05-21
  • 打赏
  • 举报
回复
看来我只能偷偷招,帮楼主顶的份了.
djfu 2005-05-20
  • 打赏
  • 举报
回复
强贴先mark
zswzwy 2005-05-20
  • 打赏
  • 举报
回复
再补充一下:不可能局部刷新,双缓冲无效果,只能用GDI,不能用GDI+和Directx,
请大家继续.
dawndu 2005-05-20
  • 打赏
  • 举报
回复
基本的方法是用双缓冲,首先算法要优化,然后对于没有落在屏幕区域的就不去画,还有能局部刷新的就不要全屏刷新,这些对于一般的东西都可以搞定,GDI每一个细节都有可能导致效率低下,要注意细节
比较高级的方法好像是用一个线程在后台绘图,绘在一个比较大的视频缓冲表面,第一次要比较长的时间,然后用ScrollDC就可以浏览了,这样不用经过system bus,所以比较快,不过这个方法我没有用过
最快的就是用Directx了,这是没有办法的办法
在GDI下有什么高招,大家再说说,我觉得这个问题是很有意思的话题,这个技术掌握了,也是很有用的,看别人AutoCAD做的,精华啊
newzk 2005-05-20
  • 打赏
  • 举报
回复
给分不
加载更多回复(11)

16,472

社区成员

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

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

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