首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

c#的一个绘图方法竟然比c++的快,求解~该怎么解决

2012-01-19 
c#的一个绘图方法竟然比c++的快,求解~~对c#不太熟悉。贴一个800*480的图片,c#有个方法比较快,那就是用gdi+。

c#的一个绘图方法竟然比c++的快,求解~~
对c#不太熟悉。贴一个800*480的图片,c#有个方法比较快,那就是用gdi+。
测试环境为环境 WM(WVGA)。

语言 方法 时间
c++ gdi 200ms
c++ gdi+ 600ms
c# gdi+ 50ms

关键代码,
c++: bitblt,网上的LibGDIPlus.lib强制使用gdi+
c#: this.Graphics.DrawImage(this.Bitmap, 0, 0)。
上面为模拟器的测试数据,真机也差别多,会小点,但差别还是这么大,c#的快许多。

猜测:ms在.net做手脚,gdi+本来就比较慢,所以可能里面有写屏的操作。

不知道原因,所以向各位大大求解。

[解决办法]
你的问题是什么呢?C++ 的 bitblt本来就不是最快的方法,你这样比较有什么意义?
[解决办法]
C# 中的Bitmap tempbmp1;
Bitmap tempbmp2;
你是在哪里赋值得 赋值得时间你没计算在内
而C++中的
 HBITMAP hBit = m_hBmp;
SIZE size;
BITMAP bitMap;
::GetObject(hBit, sizeof(BITMAP), &bitMap);
size.cx = bitMap.bmWidth;
size.cy = bitMap.bmHeight;
你是计算在内的
[解决办法]

探讨
回ls:计算BitBlt差不多的,真机也测试过,c#这个方法快很多,快达到了ddraw的速度。“用的显示API都是自己写的”,怎么来写?ddraw来?

[解决办法]
…………
[解决办法]
up下。。
[解决办法]
不懂,不懂啊
[解决办法]
不动,路过~!
[解决办法]
我来凑个热闹。。。
[解决办法]
感觉两个代码计时的区间不一致。
C#版本好像只计算了DrawImage的时间,位图是已经初始化了的。
C++版本计算的时间多了SelectBitmap和DeleteDC。
[解决办法]
学习学习
[解决办法]

[解决办法]
路过学习
[解决办法]
很激烈啊
[解决办法]

[解决办法]
在下感觉,问题的关键不是在800*480,而是在位图的色位上.

c++: bitblt,网上的LibGDIPlus.lib强制使用gdi+(你bitblt到的hDC可能色位不一样,需要运算)
c#: this.Graphics.DrawImage(this.Bitmap, 0, 0)。(都是this指针,色位是一样的,直接拷贝)

[解决办法]
怎么可能gdi比gdi+慢,gdi块多了!
探讨

C++的gdi++会有这么慢吗,至少比C++的gdi快吧

[解决办法]
haode
[解决办法]
探讨
谁说C#一定比C++慢的?封装得好的话.效率肯定比C++快--同意!

[解决办法]
观察中,不懂
[解决办法]
拿工资来的
[解决办法]
学习ing
[解决办法]
mark。。。。。。。。
[解决办法]
每天回帖即可获得10分可用分!
------解决方案--------------------


这个贴子竟然这么火?
[解决办法]
强势围观
[解决办法]
mark标记下
[解决办法]
不懂。围观
[解决办法]
你的C# GDI+ 版本代码,似乎没有与屏幕DC相关联吧,所以会比较快
C++ GDI+ 版本,是与DC关联,绘图时间会比比较长
[解决办法]

探讨
在下感觉,问题的关键不是在800*480,而是在位图的色位上.

c++: bitblt,网上的LibGDIPlus.lib强制使用gdi+(你bitblt到的hDC可能色位不一样,需要运算)
c#: this.Graphics.DrawImage(this.Bitmap, 0, 0)。(都是this指针,色位是一样的,直接拷贝)

[解决办法]
楼主不要只顾自说自话,建议注意27楼和42楼的问题;
另外,此帖不应是C#和C++的优劣之争,各有优势,但速度吗,按常识推算C#不会快过C++
[解决办法]
路过,学习
[解决办法]
正在努力学习c#

[解决办法]
没用过,等待结果!!!
[解决办法]
快也快不了多少,
[解决办法]
讨论激烈呀,学习学习。
[解决办法]
说到C#的速度方面了,所以很火
[解决办法]
顶一个。
[解决办法]
mark
[解决办法]
600ms, 你眼睛不花死了

[解决办法]
他的类封装的很好
[解决办法]
一个绘图方法引发的血案
[解决办法]
你的位图是24位色的,而你的屏幕,我想应该是32位色的吧,我只有VC6.....
我看你的代码
SHLoadDIBitmap(L"\\My Documents\\test.BMP");
看那函数名应该是是载入DIB的图片而不是DDB,也就是说设备无关的图片,即保留了它原来的24位色了,这时候你把DIB Select到DC,(如果你的屏幕不是24位色的,那么我猜测应该正确了),当你BitBlt的时候,它是需要转化为你的屏幕色位(例如24变32).所以慢.
至于C#的,可能是它LOAD的时候是变成DDB了,所以它的速度就快.
[解决办法]
学习了~~~~~
[解决办法]
纯路过 不懂。 
不过C#速度 一般情况下是不可能高于C++的,这是常识,不是什么设计或是封装的问题。
当然C#效率也非常的高,我用C#从来不担心效率。
Lz的问题涉及到IO而已。 IO是速度瓶颈,ms级的时间占用,基本上大部分时间都是IO带来的。所以你这测试之所以能产生这么大的差别,主要是2者在IO上占用的时间的区别,而不是语言级别的东西。楼主的标题 太那个了, 进来的人,基本上都是想教育你一下的。呵呵。 所以你成功的把你的问题 搞跑题啦。哈哈。
友情帮顶。祝早日找出细节原因。
[解决办法]
ding
[解决办法]
c++: bitblt,网上的LibGDIPlus.lib强制使用gdi+ <-------- 封装过的GDI
c#: this.Graphics.DrawImage(this.Bitmap, 0, 0)。 <--------纯GDI


而且方法都不一样, 都用 DrawImage 肯定c++快
[解决办法]
没用过,按理c++是要快
[解决办法]
学习了~

热点排行