硬汉嵌入式论坛

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

[emWin] STemWin5.32 Graph控件刷新时GUI_Exec耗时很长怎么解决

[复制链接]

3

主题

18

回帖

27

积分

新手上路

积分
27
发表于 2024-11-20 08:34:09 | 显示全部楼层 |阅读模式
使用的是STemWin5.32,Graph控件大小为400*400,使用的是GRAPH_DATA_XY_AddPoint添加数据,一共显示3条曲线。如果以100ms为周期执行下面的代码,然后使用GUI_Exec函数,发现GUI_Exec函数耗时100~200ms,会造成界面上Edit控件中的数据变化出现明显卡顿。如果是以大于4s为周期执行下面代码,卡顿感会减少。有什么办法解决吗?求助各位大佬!
往Graph控件添加数据代码如下:

  if(sys_timer_getstamp_between(update_timestamp) < 100000)      //100ms刷新
  {
    return;
  }
  update_timestamp = sys_timer_Getstamp();
  for(i = 0; i < 3; i++)
  {
    while(graph_data[i].rditem != graph_data[i].writem)
    {
      s_graph.point.y = (I16)((graph_data[i].vdata[graph_data[i].rditem] + s_graph.y_offset[i]) / s_graph.y_factor[i]);
      if(s_graph.point_x[i] <= GRAPH_X_PIXEL_MAX)
      {
        s_graph.point.x = s_graph.point_x[i];
        s_graph.point_x[i] = (s_graph.point_x[i] + s_graph.x_rep_cnt);
        GRAPH_DATA_XY_AddPoint(pdataGRP[i], &s_graph.point);
      }
      else
      {
        s_graph.x_off[i] = s_graph.x_off[i] - s_graph.x_rep_cnt;
        s_graph.point.x = GRAPH_X_PIXEL_MAX - s_graph.x_off[i];  //GRAPH_X_PIXEL_MAX为400

        GRAPH_DATA_XY_SetOffX(pdataGRP[i], s_graph.x_off[i]);
        GRAPH_DATA_XY_AddPoint(pdataGRP[i], &s_graph.point);

      }
      graph_data[i].rditem = (graph_data[i].rditem + 1) % GRAPH_DATA_SIZE;
    }
  }


回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-20 08:39:49 | 显示全部楼层
开发环境是裸机环境
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-20 09:55:42 | 显示全部楼层
使用做个快速刷新方案,至少界面不会有卡顿感。

Graph控件快速刷新波形的方法
https://www.armbbs.cn/forum.php?mod=viewthread&tid=24997
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-20 11:05:33 | 显示全部楼层
eric2013 发表于 2024-11-20 09:55
使用做个快速刷新方案,至少界面不会有卡顿感。

Graph控件快速刷新波形的方法

感谢硬汉哥,这个方案我看过,我不太想一次性显示200个点,可以一次性显示十几二十个点吗?而且为什么GRAPH控件添加数据后,使用GUI_Exec函数这么耗时。我测试过一次性刷新一个点和几十个点效果差不多,感觉只是跟刷新时间间隔有关
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-21 10:26:38 | 显示全部楼层
Hejack 发表于 2024-11-20 11:05
感谢硬汉哥,这个方案我看过,我不太想一次性显示200个点,可以一次性显示十几二十个点吗?而且为什么GRA ...

如果是这种用法的话,这个控件就是这样了,这个控件还是比较吃性能的。
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-22 08:23:04 | 显示全部楼层
eric2013 发表于 2024-11-21 10:26
如果是这种用法的话,这个控件就是这样了,这个控件还是比较吃性能的。

感谢硬汉哥
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-23 12:04:23 | 显示全部楼层
eric2013 发表于 2024-11-21 10:26
如果是这种用法的话,这个控件就是这样了,这个控件还是比较吃性能的。

硬汉哥,这个控件这么吃性能的话,除了一次性显示200个点的方案,还有什么好的办法可以优化?可以通过增大emWin内存或者用多重缓存优化吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-24 10:46:52 | 显示全部楼层
Hejack 发表于 2024-11-23 12:04
硬汉哥,这个控件这么吃性能的话,除了一次性显示200个点的方案,还有什么好的办法可以优化?可以通过增 ...

加大emWin动态内存会好点,另外就行减小Graph控件的显示区。

当然,也可以自己绘制。
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-25 10:12:12 | 显示全部楼层
eric2013 发表于 2024-11-24 10:46
加大emWin动态内存会好点,另外就行减小Graph控件的显示区。

当然,也可以自己绘制。

硬汉哥,emWin的已经给到6M了。我参考了二代示波器的例程,也是用的GUI_MEMDEV_Draw,然后自己绘制。我用这个方法,曲线显示200个点,耗时110ms左右。这个时间跟二代示波器比是正常的吗?
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-25 10:32:17 | 显示全部楼层
eric2013 发表于 2024-11-24 10:46
加大emWin动态内存会好点,另外就行减小Graph控件的显示区。

当然,也可以自己绘制。

二代示波器的例程里面使用的是GUI_MEMDEV_Draw,最后一个参数传的是GUI_MEMDEV_NOTRANS。文档里说这样会更快,但是我测的耗时反而更长,而且会出现花屏的情况,是不是因为我这块区域还有一个更大的背景图片以及在这块区域之上还显示文本导致的?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2024-11-25 11:50:49 | 显示全部楼层
Hejack 发表于 2024-11-25 10:32
二代示波器的例程里面使用的是GUI_MEMDEV_Draw,最后一个参数传的是GUI_MEMDEV_NOTRANS。文档里说这样会 ...

估计你的驱动方式不同,我的那个是三缓冲方式。
回复

使用道具 举报

3

主题

18

回帖

27

积分

新手上路

积分
27
 楼主| 发表于 2024-11-25 11:58:10 | 显示全部楼层
eric2013 发表于 2024-11-25 11:50
估计你的驱动方式不同,我的那个是三缓冲方式。

噢噢 我的是开了虚拟屏幕,单缓冲
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 00:25 , Processed in 0.305172 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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