硬汉嵌入式论坛

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

使用emWin切换界面速度慢

[复制链接]

11

主题

104

回帖

137

积分

初级会员

积分
137
发表于 2017-5-3 13:38:40 | 显示全部楼层 |阅读模式
QQ图片20170503133122.png
QQ截图20170503133056.png

如图,手自动切换的时候界面刷新有肉眼可见的“拉窗帘”现象。说明下哦,背景是位图的形式。
今天在工程中看了一下没有用到FSMC跟DMA,最后想问几个问题:
1.这个刷新的话到底正常吗?
2.不正常的话怎么去改善一下呢?
3.我看到你们能显示刷新的速度,这个是怎么实现的呢?
新手,也不是很懂……万分感谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-3 14:27:06 | 显示全部楼层
用的什么,F407吗,F407的话,刷图片不行的,太慢了。

使用F429是正途,将图片绘制到SDRAM,然后用SDRAM刷,速度极快,可以看我们发布的F429综合Demo效果演示。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17330
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-10 15:56:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:用的什么,F407吗,F407的话,刷图片不行的,太慢了。

使用F429是正途,将图片绘制到SDRAM,然后用SDRAM刷,速度极快,可以看我们发布的F429综合Demo效果演示。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17330 (2017-05-03 14:27) 
我用的是F429,但是用的是秉火的开发板,底层做的太差劲了,官方demo跑出来最高只有5000w,看了好多遍你们的教程不知道怎么去优化好。刷图的问题至今没解决。。。而且两个按钮切换的时候,按钮中间会有一条背景色。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-10 16:03:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:用的什么,F407吗,F407的话,刷图片不行的,太慢了。

使用F429是正途,将图片绘制到SDRAM,然后用SDRAM刷,速度极快,可以看我们发布的F429综合Demo效果演示。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17330 (2017-05-03 14:27) 
而且这段时间一直看你们的教程,真心觉得你们的教程做的很好,比较心塞的是公司给配的是秉火的开发板。相比之下,秉火的教程跟官网活性真是太差,我看好多网友问了以后直接就没人回复。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2017-5-11 01:24:10 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:我用的是F429,但是用的是秉火的开发板,底层做的太差劲了,官方demo跑出来最高只有5000w,看了好多遍你们的教程不知道怎么去优化好。刷图的问题至今没解决。。。而且两个按钮切换的时候,按钮中间会有一条背景色。 (2017-05-10 15:56)
如果是16位SDRAM的话,跑分差不多就是那样,优化下可以弄到8000万。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-11 08:43:01 | 显示全部楼层

回 byccc 的帖子

byccc:如果是16位SDRAM的话,跑分差不多就是那样,优化下可以弄到8000万。
 (2017-05-11 01:24) 
16位的话,显示上面也不会出现“拉窗帘”现象啊。我的现象明显不正常- -   也不知道怎么回事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-11 10:30:42 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:16位的话,显示上面也不会出现“拉窗帘”现象啊。我的现象明显不正常- -   也不知道怎么回事 (2017-05-11 08:43) 
那可以考虑参考我们教程的移植部分,重新设计下底层。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-15 20:36:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:那可以考虑参考我们教程的移植部分,重新设计下底层。 (2017-05-11 10:30) 
硬汉哥,你好呀!我现在改成读取sd卡中的图片再绘制到存储器中显示的方法。但是在“hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);”时,函数返回值不是0,但是但不运行后,也就是到“GUI_MEMDEV_Select(hMemBMP);”时,hMenBMP的值却是0,这是为什么呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-16 02:27:40 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:硬汉哥,你好呀!我现在改成读取sd卡中的图片再绘制到存储器中显示的方法。但是在“hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);”时,函数返回值不是0,但是但不运行后,也就是到“GUI_MEMDEV_Select(hMemBMP);”时,hMenBMP的值却是0,这是为什么 .. (2017-05-15 20:36) 
实际操作正确不,能否正常显示。另外你简单发下你的代码截图,我看下。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-16 08:41:23 | 显示全部楼层

回 eric2013 的帖子

