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

时间:2022-02-03 06:52:07
请问各位,
    如果使用GDI+进行绘图,假设绘图内容有1024*768个圆圈,然后给圆圈填充颜色。   我试着用绘制位图的方式进行绘图,发现很卡很卡,很久才能够画出来。请问绘图上有什么技巧吗???
还有,是不是改用矢量图的绘图方式会更快,同样地,用这种方法有什么技巧吗???

22 个解决方案

#1


顶起,哪位前辈能够赐教。

#2


顶起,哪位前辈能够赐教。

#3


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

#4


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

#5


用双缓冲方式试试,可以从一定程度解决闪烁的问题。具体代码可以搜搜“双缓冲”。

#6


这个卡和双缓冲没有任何关系,GDI+就是这样的速度。绘制1024*768个圆对GDI+来说就是个不可胜任的工作。

#7


这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。

#8


和双缓冲没有关系,给您几个建议可以试试:
1)使用成熟的矢量图形库,一般这些库都会作优化;我自己有个这样的库(可以媲美商业版本),您可以试试:http://download.csdn.net/detail/tomsoft/328524 其中针对矢量图形做了很多的优化
另外如果您自己想写算法,有几点可以考虑:
1)关于圆的绘图算法;不要使用标准椭圆算法,因为有二次运算,效能会比较低。可以考虑使用Bezier拟合,这样在使用扫描线算法绘制图形时只有简单乘除法就可以了(好像要用什么德卡斯特算法,记不清楚了)
2)不要用浮点数;矢量图形用FixedPoint对效能会有很大提升,即使是PC
3)使用脏矩形算法;对于有多个图形,使用脏矩形算法是最合适的算法
4)使用ScanLine算法:不要自以为是的使用简单的圆算法,配合1
5)尽量不要使用Alpha,Alpha在任何情况下对性能来说都是大忌
GDI+ 绘制位图 和 绘制矢量图 的效率问题 请教
这个示例是我自己的矢量图形库绘制的,使用了Alpha;如果没有Alpha,图形库效能还会有甚至几十倍的提升
   

#9


哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

#10


这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了

#11


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?

#12


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

弱弱地问一下,工程编译通过了,但怎么程序运行不了?

#13


学习 学习 学习

#14


引用 11 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?


引用 11 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?


矢量图形设置为低画质,实质就是无抗锯齿

#15


引用 12 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

弱弱地问一下,工程编译通过了,但怎么程序运行不了?

这个程序分成两个部分:1)一个是生成一个通用的库,包含LibOpenVG和平台无关的Platform。2)另一个是一系列的验证程序。实际您使用的应该是那个DLL库,这个要配合您自己的程序;您可以参考相关的示范程序,看怎样使用这些库,比如clock为例:
1)使用VC++ 2005打开samples\clock下的工程文件
2)通常情况下直接编译运行就可以了;生成的配置可执行文件在:../../bin/win32\$(ProjectName).exe(见配置文件)
3)同理,您可以打开Samples目录下的其他工程;那些都是各种使用OVG写的示范程序,您可以对照这些程序或从直接修改这些程序入手

OpenVG是我几年前写的程序,时间隔的太久了。如果有什么不明白,我自己可能也要再试试

#16


引用 10 楼 q308865427 的回复:
这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了


DC本身没有错,实际上我自己的这个矢量绘图引擎也是使用的DC,后来我自己作的Flash播放器用DC也很容易破百;关键是算法:DC在不合理的算法下是瓶颈,所以最简单的办法是少调用;另外,多数情况下大家绘制图形,如圆喜欢直接使用圆的方程,实际这是不对的;因为通过描点画圆效能很低的;不合理的算法用DC还是DirectX实质上没什么差别,这种矢量图形的瓶颈是图形的计算,尤其在有几万甚至几十万的多边形时(如Flash的场景中经常可能存在数十万的曲线绘制)

#17


引用 7 楼 tiger9991 的回复:
这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。


