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

100分:开帖讨论WINCE下24位色显示瓶颈,该怎么处理

2012-03-03 
100分:开帖讨论WINCE下24位色显示瓶颈最近在搞24BPP显示,搞不定,主要是切换图片会慢有搞过的朋友,指点指点

100分:开帖讨论WINCE下24位色显示瓶颈
最近在搞24BPP显示,搞不定,主要是切换图片会慢
有搞过的朋友,指点指点




24BPP图片显示慢的原因:读写内存的速度限制
16BPP 30-40ms之间
另外,输出24BPP图片好像有经过二次转化,16BPP就转化一次
即16BPP输出图片,只要一次写LCD Buffer
24BPP好像是将3字节排列的源文件图片,转化为4字节格式的保存在中转地址,然后从中转地址转化成最终显示图片,写入LCD buffer,而第二次的LCD buffer地址可能为unchche的,将其cache一下,和16BPP的显示速度就相当了


例如:
Volatile int x,y;
for(y=0;y<272;y++)
{
for(x=0;x<480;x++);
}

实测用时:14.3ms!!!其中,变量是放在堆栈中,对变量的处理时间:(STR*3+LDR*4)*272*480=14.30ms-1.94ms=12.36ms

反汇编如下:
.text:10001134 SUB SP, SP, #8
.text:10001138 MOV R2, #0
.text:1000113C STR R2, [SP,#8+var_4] //y值存堆栈[SP,#8+var_4]
.text:10001140 B loc_10001170
.text:10001140
========================循环开始========================
.text:10001144 ; ---------------------------------------
.text:10001144
.text:10001144 loc_10001144 ; CODE XREF: LCD_TST+44j
.text:10001144 STR R2, [SP,#8+var_8]//x值存堆栈[SP,#8+var_8]
.text:10001148 B loc_10001158
.text:10001148
.text:1000114C ; ---------------------------------------
.text:1000114C
.text:1000114C loc_1000114C ; CODE XREF: LCD_TST+2Cj
.text:1000114C LDR R3, [SP,#8+var_8] //从堆栈取出x
.text:10001150 ADD R3, R3, #1 //x++
.text:10001154 STR R3, [SP,#8+var_8] //x值存入堆栈
.text:10001154
.text:10001158
.text:10001158 loc_10001158 ; CODE XREF: LCD_TST+14j
.text:10001158 LDR R3, [SP,#8+var_8]//堆栈取出x
.text:1000115C CMP R3, #0x1E0 //x<480?
.text:10001160 BLT loc_1000114C //x<480则跳到114C处
.text:10001160
.text:10001164 LDR R3, [SP,#8+var_4] //取出y
.text:10001168 ADD R3, R3, #1 //y++
.text:1000116C STR R3, [SP,#8+var_4]//y存入堆栈
.text:1000116C
.text:10001170
.text:10001170 loc_10001170 ; CODE XREF: LCD_TST+Cj
.text:10001170 LDR R3, [SP,#8+var_4] //从堆栈取出y
.text:10001174 CMP R3, #0x110 //y<272?
.text:10001178 BLT loc_10001144 //y<272,则跳到1144处
.text:10001178
====================循环结束============================
.text:1000117C ADD SP, SP, #8
.text:10001180 BX LR




[解决办法]
如果是内存的速度限制那只有提高内存的时钟频率了
[解决办法]
你用的是ce自带的vga flat driver吗?
ce一般默认显示是16 bits的,你显示24位的,这样有一个颜色转换速度自然会慢很多
[解决办法]
硬件支持加速不?
需要拉伸不?
[解决办法]

探讨
使用GPE+飞凌5.0的BSP包
FLKC:HCLK:PCLK=1:4:8
硬件:S3C2440
我测试的是显示整屏的图片显示速度,不需拉伸

现在的问题主要有两个:
1、24BPP从源图像位置,需经两次转化,而16BPP就一次
2、24BPP第二次转化的目标地址,应该是uncache,而16BPP应该是cache的,有对比过

[解决办法]
一个是16,一个是24,光看这个就是到24要比16慢了呀。而且还要看楼主为啥要显示24的图像,出于啥原因,目的何在。如果是项目需求的话试试把显卡驱动改成24P的
[解决办法]
学习一下,定一个

[解决办法]
这是个好问题,关注一下,学习了。
------解决方案--------------------


这个问题我没搞明白。
16bit图显示24bit系统要转换的吧
[解决办法]
学习学习~!
[解决办法]
不错,感谢分享!
[解决办法]
顶 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[解决办法]
顶!!!!!!!!!!!!
[解决办法]

[解决办法]
嵌入式也有效率问题,呵呵
[解决办法]
。。。。
[解决办法]
随便看看!!!
[解决办法]
简单点来说,其实这个问题关系到两个方面。一个是内部的图片解码,另一个是外部的输出。只有将这两个都更改为24bit,速度才能更快。

可能这样说,大家都有点迷糊,还是以例子说明。如果你CPU内部是16bit形式处理,但输出是RGB888,那么还要进行插值计算;如果CPU内部是24bit形式处理,但输出是RGB565,也需要进行缩放;只有CPU内部是24bit形式处理,并且输出还是RGB888,这时候速度才会相对更快。

那么,问题就是,这些应该要怎么设置?对于CPU内部的处理,在BSP里面应该可以设置。而外部输出的话,还要牵扯到所使用的TFT LCD是否支持RGB888这种输入格式。

最后,如果你想加快24bit的速度,可以确认这两方面:1.LCD是否支持RGB888。 2.BSP下的显示代码,是否能够进行运算和输出的更改。
[解决办法]

探讨
简单点来说,其实这个问题关系到两个方面。一个是内部的图片解码,另一个是外部的输出。只有将这两个都更改为24bit,速度才能更快。

可能这样说,大家都有点迷糊,还是以例子说明。如果你CPU内部是16bit形式处理,但输出是RGB888,那么还要进行插值计算;如果CPU内部是24bit形式处理,但输出是RGB565,也需要进行缩放;只有CPU内部是24bit形式处理,并且输出还是RGB888,这……

[解决办法]
不懂 学习一下
[解决办法]

[解决办法]
类似你的问题,在项目中我也遇到过。看你这个:
Volatile int x,y;
for(y=0;y<272;y++)
{
for(x=0;x<480;x++);
}

楼主你项目的分辨率480*272?建议不要用wince自带的控件吧。我640*480 16BPP,显示24bit bmp,也不用“16BPP 30-40ms之间”这个。建议:能优化的就优化,注意你写的每一句代码是否可以优化,包含变量。我当时也自己也用汇编改写memcpy函数。其实微软的memcpy已经很快了,但是就考虑得太多:8bit对齐的拷到16bit对齐的怎么办,等等。

[解决办法]
也不用“16BPP 30-40ms之间”,这个说法保留一下,可能当时记错,但是速度比用ce的读写图片函数是快很多的。
[解决办法]
顶一个
[解决办法]
学习学习。。。。
[解决办法]
你要在驱动中和初始化LCD为32bit颜色深度,然后在显示24bit图片时就不会做lz所说的转化了。
[解决办法]
我是来拿分的!
[解决办法]
新手来报道个。!!!
[解决办法]
非常好的贴,对我十分有帮助,谢谢啦
[解决办法]
“640*480,这个分辨率的,俺也有玩过几天,把LCD DMA频率提上去,不是太稳定,偶尔有点杂讯,”

你是用vga接口的显示,或者lvds的屏?普通的lcd ttl接口的屏幕,一般会自带缓存,不会闪。

其实s3c2440 133的sdram带宽太少了。要是颜色bit数不转换,直接写屏,也有带宽限制,色深越大,占用带宽越多。在带宽够的情况下,不会影响。要是分辨率大,逼近带宽的限度,色深就会有影响了。一般800*480,色深16和24会有差别。当然在320*240就影响不大。

但这也是一方面,另一方面是rgb888转成rgb565,也很费时间。

现在比较流行2440 加 sm502,但sm502成本上百了,6410才80¥左右。
------解决方案--------------------


借用借用,辛苦了!~~
[解决办法]

探讨
使用GPE+飞凌5.0的BSP包
FLKC:HCLK:PCLK=1:4:8
硬件:S3C2440
我测试的是显示整屏的图片显示速度,不需拉伸

现在的问题主要有两个:
1、24BPP从源图像位置,需经两次转化,而16BPP就一次
2、24BPP第二次转化的目标地址,应该是uncache,而16BPP应该是cache的,有对比过

[解决办法]
学习学习、、、、
[解决办法]
呵呵。
的确,就显存到LCD接口这一边的数据传输,同一分辨率的16bit和32bit没有什么差别,因为前者DMA的传输单元为WORD,后者为DWORD,32位的总线嘛,除非把两个16bit的作为一个单元。
但是要显示的数据到显存这边就不同了。显示32bit的数据时候,明显数据量大很多,因为4个8bit的,2个16bit的可以作为一个DWORD传输(memcpy就关心字节个数和对齐关系)。这样子算起来,32BPP的色彩是占用更多的带宽,特别是播放视频时候,除非画面是静止的。

另外把显示驱动改成24BPP的作用也不太,数据还是转换的。微软的BMP24数据存放格式一般是,假设只有两个像素,RGBRGB(2个补零),而2440的则是:(0)RGB(0RGB)。数据还是要转换。

其实很多cpu的lcd控制器也支持色彩空间的转换,就你所谓的解码,就像PXA270。SM502的功能更远不止,它支持色彩空间的转换,支持YUV到RGB,RGB到RGB的转换,支持overlay1,overlay2,还有一些特殊指令。还有camera接口,usb,gpio,...呵呵,很多也忘记了。
[解决办法]
发几篇有关2440的文章:

WinCE技术文章收集

S3C2440A驱动RGB接口TFT LCD的研究

s3c2440(2410) USB HOST不稳定的原因及解决方法

S3C2440A下彩色液晶显示系统的设计


[解决办法]
都可以考虑这些牛叉问题了啊
[解决办法]
高深动作,学习中~
[解决办法]
这个学习一下
[解决办法]
难得上次头版,没搞过,学习一下
[解决办法]
感觉很高深的问题,支持一下。
[解决办法]
有待提高!
[解决办法]
“"是要显示的数据到显存这边就不同了",GPE中从内存到显存传输的时候是以像素点来计算的,不是内存拷贝”

——你举的例子,只是其中一个的函数而儿。bmp画图也有写点的方式和内存拷贝方式。如果是视频,更不可能想你所说的一个点一个点的写。

sm502的驱动是 同事用来实现camer的视频叠加和双屏显示。不过我也研究不深,大概了解了一些。
[解决办法]
探讨
怎么都没啥人讨论呢
看来32BPP的市场需求还不是太大啊

[解决办法]
wince 好用还是LINUX好用啊
[解决办法]
很有深度的帖子

热点排行