睡觉前问一个奇怪的wince 显示问题,明天晚上回来坐等各位精彩分析

gooogleman 2013-01-02 11:58:13
加精
问题是:为什么我的S5pv210 wince6.0 系统用32 bit 通过 VGA 输出的时候,CreateCompatibleBitmap和CreateDIBSection这两个的速度居然会比16 bit 通过 VGA输出的时候低那么多?按照道理这个wince 6.0 是32 bit 的系统,16 bit 或者24 bit 的数据都应该用32bit的方式来处理的,这个速度应该是一样的,或者差异不会太大。
现在测试得出的结果是
32 bit S5pv210 VGA输出
CreateCompatibleBitmap 4
CreateDIBSection 53

16 bit S5pv210 VGA输出
CreateCompatibleBitmap 3
CreateDIBSection 3


从上面可以看出CreateDIBSection 得出的结果差异非常大。

CreateCompatibleBitmap 没什么差别

这是为何?!
32 bit 的显示效果的确是比 16 bit的细腻一些,这时候运行一些 图片程序的时候可以看出来,但是这个效率咋变低呢。有什么办法解决?

...全文
2188 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
gg357143936 2013-01-21
  • 打赏
  • 举报
回复
tongkanhua1 2013-01-17
  • 打赏
  • 举报
回复
fasdfa第三方公司的分公司的风格
  • 打赏
  • 举报
回复
jefffengke 2013-01-16
  • 打赏
  • 举报
回复
在来看一下CreateCompatibleBitmap和CreateDIBSection 实现方式才能找到原因。
lu9923 2013-01-15
  • 打赏
  • 举报
回复
1.问题出现在DNW首地址设置不对 2.一块板子FD2 USB极其不稳定,可能的原因在DDR这块,另一块能启动但启动到OEMINT()函数后载入内核的时候却出现问题,问题可能也是出在DDR那块 3.BOOT没有倒计时,说明RTC电路有问题 解决: 1.DNW地址设置正确后,板子正常。 2.问题没有解决,打算在EBOOT里加一段代码来测试DDR的读写是否正常。 3.将和RTC电路焊好,包括电池供电,中间还发现晶振没有起振,原来是本来为5.1M的电阻却焊的1M的电阻,将其去掉后RTC正常运行。(其他晶振电路的中间电阻是不能去掉的,去掉后晶振会不能起振)。
guanyezmy 2013-01-15
  • 打赏
  • 举报
回复
学习中!好东西
liuyang25921 2013-01-15
  • 打赏
  • 举报
回复
好东西,学习了
gooogleman 2013-01-15
  • 打赏
  • 举报
回复
准备结贴了。嘿嘿。
gyjyd 2013-01-14
  • 打赏
  • 举报
回复
好东东,多谢。
gooogleman 2013-01-14
  • 打赏
  • 举报
回复
CreateCompatibleBitmap 用这个效果还是过得去的。
gooogleman 2013-01-14
  • 打赏
  • 举报
回复
引用 9 楼 glchild514 的回复:
對了如果知道32bits怎麼加速,要說一下耶 我也很想知道
直接使用是没戏了,因为 2d_accel_lib.lib 这个2D加速库三星死棒子是不开源的。 哎,真是无敌,都快没人用的wince系统了,还给我们来个lib,并且一点说明都没有。 自己写估计要费点精力。所以要么就这么算了,反正S5pv210 做一些一般的图形界面也不慢的。
Conmajia 2013-01-14
  • 打赏
  • 举报
回复
DDB,Device Dependent Bitmap,设备相关位图,因为相关,所以compatible,所以速度快,缺点也是因为相关,所以portability差。。 DIB,Device Independent Bitmap,设备无关位图,因为无关,所以不存在compatible,所以很慢。。好处显而易见。。 。。
ftjavayp 2013-01-14
  • 打赏
  • 举报
回复
line_us 2013-01-14
  • 打赏
  • 举报
回复
比较深入的技术讨论,观摩。
zax1234521 2013-01-14
  • 打赏
  • 举报
回复
呵呵呵.那个是什么意思
zax1234521 2013-01-14
  • 打赏
  • 举报
回复
梅看懂 应该不是我需要的
gooogleman 2013-01-13
  • 打赏
  • 举报
