GDI+ 绘制位图 和 绘制矢量图 的效率问题 请教

jemasw 2013-05-13 08:05:47
请问各位,
如果使用GDI+进行绘图,假设绘图内容有1024*768个圆圈,然后给圆圈填充颜色。 我试着用绘制位图的方式进行绘图,发现很卡很卡,很久才能够画出来。请问绘图上有什么技巧吗???
还有,是不是改用矢量图的绘图方式会更快,同样地,用这种方法有什么技巧吗???
...全文
602 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-05-24
  • 打赏
  • 举报
回复
引用 21 楼 jemasw 的回复:
[quote=引用 19 楼 tomsoft 的回复:] [quote=引用 18 楼 jemasw 的回复:] [quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗??? 现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。 关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片???? 我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。[/quote] 多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形 可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上[/quote] 不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。 目前采用的方法:1、查找当前在视窗的圆并且画出来。 想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??[/quote] 个人习惯,我比较习惯用CreateDIBSection 另外,如果是3D的CAD,我建议您考虑使用OpenGL,这样即使画线框也比较方便;2D的可以考虑矢量引擎;主要原因是如果是CAD,输出品质您要考虑,同时您还在作缩放,因此,引擎最好支持抗锯齿 ---- 这个时候再用位图方式未必合适
jemasw 2013-05-23
  • 打赏
  • 举报
回复
引用 19 楼 tomsoft 的回复:
[quote=引用 18 楼 jemasw 的回复:] [quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗??? 现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。 关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片???? 我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。[/quote] 多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形 可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上[/quote] 不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。 目前采用的方法:1、查找当前在视窗的圆并且画出来。 想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??
「已注销」 2013-05-21
  • 打赏
  • 举报
回复
引用 18 楼 jemasw 的回复:
[quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗??? 现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。 关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片???? 我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。[/quote] 多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形 可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上
jemasw 2013-05-21
  • 打赏
  • 举报
回复
引用 9 楼 tomsoft 的回复:
哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗??? 现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。 关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片???? 我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。
jemasw 2013-05-21
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。
我后来尝试了这个方法,的确是快了很多很多。但是现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。 关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案。 我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。
「已注销」 2013-05-16
  • 打赏
  • 举报
回复
引用 10 楼 q308865427 的回复:
这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了
DC本身没有错,实际上我自己的这个矢量绘图引擎也是使用的DC,后来我自己作的Flash播放器用DC也很容易破百;关键是算法:DC在不合理的算法下是瓶颈,所以最简单的办法是少调用;另外,多数情况下大家绘制图形,如圆喜欢直接使用圆的方程,实际这是不对的;因为通过描点画圆效能很低的;不合理的算法用DC还是DirectX实质上没什么差别,这种矢量图形的瓶颈是图形的计算,尤其在有几万甚至几十万的多边形时(如Flash的场景中经常可能存在数十万的曲线绘制)
「已注销」 2013-05-16
  • 打赏
  • 举报
回复
引用 12 楼 a292643788 的回复:
[quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
弱弱地问一下,工程编译通过了,但怎么程序运行不了?[/quote] 这个程序分成两个部分:1)一个是生成一个通用的库,包含LibOpenVG和平台无关的Platform。2)另一个是一系列的验证程序。实际您使用的应该是那个DLL库,这个要配合您自己的程序;您可以参考相关的示范程序,看怎样使用这些库,比如clock为例: 1)使用VC++ 2005打开samples\clock下的工程文件 2)通常情况下直接编译运行就可以了;生成的配置可执行文件在:../../bin/win32\$(ProjectName).exe(见配置文件) 3)同理,您可以打开Samples目录下的其他工程;那些都是各种使用OVG写的示范程序,您可以对照这些程序或从直接修改这些程序入手 OpenVG是我几年前写的程序,时间隔的太久了。如果有什么不明白,我自己可能也要再试试
「已注销」 2013-05-16
  • 打赏
  • 举报
回复
引用 11 楼 a292643788 的回复:
[quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
矢量图形库里有没有画无锯齿的直线,圆的函数?[/quote]
引用 11 楼 a292643788 的回复:
[quote=引用 9 楼 tomsoft 的回复:] 哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
矢量图形库里有没有画无锯齿的直线,圆的函数?[/quote] 矢量图形设置为低画质,实质就是无抗锯齿
旭日夕阳 2013-05-16
  • 打赏
  • 举报
回复
引用 9 楼 tomsoft 的回复:
哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
弱弱地问一下,工程编译通过了,但怎么程序运行不了?
旭日夕阳 2013-05-16
  • 打赏
  • 举报
回复
引用 9 楼 tomsoft 的回复:
哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
矢量图形库里有没有画无锯齿的直线,圆的函数?
水瓶座雨夕 2013-05-16
  • 打赏
  • 举报
回复
学习 学习 学习
q308865427 2013-05-15
  • 打赏
  • 举报
回复
这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了
「已注销」 2013-05-15
  • 打赏
  • 举报
回复
哦,还忘一点: 1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质
「已注销」 2013-05-15
  • 打赏
  • 举报
回复
和双缓冲没有关系,给您几个建议可以试试: 1)使用成熟的矢量图形库,一般这些库都会作优化;我自己有个这样的库(可以媲美商业版本),您可以试试:http://download.csdn.net/detail/tomsoft/328524 其中针对矢量图形做了很多的优化 另外如果您自己想写算法,有几点可以考虑: 1)关于圆的绘图算法;不要使用标准椭圆算法,因为有二次运算,效能会比较低。可以考虑使用Bezier拟合,这样在使用扫描线算法绘制图形时只有简单乘除法就可以了(好像要用什么德卡斯特算法,记不清楚了) 2)不要用浮点数;矢量图形用FixedPoint对效能会有很大提升,即使是PC 3)使用脏矩形算法;对于有多个图形,使用脏矩形算法是最合适的算法 4)使用ScanLine算法:不要自以为是的使用简单的圆算法,配合1 5)尽量不要使用Alpha,Alpha在任何情况下对性能来说都是大忌 这个示例是我自己的矢量图形库绘制的,使用了Alpha;如果没有Alpha,图形库效能还会有甚至几十倍的提升
傻X 2013-05-15
  • 打赏
  • 举报
回复
这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。
laviewpbt 2013-05-15
  • 打赏
  • 举报
回复
这个卡和双缓冲没有任何关系,GDI+就是这样的速度。绘制1024*768个圆对GDI+来说就是个不可胜任的工作。
ai_at_china 2013-05-15
  • 打赏
  • 举报
回复
用双缓冲方式试试,可以从一定程度解决闪烁的问题。具体代码可以搜搜“双缓冲”。
jemasw 2013-05-15
  • 打赏
  • 举报
回复
旭日夕阳 2013-05-14
  • 打赏
  • 举报
回复
同问!
jemasw 2013-05-14
  • 打赏
  • 举报
回复
顶起,哪位前辈能够赐教。
加载更多回复(1)

19,468

社区成员

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

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