eric2013:实际操作正确不,能否正常显示。另外你简单发下你的代码截图,我看下。 (2017-05-16 02:27) 
不使用内存绘制的时候是对的哦,已经可以正常读取sd卡中的图片并显示了。但是通过将bmp图片读取到sdram里面绘制,再通过调用内存绘制函数绘制,就不对了呢,问题就是上面那个,函数返回不是0,但是发现句柄在debug的时候总为0。代码我贴在在下面哦。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-16 08:43:41 | 显示全部楼层
  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名:    _ShowBMP
  4. * 功能说明:    显示 BMP 图片
  5. * 形 参:   sFilename 要读取的文件名
  6. *             x      要显示的 x 轴坐标位置
  7. *             y      要显示的 y 轴坐标位置
  8. * 返 回 值:    返回绘制了 BMP 图片的内存设备句柄。
  9. *********************************************************************************************************
  10. */
  11. GUI_HMEM _ShowBMP(const char * sFilename, int x, int y)
  12. {
  13.     GUI_HMEM hMem;
  14.     char *_acBuffer;
  15.     UINT bw;
  16.     int XSize, YSize;
  17.     GUI_MEMDEV_Handle hMemBMP;
  18.    
  19.     /* 打开文件 */
  20.     result = f_open(&file, sFilename, FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS);
  21.     if (result != FR_OK)
  22.     {
  23.         printf("\\n文件打开失败!\\n");
  24.         return 0;
  25.     }
  26.    
  27.     /* 申请一块内存空间 并且将其清零 */
  28.     hMem = GUI_ALLOC_AllocZero(file.fsize);
  29.     /* 将申请到内存的句柄转换成指针类型 */
  30.     _acBuffer = GUI_ALLOC_h2p(hMem);
  31.    
  32.     result = f_read(&file, _acBuffer, file.fsize, &bw);
  33.       if (result != FR_OK)
  34.       {
  35.         printf("\\n图片读取失败!\\n");
  36.         return 0;
  37.       }
  38.    
  39.     XSize = GUI_BMP_GetXSize(_acBuffer);
  40.     YSize = GUI_BMP_GetYSize(_acBuffer);
  41.    
  42.     /*
  43.     **    创建内存设备,并将 BMP 图片绘制到此内存设备里面,此内存设备要在主程序中用到
  44.     **    所以退出此函数前,不要释放。
  45.     */
  46. //就是这句出错了!!函数返回不是0,句柄一直是0。
  47. hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
  48.     GUI_MEMDEV_Select(hMemBMP);
  49.     GUI_BMP_Draw(_acBuffer, 0, 0);
  50.     GUI_MEMDEV_Select(0);
  51.    
  52.     GUI_ALLOC_Free(hMem);
  53.     f_close(&file);
  54.    
  55.     return hMemBMP;
  56. }
  57. void drawBMP(void)
  58. {
  59.     GUI_MEMDEV_Handle hMemBMP;
  60. //    uint32_t t0, t1, i, count = 0;
  61. //    char buf[50];
  62. //    printf("正在加载BMP图片到内存....\\r\\n");
  63. //    /* 加载 BMP 图片到内存设备 */
  64. //    hMemBMP = _ShowBMP("0:/2.bmp", 0, 0);
  65. //    /*刷新 20 次,串口打印速度数值,时间单位 ms */
  66. //    for(i = 0; i < 20; i++)
  67. //    {
  68. //    t0 = GUI_GetTime();
  69. //    /* 用到 BMP 图片的时候,调用此函数即可 */
  70. //    GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
  71. //    t1 = GUI_GetTime() - t0;
  72. //    printf("速度 = %dms\\r\\n", t1);
  73. //    count += t1;
  74. //    }
  75. //    /* 求出刷新 20 次的平均速度 */
  76. //    sprintf(buf, "speed = %dms/frame", count/i);
  77. //    GUI_DispStringAt(buf, 10, 10);
  78.    
  79.     GUI_SetBkColor(GUI_WHITE);
  80.     GUI_Clear();
  81.     hMemBMP = _ShowBMP("0:/sunset.bmp", 0, 0);
  82.     GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
  83.     printf("\\n显示SD卡图片!\\n");
  84.     GUI_Delay(100);
  85. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-16 10:38:38 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:/*
*********************************************************************************************************
* 函 数 名:    _ShowBMP
* 功能说明:    显示 BMP 图片
* 形 参:   sFilename 要读取的文件名
....... (2017-05-16 08:43) 
按说没问题啊,你的GUIConf.c文件是用的SDRAM做emWin动态内存吧。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-16 11:07:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:按说没问题啊,你的GUIConf.c文件是用的SDRAM做emWin动态内存吧。 (2017-05-16 10:38) 
是的,就是用的SDRAM做的动态内存呢。而且现在发现不仅仅是bmp图片的绘制出问题,连jpg绘制也有问题。按照“已经加载到存储器的图片绘制法”,两个都无法正常显示,我现在正在调试jpg显示,感觉应该也是同样的问题呢。还有哦,教程里面有一点小错误,“emwin教程->第452页->第三步->hMemBMP = _ShowJPEG2("1.bmp", 0, 0);”,hMemBMP应是hMemJPEG。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-16 11:26:39 | 显示全部楼层

回 eric2013 的帖子

eric2013:按说没问题啊,你的GUIConf.c文件是用的SDRAM做emWin动态内存吧。 (2017-05-16 10:38) 
硬汉哥,JPEG已经可以显示了,但还有点问题呢。首先就是,我用例程中提供的绘制函数“GUI_JPEG_Draw(_acBuffer, file.fsize, x, y);”时(并且在之前我自己的绘制函数中也是这种情况),无法显示图片直接就是黑色的背景色。但是我将此绘制函数改成“GUI_JPEG_DrawScaled(_acBuffer, file.fsize, x, y, 1, 1);”就显示了,是不是我液晶是5寸屏的原因呢?还有就是,我用内存绘制法绘制的图片,一开始屏幕会闪一下,接着就是黑屏一段时间,最后才显示,这段时间大概是1s及以上,算不算正常呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-17 11:26:50 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:硬汉哥,JPEG已经可以显示了,但还有点问题呢。首先就是,我用例程中提供的绘制函数“GUI_JPEG_Draw(_acBuffer, file.fsize, x, y);”时(并且在之前我自己的绘制函数中也是这种情况),无法显示图片直接就是黑色的背景色。但是我将此绘制函数改成“GUI_JPEG_DrawScaled(_acBuffe .. (2017-05-16 11:26) 
不应该啊,GUI_JPEG_Draw和GUI_JPEG_DrawScaled应该都是没问题的。解码的时候稍等会是正常的。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-17 13:35:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:不应该啊,GUI_JPEG_Draw和GUI_JPEG_DrawScaled应该都是没问题的。解码的时候稍等会是正常的。 (2017-05-17 11:26) 
5月17日:现在这两个函数的问题还是没有解决,由于emwin封装了函数“GUI_MEMDEV_CreateEx”,所以不知道内部怎么在处理的,可能是将sd卡的图片进行解码也可能是别的。另外现在发现另外的问题,就是在button按钮处理上。我通过button来改变背景图片时发现只能改变一次背景呢。就是说,我一开始程序初始化成功后,是背景1;按钮第一次按下后,屏幕背景刷成背景2;按钮第二次按下(第n次按下后),背景图片直接消失,显示的就是窗口背景色——白色(然而按照我的意思应该是重新刷回背景1)。通过debug发现问题还是出在函数“GUI_MEMDEV_CreateEx”上面。他在我图片读取正常的情况下(结构体“GUI_JPEG_INFO”已经成功接收到“XSize、YSize”的值,由于两张图大小不一样可以很明显看到变化)依旧返回了0,导致我的句柄“hMemJPEG”变成0。最终就是啥也没显示。硬汉哥,您看这是什么个情况撒?
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-17 13:52:04 | 显示全部楼层

回 eric2013 的帖子

eric2013:不应该啊,GUI_JPEG_Draw和GUI_JPEG_DrawScaled应该都是没问题的。解码的时候稍等会是正常的。 (2017-05-17 11:26) 
硬汉哥,问题已经解决了!通过google搜索“the function of GUI_MEMDEV_Create”,发现国外也有人出现这种情况,ST的工程师直接回复的,网站是:
http://forum.segger.com/index.ph ... p;amp;threadID=2417
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-17 14:22:43 | 显示全部楼层

回 eric2013 的帖子

eric2013:不应该啊,GUI_JPEG_Draw和GUI_JPEG_DrawScaled应该都是没问题的。解码的时候稍等会是正常的。 (2017-05-17 11:26) 
另外还有一点哦,例程是有问题的,没有加上GUI_MEMDEV_Delete()的后果是如果我刷新多张图片,就会导致内存的占用不断加大,最后直接就无法显示了。所以这就是我为什么前面只能变一次背景图片,但不能变第二次,因为内存创建后并没有释放。所以您看源代码是不是需要改进呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2017-5-18 02:20:45 | 显示全部楼层

回 笔记本的自嘲 的帖子

笔记本的自嘲:另外还有一点哦,例程是有问题的,没有加上GUI_MEMDEV_Delete()的后果是如果我刷新多张图片,就会导致内存的占用不断加大,最后直接就无法显示了。所以这就是我为什么前面只能变一次背景图片,但不能变第二次,因为内存创建后并没有释放。所以您看源代码是不是需要改进呢? (2017-05-17 14:22) 
可以,你根据你的实际项目做修正就行。
回复

使用道具 举报

11

主题

104

回帖

137

积分

初级会员

积分
137
 楼主| 发表于 2017-5-25 09:17:18 | 显示全部楼层

回 eric2013 的帖子

eric2013:可以,你根据你的实际项目做修正就行。 (2017-05-18 02:20) 
硬汉哥,现在发现一个问题。就是我给emwin配的动态内存大小是2MB的,但是加载不了两张图片。就是说,我在程序初始化的时候就预加载了两幅图片进内存设备中,在需要使用的时候调用内存绘制函数进行绘制,但是现在发现的问题就是两张800*480的图片无法加载进去。根据之前我回复您的,调试后发现句柄返回0,应是内存不够用,但是按照例程的计算法,两张图片应该只占用内存97*2==194KB,只占用了9.7%。虽然我在程序中没有释放RAM,但应该也不会出现这种情况呀。或者说,如果要播放小动画的话,应该怎么去解决呢?之前我想将图片加载进SPIFLASH,再用内存设备绘制,但我后来发现这可能不行,因为例程中的内存设备本质上是SDRAM,两个不是一个概念。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

[url=http://www.yunzh

积分
0
发表于 2017-10-17 10:28:07 | 显示全部楼层
[s:151] [s:151] [s:151] [s:151]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 03:17 , Processed in 0.577087 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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