回复
兼容位图即DDB,由CreateCompatibleBitmap创建;非兼容位图即DIB,是由LoadImage、SHLoadBitmap、CreateDIBSection、CreateBitmap创建。 非兼容位图和兼容位图有两个本质差别 第一个区别是兼容位图的存放空间通常由GWES或显示驱动分配,处于驱动层之中,可以获取到存放数据的物理地址,而非兼容位图的存放空间通常由应用程序分配,处于应用层中,不能获取到物理地址。 第二个区别是兼容位图与显示驱动的位深和像素格式保持一致(WinCE显示驱动的位深和格式是固定的),如显示驱动采用的是16位RGB565的位深和像素格式,则兼容位图的格式也一样,而非兼容位图通常不相同,即它内部可能是32位位深ARGB的格式,也有可能是24位RGB888的格式。 以上两个区别意味着 第一个区别意味着非兼容位图无法享受2D显示模块的硬件加速,硬件加速的原理类似DMA,需要物理地址,而非兼容位图获取不到物理地址,自然无法进行硬件加速。 第二个区别意味着非兼容位图拷贝到显示界面上往往需要进行颜色转换,因为它要符合显示驱动的颜色格式才能正常地显示出来,常用的位图格式是24位RGB888,而显示驱动常用的格式是16位RGB565、32位ARGB8888,自然免不了转换,这部分工作都是在显示驱动中进行的,如果仅有一两次转换或少量像素的转换可能不会有什么,但如果是大量的绘图操作,意味着每次拷贝都会进行转换,这将把宝贵的系统资源消耗在位图的转换上。 补充说明: 1、创建兼容位图的时候,GDI会调用GPE的AllocSurface(纯虚)方法创建GPESurf(主表面也就是LCD对应的显存是第一时间创立的,剩下的也就用于GDI对象了),GPESurf构造函数是用new来分配内存的,也就是说从0xD0000000~0xDFFFFFFF区域分配的;如果系统定制的时候预留内存(也就是视频内存),并重载GPESurf优先从视频内存上分配则可以用于DMA实现加速,换句话说如果不重载GPESurf,为显示预留内存是没有意义的。 2、创建非兼容位图的时候,GDI未调用GPE的AllocSurface方法 3、GDI的SurfaceHeap类可用于对预留的视频内存进行管理 下面是一组测试可以证明两者的差别,测试方法是循环创建800*480的16位HBITMAP直到返回失败 CreateCompatibleBitmap NK.exe的heap一直增加,直到耗尽物理内存。堆分配地址范围0xD0000000~0xDFFFFFFF(内核空间地址,由所有被内核加载的服务和驱动共享) CE6模拟器执行50次,物理内存由39063552降到503808,NK.exe的heap为40406591,应用的heap为2016 CE6设备执行279次,物理内存由83456000降到815104,NK.exe的heap为83519444,应用的heap为19616 补充:CE5模拟器执行35次,物理内存由43204608降到16211968,这估计是因为CE5进程只有32MB空间 CreateDIBSection 应用的heap一直增加,直到耗尽物理内存。堆分配地址范围0x00010000~0x3FFFFFFF(进程及用户分配的虚拟地址) CE6模拟器执行50次,物理内存由39059456降到442368,NK.exe的heap为2022079,应用的heap为38403616 CE6设备执行107次,物理内存由83439616降到872448,NK.exe的heap为1207028,应用的heap为82199040 测试代码如下 [cpp] view plaincopy void* pucAddr; struct { BITMAPINFOHEADER bmiHeader; int BitMask[3]; } bmi; bmi.bmiHeader.biWidth = 800 ; bmi.bmiHeader.biHeight = -480 ; bmi.bmiHeader.biPlanes = 1 ; bmi.bmiHeader.biSizeImage = 0 ; bmi.bmiHeader.biXPelsPerMeter = 0 ; bmi.bmiHeader.biYPelsPerMeter = 0 ; bmi.bmiHeader.biClrUsed = 0 ; bmi.bmiHeader.biClrImportant = 0 ; bmi.bmiHeader.biBitCount = 16 ; bmi.bmiHeader.biSize = sizeof(bmi); bmi.bmiHeader.biCompression = BI_BITFIELDS; bmi.BitMask[0] = 0xF800; bmi.BitMask[1] = 0x07E0; bmi.BitMask[2] = 0x001F; HBITMAP hBitmap; for(int i = 0; ; i++) { #if 1 hBitmap = ::CreateCompatibleBitmap(::GetDC(NULL), 800, 480); #else hBitmap = ::CreateDIBSection( NULL , (BITMAPINFO*)&bmi , DIB_RGB_COLORS , (void**)&pucAddr , NULL , 0 ) ; #endif DWORD dwRet = ::GetLastError(); if(dwRet == 8) { DebugBreak(); } }
glchild514 2013-01-12
  • 打赏
  • 举报
回复
對了如果知道32bits怎麼加速,要說一下耶 我也很想知道
马中马 2013-01-11
  • 打赏
  • 举报
回复
学习了!!!
glchild514 2013-01-11
  • 打赏
  • 举报
回复
我來告訴你為什麼,CreateDIBSection最後會呼叫blt 你可以看 C:\WINCE600\PLATFORM\SMDKV210\SRC\DRIVERS\DISPLAY\DISPLAY_DRV\blt.cpp 裡面的BltPrepare函式的最後面 #if USE_SECEMUL_LIBRARY // To extract 2d_accel_lib.lib totally, using preprocess statement if(m_G2DControlArgs.UseSWAccel) { SECEmulatedBltSelect16(pBltParms); SECEmulatedBltSelect2416(pBltParms); SECEmulatedBltSelect1624(pBltParms); } #endif 16bits使用了2D加速 , 而32bits沒有使用2D加速 所以VGA速度才會差那嚜多
加载更多回复(6)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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