我后来尝试了这个方法,的确是快了很多很多。但是现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案。

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

#18


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

#19


引用 18 楼 jemasw 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上

#20


该回复于2013-05-22 10:05:37被管理员删除

#21


引用 19 楼 tomsoft 的回复:
Quote: 引用 18 楼 jemasw 的回复:

Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上



不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。
目前采用的方法:1、查找当前在视窗的圆并且画出来。
想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??

#22


引用 21 楼 jemasw 的回复:
Quote: 引用 19 楼 tomsoft 的回复:

Quote: 引用 18 楼 jemasw 的回复:

Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上



不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。
目前采用的方法:1、查找当前在视窗的圆并且画出来。
想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??


个人习惯,我比较习惯用CreateDIBSection
另外,如果是3D的CAD,我建议您考虑使用OpenGL,这样即使画线框也比较方便;2D的可以考虑矢量引擎;主要原因是如果是CAD,输出品质您要考虑,同时您还在作缩放,因此,引擎最好支持抗锯齿 ---- 这个时候再用位图方式未必合适

#1


顶起,哪位前辈能够赐教。

#2


顶起,哪位前辈能够赐教。

#3


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

#4


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

#5


用双缓冲方式试试,可以从一定程度解决闪烁的问题。具体代码可以搜搜“双缓冲”。

#6


这个卡和双缓冲没有任何关系,GDI+就是这样的速度。绘制1024*768个圆对GDI+来说就是个不可胜任的工作。

#7


这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。

#8


和双缓冲没有关系,给您几个建议可以试试:
1)使用成熟的矢量图形库,一般这些库都会作优化;我自己有个这样的库(可以媲美商业版本),您可以试试:http://download.csdn.net/detail/tomsoft/328524 其中针对矢量图形做了很多的优化
另外如果您自己想写算法,有几点可以考虑:
1)关于圆的绘图算法;不要使用标准椭圆算法,因为有二次运算,效能会比较低。可以考虑使用Bezier拟合,这样在使用扫描线算法绘制图形时只有简单乘除法就可以了(好像要用什么德卡斯特算法,记不清楚了)
2)不要用浮点数;矢量图形用FixedPoint对效能会有很大提升,即使是PC
3)使用脏矩形算法;对于有多个图形,使用脏矩形算法是最合适的算法
4)使用ScanLine算法:不要自以为是的使用简单的圆算法,配合1
5)尽量不要使用Alpha,Alpha在任何情况下对性能来说都是大忌
GDI+ 绘制位图 和 绘制矢量图 的效率问题 请教
这个示例是我自己的矢量图形库绘制的,使用了Alpha;如果没有Alpha,图形库效能还会有甚至几十倍的提升
   

#9


哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

#10


这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了

#11


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?

#12


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

弱弱地问一下,工程编译通过了,但怎么程序运行不了?

#13


学习 学习 学习

#14


引用 11 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?


引用 11 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

矢量图形库里有没有画无锯齿的直线,圆的函数?


矢量图形设置为低画质,实质就是无抗锯齿

#15


引用 12 楼 a292643788 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质

弱弱地问一下,工程编译通过了,但怎么程序运行不了?

这个程序分成两个部分:1)一个是生成一个通用的库,包含LibOpenVG和平台无关的Platform。2)另一个是一系列的验证程序。实际您使用的应该是那个DLL库,这个要配合您自己的程序;您可以参考相关的示范程序,看怎样使用这些库,比如clock为例:
1)使用VC++ 2005打开samples\clock下的工程文件
2)通常情况下直接编译运行就可以了;生成的配置可执行文件在:../../bin/win32\$(ProjectName).exe(见配置文件)
3)同理,您可以打开Samples目录下的其他工程;那些都是各种使用OVG写的示范程序,您可以对照这些程序或从直接修改这些程序入手

OpenVG是我几年前写的程序,时间隔的太久了。如果有什么不明白,我自己可能也要再试试

#16


