|
1. 这个问题由来已久,了解这个问题的历史,务必优先看此贴,
http://www.armbbs.cn/forum.php?mod=viewthread&tid=21120
2. 现在已经使用emWin5.36版本测试了,官方说5.34版本就加入32bpp的优化功能,测试发现没有任何效果,
鉴于这个原因,专门花了一天时间才找到了下面的问题,不容易啊,兄弟们。
-------------------------------------------------------------------------------
=============================================
条件:
F429+32位SDRAM配置为ARGB8888格式,硬件接口也是RGB888,绘制800*480*3的位图。
第一种测试,正常绘图,方法如下,使用函数GUI_MEMDEV_WriteAt刷图,*****213ms一帧*******
hMempic = GUI_MEMDEV_CreateEx(0, 0, 800, 480, GUI_MEMDEV_HASTRANS);
/* 将图片解码到内存设备中 */
GUI_MEMDEV_Select(hMempic);
GUI_DrawBitmap(&bm1, 0, 0);
GUI_MEMDEV_Select(0);
显示的时候调用函数:
GUI_MEMDEV_WriteAt(hMempic,0,0);
=============================================
第二种测试,方法如下,使用函数GUI_MEMDEV_WriteOpaqueAt刷图,*****82ms一帧*****
速度提升相当的明显,提高了131ms。
显示的时候调用函数:
GUI_MEMDEV_WriteOpaqueAt(hMempic,0,0);
=============================================
第三种测试,依然使用函数GUI_MEMDEV_WriteOpaqueAt刷图,但是由于STemWin
和MDK安装目录中的emWin都没有把ARGB格式的宏定义开放出来,导致设置
宏定没有任何效果,所以我人为的将底层转换的函数屏蔽掉了。具体速度提升至*****23ms一帧*****,
当然,这个仅仅测试,因为屏蔽了转换函数,图像就显示不出来了,只能等待官方讲这个宏定义
开放出来。
为什么ABRG转ARGB这么消耗时间?主要是因为每个像读点都要做一次转换,相当耗时。
==========================================
补充下些知识点,可能有些网友不太理解这里的含义,这个不是说做个软件上ABGR转ARGB,其实上面的截图中说的已经比较明白:
这里的意思是说emWin在5.30版本以前,它自己的颜色格式是固定的ABGR格式,如果用户的显示屏是ARGB格式的,那么每次emWin
的输出都要做颜色格式的转换,在这个上面浪费了很多时间,特别是刷图的时候,而emWin5.30版本以后,官方推出了ARGB格式,方
便了像STM32F429/439这种显示屏驱动了,这样emWin设置的颜色格式就可以直接输出了。大大提升了速度,特别是刷新图片的时候,
AGBGR8888转换F429的ARGB8888耗费了太多时间了,极其影响性能。而AGBR8888转RGB565要好非常多,因为将图片绘制到内存
设备后,已经转换成RGB565,所以直接输出的跟裸机操作一样,而转ARGB8888,即使存储到内存设备,每次输出依然要做颜色格式
转换,这个是因为ARGB格式多了一个8位的Alpha通过,每次绘制都要考虑到这个alpha的作用,所以干脆绘制到内存存储设备里面的
还依然是ABGR8888格式,这个就是速度慢的根本原因了。 |
|