|
鉴于很多人对音频和视频都很感兴趣,特别是初学者,更愿意搞些这种东西,所以打算优化下emWin的驱动,方便更好的做视频演示。
=====================================================================================
最近抽时间研究了一下uCGUI3.98里面的JPEG解码,这个里面的代码是用的libjepg,版本:JVERSION "6b 27-Mar-1998"。emWin的话用
的也是这个libjpeg库。
但是为什么显示速度不是很快呢,初步总结原因主要有以下三点。
1. uCGUI和LibJPEG的接口文件中绘制图形的函数,速度太慢了,居然是一个点一个点打出来的!!!
/*********************************************************************
*
* _WritePixelsRGB
*/
static void _WritePixelsRGB(const U8*p, int x0, int y0, int xSize) {
U8 r,g,b;
while (xSize) {
r = *p++;
g = *p++;
b = *p++;
LCD_SetColor(r | (g << 8) | (U32)((U32)b << 16));
LCD_DrawPixel(x0++, y0);
xSize--;
}
}
2. LibJPEG支持三种速度设置
emWin为了达到解码后最佳显示效果选择的是JDCT_ISLOW或者JDCT_FLOAT,使用JDCT_IFAST将大大加快计算速度。
/* DCT/IDCT algorithm options. */
typedef enum {
JDCT_ISLOW, /* slow but accurate integer algorithm */
JDCT_IFAST, /* faster, less accurate integer method */
JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
} J_DCT_METHOD;
3. 由于显示比较大的JPEG图片时,是用的外部SRAM做为emWin的动态内存,那么这就意味着IDCT的计算时是用外部SRAM参与数据运行,可以想象出这个将
大大降低JPEG解码的速度。
总结:优化的话从以上三点做优化即可。 |
|