引用 10 楼 q308865427 的回复:
这个问题,也让我很头疼,我的项目就是要绘制很多对象,用dc真的是太卡了


DC本身没有错,实际上我自己的这个矢量绘图引擎也是使用的DC,后来我自己作的Flash播放器用DC也很容易破百;关键是算法:DC在不合理的算法下是瓶颈,所以最简单的办法是少调用;另外,多数情况下大家绘制图形,如圆喜欢直接使用圆的方程,实际这是不对的;因为通过描点画圆效能很低的;不合理的算法用DC还是DirectX实质上没什么差别,这种矢量图形的瓶颈是图形的计算,尤其在有几万甚至几十万的多边形时(如Flash的场景中经常可能存在数十万的曲线绘制)

#17


引用 7 楼 tiger9991 的回复:
这个工作量确实有点大啊。要不绘制完之后用贴图模式,直接拷贝内存会好很多。


我后来尝试了这个方法,的确是快了很多很多。但是现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案。

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

#18


引用 9 楼 tomsoft 的回复:
哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

#19


引用 18 楼 jemasw 的回复:
Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上

#20


该回复于2013-05-22 10:05:37被管理员删除

#21


引用 19 楼 tomsoft 的回复:
Quote: 引用 18 楼 jemasw 的回复:

Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上



不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。
目前采用的方法:1、查找当前在视窗的圆并且画出来。
想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??

#22


引用 21 楼 jemasw 的回复:
Quote: 引用 19 楼 tomsoft 的回复:

Quote: 引用 18 楼 jemasw 的回复:

Quote: 引用 9 楼 tomsoft 的回复:

哦,还忘一点:
1)如果使用矢量图形,如果对效能还是不满意,可以使用较低品质图形输出;多数矢量图形库都有品质的设定,高品质和低品质在效能上会相差很大,尤其针对只是简单使用Super Sample算法的更是如此;通常情况下矢量图形会提供:低品质(无抗锯齿处理)、中品质、高品质


非常感谢你的热心回答。我现在尝试着使用贴图(位图)的方式,发现快了很多。这样是不是意味着不需要换成矢量图的绘图方式。如果换成矢量图的绘图方式,性能能够获得较好的提升吗???

现在还有个问题就是我画这1024*768个圆,每个圆可以相距10个像素。这样就导致了整张图片的大小变成10240*7680。如果间距再大点,就不堪入目了。我想在内存DC里面绘制好,然后缩放显示。

关键问题是,内存位图不能够存放这么大的图片。不知道你有没有好点的解决方案,可以满足缩放、在窗口显示局部图片????

我可以想到的是将这个图片分成多块内存DC。但是这样不仅处理起来麻烦,而且占用内存也很多。

多数情况下,在不考虑缩放时,位图大部分比同样复杂的矢量图形效能要高;只有在考虑缩放或对品质有较高要求时才会考虑矢量图形
可以在内存中画,不要使用DC。绘制完成后根据需要再部分转移到显示DC上



不好意思,这么久才回复你,最近身体不太舒服。我打算弄一个像是cad这样的工具,但是相对来说比较简单。只画圆,可以一次画1024*768个圆,也可以一个一个的画。可以缩放。可以选中这些圆,拖动这些圆。可以拖动画布(圆是话在画布上的)。我现在只弄了雏形,当圆数量不多的时候比较顺畅,圆一多起来(1024*768)就很慢很慢了。
目前采用的方法:1、查找当前在视窗的圆并且画出来。
想使用的方法:一次性全画在内存中,每次都用视窗与内存交集来显示。不用DC怎么在内存中画图??


个人习惯,我比较习惯用CreateDIBSection
另外,如果是3D的CAD,我建议您考虑使用OpenGL,这样即使画线框也比较方便;2D的可以考虑矢量引擎;主要原因是如果是CAD,输出品质您要考虑,同时您还在作缩放,因此,引擎最好支持抗锯齿 ---- 这个时候再用位图方式未必合适