GDI 显示已有的像素数组,用什么方法最高效,该怎么处理
GDI 显示已有的像素数组,用什么方法最高效
1、像素数组是程序计算好的,已经行4字节对齐
2、像素数据被修改后需要重新显示,即一个像素数组会被多次使用
------解决方案--------------------
如果你的数据完全符合BMP的标准,使用SetDIBitsToDevice(不缩放显示) 和 StretchDIBits(缩放)子哦最为快捷方便。
------解决方案--------------------
用内存DC bitblt 或stretchBlt到响应设备DC中。
CDC memDC;
memDC.CreateCompatibleDC(pdc);
memDC.SelectObject(m_pBitmap);
ret = pdc->StretchBlt(m_display_x,m_display_y, m_displaySize.cx, m_displaySize.cy,
&memDC,0,0,m_ImageSize.cx, m_ImageSize.cy, SRCCOPY);
------解决方案--------------------
GDI就是1楼说的,当然directshow更快
------解决方案--------------------
我是支持1楼的2个函数的DIB这个最高效了。不信楼主可以继续等高手。
------解决方案--------------------
CreateDIBSection应该是效能最高的 ---- 在DirectX没有出现时,这个函数是替代DirectDraw
------解决方案--------------------
刚在微软的文档中看到:"The CreateDIBSection function creates a DIB that applications can write to directly. "
因为是直接写,所以应该是CreateDIBSection最快,他提供了类似嵌入系统直接操作FrameBuffer的方式。
------解决方案--------------------
最后为了证明我说的是对的,我刚刚反向了一下Adobe的FlashPlayer 10,我找到了其显示部分,用的就是CreateDIBSection;
------解决方案--------------------
CreateDIBSection不是显示函数。如果已经有数据了,用这个函数来显示,还要把原始数据复制过来,然后再通过bitblt或strechblt函数来显示到DC上,不可能比SetDIBitsToDevice 和 StretchDIBits来的快。
如果楼主的数据部不符合BMP规范,那就需要CreateDIBSection发挥作用了。
楼主既然关心显示的速度问题,那就应该是要做动态的效果,屏幕就那么大,如果设计的合理,最多也就只需要输出屏幕大小的图,用SetDIBitsToDevice或StretchDIBits 这样的函数显示这么大的图,实时性根本不用担心。
------解决方案--------------------
关于CreateDIBSection的使用我解释如下:
1)CreateDIBSection会返回一个指针,我们可以直接使用这个指针指向的空间(就如同FrameBuffer一样),然后使用BitBlt将画面直接输出到设备上,注意BitBlt的速度要比StretchDIBits快(否则Adobe也不至于滥到不知道用StretchDIBits了吧 --- 尽管我不喜欢Adobe)
2)StretchDIBits有个Buffer指针,CreateDIBSection也有个Buffer指针,我不理解CreateDIBSection为什么不能用这个Buffer,而StretchDIBits就可以呢?为什么CreateDIBSection就要傻傻的复制,而StretchDIBits就不需要呢?注意:CreateDIBSection虽不是直接的显示函数,但它提供了一种渠道可以使用户直接操作显示缓冲区 ---- 这是任何DC操作所无法比拟的;所以似乎只有DirectX可以这样;
3)如果您的图形有缩放,那还是使用StretchDIBits了;
在Windows 95刚出现时,那个时候DirectX(第一版本实际叫GameSDK)还没有出现时,我们写PC游戏都是用CreateDIBSection:那其中多数图形并非是直接在这个Buffer上绘制的,而是所有动画实际先准备在若干的BackBuffer中 ----- 及LZ所说的数据是准备好的;
------解决方案--------------------
有些地方需要更正,对于多数显示屏幕,显示分辨率都会超过1280 x 800(我不清楚现在主流是多少,反正我现在用的一个老爷显示器是1680 x 1050),这样分辨率使用StretchDIBits全屏刷新,我相信除非你的CPU足够强悍,想要流畅还有问题 ---- 更不要说期间进行与图形变换有关的操作;所以除显示函数的选择和使用技巧,刷新技巧是关键 ---- 如DirtyRect技术的使用;
1、像素数组是程序计算好的,已经行4字节对齐
2、像素数据被修改后需要重新显示,即一个像素数组会被多次使用
------解决方案--------------------
如果你的数据完全符合BMP的标准,使用SetDIBitsToDevice(不缩放显示) 和 StretchDIBits(缩放)子哦最为快捷方便。
------解决方案--------------------
用内存DC bitblt 或stretchBlt到响应设备DC中。
CDC memDC;
memDC.CreateCompatibleDC(pdc);
memDC.SelectObject(m_pBitmap);
ret = pdc->StretchBlt(m_display_x,m_display_y, m_displaySize.cx, m_displaySize.cy,
&memDC,0,0,m_ImageSize.cx, m_ImageSize.cy, SRCCOPY);
------解决方案--------------------
GDI就是1楼说的,当然directshow更快
------解决方案--------------------
我是支持1楼的2个函数的DIB这个最高效了。不信楼主可以继续等高手。
------解决方案--------------------
CreateDIBSection应该是效能最高的 ---- 在DirectX没有出现时,这个函数是替代DirectDraw
------解决方案--------------------
刚在微软的文档中看到:"The CreateDIBSection function creates a DIB that applications can write to directly. "
因为是直接写,所以应该是CreateDIBSection最快,他提供了类似嵌入系统直接操作FrameBuffer的方式。
------解决方案--------------------
最后为了证明我说的是对的,我刚刚反向了一下Adobe的FlashPlayer 10,我找到了其显示部分,用的就是CreateDIBSection;
------解决方案--------------------
CreateDIBSection不是显示函数。如果已经有数据了,用这个函数来显示,还要把原始数据复制过来,然后再通过bitblt或strechblt函数来显示到DC上,不可能比SetDIBitsToDevice 和 StretchDIBits来的快。
如果楼主的数据部不符合BMP规范,那就需要CreateDIBSection发挥作用了。
楼主既然关心显示的速度问题,那就应该是要做动态的效果,屏幕就那么大,如果设计的合理,最多也就只需要输出屏幕大小的图,用SetDIBitsToDevice或StretchDIBits 这样的函数显示这么大的图,实时性根本不用担心。
------解决方案--------------------
关于CreateDIBSection的使用我解释如下:
1)CreateDIBSection会返回一个指针,我们可以直接使用这个指针指向的空间(就如同FrameBuffer一样),然后使用BitBlt将画面直接输出到设备上,注意BitBlt的速度要比StretchDIBits快(否则Adobe也不至于滥到不知道用StretchDIBits了吧 --- 尽管我不喜欢Adobe)
2)StretchDIBits有个Buffer指针,CreateDIBSection也有个Buffer指针,我不理解CreateDIBSection为什么不能用这个Buffer,而StretchDIBits就可以呢?为什么CreateDIBSection就要傻傻的复制,而StretchDIBits就不需要呢?注意:CreateDIBSection虽不是直接的显示函数,但它提供了一种渠道可以使用户直接操作显示缓冲区 ---- 这是任何DC操作所无法比拟的;所以似乎只有DirectX可以这样;
3)如果您的图形有缩放,那还是使用StretchDIBits了;
在Windows 95刚出现时,那个时候DirectX(第一版本实际叫GameSDK)还没有出现时,我们写PC游戏都是用CreateDIBSection:那其中多数图形并非是直接在这个Buffer上绘制的,而是所有动画实际先准备在若干的BackBuffer中 ----- 及LZ所说的数据是准备好的;
------解决方案--------------------
有些地方需要更正,对于多数显示屏幕,显示分辨率都会超过1280 x 800(我不清楚现在主流是多少,反正我现在用的一个老爷显示器是1680 x 1050),这样分辨率使用StretchDIBits全屏刷新,我相信除非你的CPU足够强悍,想要流畅还有问题 ---- 更不要说期间进行与图形变换有关的操作;所以除显示函数的选择和使用技巧,刷新技巧是关键 ---- 如DirtyRect技术的使用;