硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8177|回复: 10
收起左侧

[emWin] 换肤后速度变慢

[复制链接]

11

主题

59

回帖

11

积分

初级会员

积分
11
发表于 2014-9-5 09:22:50 | 显示全部楼层 |阅读模式
使用了换肤功能后,创建一个对话框的时候,屏幕上先弹出对话框的客户窗口,然后才刷框架,滞后的比较明显,请问有什么优化的办法吗?
RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
FRAMEWIN_GetSkinFlexProps(&fProps,FRAMEWIN_SKINFLEX_PI_ACTIVE);
fProps.aColorFrame[2] = GUI_BLUE;
fProps.aColorTitle[0] = GUI_BLUE;
fProps.aColorTitle[1] = GUI_BLUE;
FRAMEWIN_SetSkinFlexProps(&fProps,FRAMEWIN_SKINFLEX_PI_ACTIVE);
FRAMEWIN_SetDefaultTitleHeight(35);

硬件是STM32F407ZG+RA8875+IS61WV102416
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 09:25:46 | 显示全部楼层
使用存储设备也是一样的,感觉换肤功能(回调函数)是在显示之后才调用的,也就是重新刷新的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2014-9-5 09:48:42 | 显示全部楼层
你的底层驱动是不是有地方没有优化。
回复

使用道具 举报

219

主题

1109

回帖

1776

积分

至尊会员

More we do, more we can do.

积分
1776
发表于 2014-9-5 09:48:46 | 显示全部楼层
使用显示缓存可以解决刷新感,但与速度无关。
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 09:57:46 | 显示全部楼层
底层驱动不知道该优化哪里了。

画点函数:
static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex) {

    GUI_USE_PARA(pDevice);
    GUI_USE_PARA(x);
    GUI_USE_PARA(y);
    GUI_USE_PARA(PixelIndex);
    //
    // Write into hardware ... Adapt to your system
    //
    WriteCommand(0x46);
    WriteData(x);
    WriteCommand(0x47);
    WriteData(x>>8);
    WriteCommand(0x48);
    WriteData(y);
    WriteCommand(0x49);
    WriteData(y>>8);
    WriteCommand(0x02);            //MRWC
    WriteData(PixelIndex);
}
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 09:58:32 | 显示全部楼层
读点函数:

static unsigned int _GetPixelIndex(GUI_DEVICE * pDevice, int x, int y) {
    unsigned int PixelIndex;
    GUI_USE_PARA(pDevice);
    GUI_USE_PARA(x);
    GUI_USE_PARA(y);
   
    WriteCommand(0x4a);
    WriteData(x);   
    WriteCommand(0x4b);      
    WriteData(x>>8);
    WriteCommand(0x4c);
    WriteData(y);
    WriteCommand(0x4d);      
    WriteData(y>>8);
    WriteCommand(0x02);//MRWC
   
    for(__IO int i=0;i<3;i++)
        PixelIndex = LCD_DATA_ADD;
    return PixelIndex;
}
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 10:13:11 | 显示全部楼层
画线函数:
static void _DrawHLine  (GUI_DEVICE * pDevice, int x0, int y,  int x1) {
    LCD_PIXELINDEX ColorIndex;
    uint16_t i;
    ColorIndex = LCD__GetColorIndex();
   
    WriteCommand(0x46);
    WriteData(x0);
    WriteCommand(0x47);
    WriteData(x0>>8);
    WriteCommand(0x48);
    WriteData(y);
    WriteCommand(0x49);
    WriteData(y>>8);
   
    WriteCommand(0x02);//MRWC
    for(i=0;i<x1-x0+1;i++)
    {
      WriteData(ColorIndex);
    }
}

static void _DrawVLine  (GUI_DEVICE * pDevice, int x, int y0,  int y1) {
  LCD_PIXELINDEX ColorIndex;
  uint16_t i;

  if (GUI_pContext->DrawMode & LCD_DRAWMODE_XOR) {
    for (; y0 <= y1; y0++) {
      _XorPixel(pDevice, x, y0);
    }
  } else {
        ColorIndex = LCD__GetColorIndex();
        
        WriteCommand(0x46);
        WriteData(x);
        WriteCommand(0x47);
        WriteData(x>>8);
        WriteCommand(0x48);
        WriteData(y0);
        WriteCommand(0x49);
        WriteData(y0>>8);
   
        
        for(i=1;i<y1-y0+1;i++)
        {
              WriteCommand(0x02);//MRWC
            WriteData(ColorIndex);
            
            WriteCommand(0x46);
            WriteData(x);
            WriteCommand(0x47);
            WriteData(x>>8);
            WriteCommand(0x48);
            WriteData(y0+i);
            WriteCommand(0x49);
            WriteData((y0+i)>>8);
        }
  }
}

这个是参考您的代码用画点写的,如果用RA8875的画线功能,有时候会造成RA8875的WAIT信号一直有效
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 10:15:12 | 显示全部楼层
填充函数:
static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1) {
    LCD_PIXELINDEX ColorIndex;
    ColorIndex = LCD__GetColorIndex();
   
    WriteCommand(0x58);
    WriteData(x0);
    WriteCommand(0x59);
    WriteData(x0>>8);
   
    WriteCommand(0x5A);
    WriteData(y0);
    WriteCommand(0x5B);
    WriteData(y0>>8);
   
    WriteCommand(0x5C);
    WriteData(x1-x0+1);
    WriteCommand(0x5D);
    WriteData((x1-x0+1)>>8);
   
    WriteCommand(0x5E);
    WriteData(y1-y0+1);
    WriteCommand(0x5F);
    WriteData((y1-y0+1)>>8);
   
    WriteCommand(0x51);
    WriteData(0x0C);                    //单色填充
   
    WriteCommand(0x63);                    //设置前景色
    WriteData((ColorIndex&0xf800)>>11);    //5      R
    WriteCommand(0x64);
    WriteData((ColorIndex&0x07e0)>>5);    //6      G
    WriteCommand(0x65);
    WriteData((ColorIndex&0x001f));        //5        B
   
    WriteCommand(0x50);
    WriteData(0x80);
    while(LCD_COMM_ADD&0x40){}            //等待BTE操作结束
    RA8875_WAITSTATUS();
}
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-5 10:15:34 | 显示全部楼层
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
//  for (;xsize > 0; xsize--, x++, p++) {
//    _SetPixelIndex(pDevice, x, y, *p);
//  }
    WriteCommand(0x46);
    WriteData(x);
    WriteCommand(0x47);
    WriteData(x>>8);
    WriteCommand(0x48);
    WriteData(y);
    WriteCommand(0x49);
    WriteData(y>>8);
   
    WriteCommand(0x02);//MRWC
    while(xsize--)
    {
        WriteData(*p++);
    }
//    for(;xsize > 0; xsize--,x++,p++){
//        WriteData(*p);
//    }
    RA8875_WAITSTATUS();
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2014-9-5 19:02:48 | 显示全部楼层
你的窗口开启使用内存设备了没有,看你的代码好像没有开启。
回复

使用道具 举报

11

主题

59

回帖

11

积分

初级会员

积分
11
 楼主| 发表于 2014-9-6 07:10:30 | 显示全部楼层
WM_SetCreateFlags(WM_CF_MEMDEV);
您说的是这个吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 02:02 , Processed in 0.042989 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表