嵌入式学习小组
直播中

刘占宽

7年用户 162经验值
私信 关注

uCGUI怎么优化至看不到刷屏?

[C] 纯文本查看 复制代码
UCOSIII+UCGUI+战舰+原子4.3电容屏[C] 纯文本查看 复制代码
自己参考网上的方法做了画点,画线,填充矩形,16bpp的优化,但我的刷屏速度只有这样:[C] 纯文本查看 复制代码
[C] 纯文本查看 复制代码
看到别人的刷屏都是900万像素每秒,甚至3000万,牛人帮我看看程序[C] 纯文本查看 复制代码
画线:[C] 纯文本查看 复制代码
/***********************************************************************       LCD_L0_DrawHLine*/void LCD_L0_DrawHLine  (int x0, int y,  int x1) {u16 f;  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {    for (; x0 <= x1; x0++) {      LCD_L0_XorPixel(x0, y);    }  } else {f = x1 - x0 + 1;LCD_SetCursor(x0, y);//设置光标LCDX->LCD_REG=lcddev.wramcmd;//写入GRAM    for (; f > 0;f --) {LCDX->LCD_RAM=LCD_COLORINDEX;      //LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);    }  }}[C] 纯文本查看 复制代码
/***********************************************************************       LCD_L0_DrawVLine*/void LCD_L0_DrawVLine  (int x, int y0,  int y1) {  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {    for (; y0 <= y1; y0++) {      LCD_L0_XorPixel(x, y0);    }  } else {    for (; y0 <= y1; y0++) {      LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);    }  }}
填充矩形:
[C] 纯文本查看 复制代码
/***********************************************************************       LCD_L0_FillRect*/void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {u16 i , j;u16 xlen;xlen = x1 - x0 + 1;   for(i = y0; i <= y1; i++){    LCD_SetCursor(x0, i);LCDX->LCD_REG=lcddev.wramcmd; for(j = 0; j < xlen; j++)LCDX->LCD_RAM = LCD_COLORINDEX;  }//   for (; y0 <= y1; y0++) {//     LCD_L0_DrawHLine(x0, y0, x1);//   }}16bpp:
(这里优化后刷控件速度快多了)[C] 纯文本查看 复制代码
/***********************************************************************       Draw Bitmap 16 BPP*/#if (LCD_BITSPERPIXEL > 8)static void  DrawBitLine16BPP(int x, int y, U16 const GUI_UNI_PTR * p, int xsize, const LCD_PIXELINDEX * pTrans) {  LCD_PIXELINDEX pixel;  if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {    if (pTrans) {LCD_SetCursor(x, y);LCDX->LCD_REG=lcddev.wramcmd;      for (; xsize > 0; xsize--, x++, p++) {        pixel = *p;LCDX->LCD_RAM = *(pTrans + pixel);//         LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));      }    } else {LCD_SetCursor(x, y);LCDX->LCD_REG=lcddev.wramcmd;      for (;xsize > 0; xsize--, x++, p++) {LCDX->LCD_RAM =  *p;//         LCD_L0_SetPixelIndex(x, y, *p);      }    }  } else {    if (pTrans) {LCD_SetCursor(x, y);LCDX->LCD_REG=lcddev.wramcmd;      for (; xsize > 0; xsize--, x++, p++) {        pixel = *p;        if (pixel) {LCDX->LCD_RAM =  *(pTrans + pixel);//           LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));        }      }    } else {LCD_SetCursor(x, y);LCDX->LCD_REG=lcddev.wramcmd;      for (; xsize > 0; xsize--, x++, p++) {        pixel = *p;        if (pixel) {LCDX->LCD_RAM =  pixel;//           LCD_L0_SetPixelIndex(x, y, pixel);        }      }    }  }}希望优化到看不见刷屏,现在还是能看见从上到下的刷屏

回帖(44)

励黎

2020-5-22 00:45:47
首先你是什么型号的STM32?900万 甚至3000万那是拿RA8875的LCD控制器刷出来的,RA8875可以开挂的,具有硬件2D绘图。如果你使用的是ILI9341等LCD控制器,就别想有这么高的分数了,103基本刷出来的就是250W左右。还有网上有的还甚至是否用的NXP的单片机,带有LCD控制器,那个分数也很高的。STM32F429我见过最高刷到5500W的!内部使用LTDC。
举报

李华

2020-5-22 01:03:26
你好,我用的是原子哥的战舰开发板,STM32F103  72M主频
LCD是原子哥的4.3寸电容屏分辨率800*480  nt35510LCD控制器
我刚才优化了画垂直线,现在能跑223W,是不是已经到头了?
如果使用MemDev先放到内存上,然后copytoLCD会好很多?
举报

李雷

2020-5-22 01:12:44
不会的,high Speed是用来测试打点速度的,你用MemDev最终还是要在屏幕上打点的。而且使用MemDev只是为了防止屏幕闪烁,对于打点没有任何提升。
举报

夏焕丽

2020-5-22 01:27:23
谢谢你的讲解,那么在不换硬件的前提下,我是不是已经没有优化的空间了?
如果换硬件的话换什么呢?只换成stm32f407效果好吗?还是要换LCD驱动器
举报

更多回帖

发帖
×
20
完善资料,
赚取积分